Приложение приостановлено при вызове метода GeneXus.SD.Media.Camera.TakePhoto() с использованием GX16 U7 SD IOS Generator

На устройствах с iOS 13 при вызове метода GeneXus.SD.Media.Camera.TakePhoto() в первый раз требуется от 10 до 15 секунд для продолжения выполнения программы.

Выполнение любой другой опции или кнопки приостанавливается до тех пор, пока не будет показано управление камерой, в противном случае приложение перестанет работать.

Примечание. Такое поведение происходит только при первом вызове метода GeneXus.SD.Media.Camera.TakePhoto().

Очевидная проблема заключается в том, что Genexus вызывает поток в фоновом режиме без использования следующего оператора:

DispatchQueue.main.async {
//Do UI Code here. 
//Call Google maps methods.}

Журнал, который показывает приложение, когда оно ожидает показать управление камерой, выглядит следующим образом:

Вход в XCODE 11.3

Main Thread Checker: UI API called on a background thread: -[UIApplication userInterfaceLayoutDirection]

PID: 268, TID: 5281, Thread name: (none), Queue name: com.apple.camera.zoom-dial-image-generation, QoS: 21

Backtrace:
4  GXUIApplication           0x000000010c674170 $s15GXUIApplicationAAC28userInterfaceLayoutDirectionSo06UIUsercdE0VvgTo + 212

5  UIKitCore              0x000000019fea34fc AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 15566076

6  UIKitCore              0x000000019f6bdc8c AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 7285900

7  UIKitCore              0x000000019f6bda18 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 7285272

8  UIKitCore              0x000000019f64a848 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 6813768

9  CameraUI              0x00000001bdfee5a8 91E5E69E-0F28-35E3-86F9-7AA8B1D7F726 + 1369512

10 UIKitCore              0x000000019f63ee94 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 6766228

11 UIKitCore              0x000000019f63ecb0 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 6765744

12 UIKitCore              0x000000019f63c464 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 6755428

13 CameraUI              0x00000001bdfee2c0 91E5E69E-0F28-35E3-86F9-7AA8B1D7F726 + 1368768

14 CameraUI              0x00000001bdfed65c 91E5E69E-0F28-35E3-86F9-7AA8B1D7F726 + 1365596

15 AssetsLibraryServices        0x00000001b0462d3c 31232DEC-0B77-3A8B-B80A-A51A16204F8E + 228668

16 libdispatch.dylib          0x000000010d091e1c _dispatch_call_block_and_release + 32

17 libdispatch.dylib          0x000000010d09327c _dispatch_client_callout + 20

18 libdispatch.dylib          0x000000010d09a90c _dispatch_lane_serial_drain + 720

19 libdispatch.dylib          0x000000010d09b4fc _dispatch_lane_invoke + 408

20 libdispatch.dylib          0x000000010d0a64dc _dispatch_workloop_worker_thread + 1344

21 libsystem_pthread.dylib       0x000000019b62b6d0 _pthread_wqthread + 280

22 libsystem_pthread.dylib       0x000000019b6319e8 start_wqthread + 8

2020-02-03 16:52:16.618996-0500 Routik[268:5281] [reports] Main Thread Checker: UI API called on a background thread: -[UIApplication userInterfaceLayoutDirection]

PID: 268, TID: 5281, Thread name: (none), Queue name: com.apple.camera.zoom-dial-image-generation, QoS: 21

Backtrace:
4  GXUIApplication           0x000000010c674170 $s15GXUIApplicationAAC28userInterfaceLayoutDirectionSo06UIUsercdE0VvgTo + 212

5  UIKitCore              0x000000019fea34fc AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 15566076

6  UIKitCore              0x000000019f6bdc8c AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 7285900

7  UIKitCore              0x000000019f6bda18 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 7285272

8  UIKitCore              0x000000019f64a848 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 6813768

9  CameraUI              0x00000001bdfee5a8 91E5E69E-0F28-35E3-86F9-7AA8B1D7F726 + 1369512

10 UIKitCore              0x000000019f63ee94 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 6766228

11 UIKitCore              0x000000019f63ecb0 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 6765744

12 UIKitCore              0x000000019f63c464 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 6755428

13 CameraUI              0x00000001bdfee2c0 91E5E69E-0F28-35E3-86F9-7AA8B1D7F726 + 1368768

14 CameraUI              0x00000001bdfed65c 91E5E69E-0F28-35E3-86F9-7AA8B1D7F726 + 1365596

15 AssetsLibraryServices        0x00000001b0462d3c 31232DEC-0B77-3A8B-B80A-A51A16204F8E + 228668

16 libdispatch.dylib          0x000000010d091e1c _dispatch_call_block_and_release + 32

17 libdispatch.dylib          0x000000010d09327c _dispatch_client_callout + 20

18 libdispatch.dylib          0x000000010d09a90c _dispatch_lane_serial_drain + 720

19 libdispatch.dylib          0x000000010d09b4fc _dispatch_lane_invoke + 408

20 libdispatch.dylib          0x000000010d0a64dc _dispatch_workloop_worker_thread + 1344

21 libsystem_pthread.dylib       0x000000019b62b6d0 _pthread_wqthread + 280

22 libsystem_pthread.dylib       0x000000019b6319e8 start_wqthread + 8

2020-02-03 16:52:26.217529-0500 Routik[268:5081] [Common] _BSMachError: port fe03; (os/kern) invalid capability (0x14) "Unable to insert COPY_SEND"

person Rogelio Arosemena    schedule 03.02.2020    source источник


Ответы (1)


На самом деле, это ложное срабатывание инструмента Apple Main Thread Checker. Позволь мне объяснить:

Main Thread Checker работает при запуске приложения, динамически заменяет реализации методов, которые должны вызываться в основном потоке с версией, которая предшествует проверке. Методы, о которых известно, что они безопасны для использования в фоновых потоках, исключаются из этой проверки.

Метод, вызываемый из фонового потока, — [UIApplication userInterfaceLayoutDirection]. Приложения GeneXus используют подкласс UIApplication (GXUIApplication), который переопределяет этот метод (userInterfaceLayoutDirection) для поддержки Функция SetLanguage для языков справа налево на устройствах, сконфигурированных слева направо во время выполнения (или наоборот). Внутри этого переопределения вызывается [super userInterfaceLayoutDirection], и именно здесь Main Thread Checker выдает предупреждение.

Этот метод вызывается в фоновом режиме внутри реализации фреймворков Apple, как вы можете видеть в опубликованной вами Backtrace, все, кроме метода GXUIApplication userInterfaceLayoutDirection, не является кодом GeneXus.

Проблема заключается в том, что Main Thread Checker выдает предупреждение о вызове [UIApplication userInterfaceLayoutDirection] только тогда, когда вызов является явным, и игнорируется, когда он вызывается внутри из другой платформы Apple. В этом случае он считается явным, потому что метод перезаписывается в подклассе, даже если он вызывается внутри из другой платформы Apple.

Проверить это можно, заменив в исходном файле main.m, в строке:

return UIApplicationMain(argc, argv, NSStringFromClass([GXUIApplication class]), NSStringFromClass([GXAppDelegate class]));

с:

return UIApplicationMain(argc, argv, NSStringFromClass([UIApplication class]), NSStringFromClass([GXAppDelegate class]));

С этим изменением (без использования подкласса с переопределением) средство проверки основного потока не будет выдавать предупреждение, даже если тот же метод по-прежнему вызывается внутри из фонового потока.

Мы будем искать обходной путь для этой проблемы с проверкой основного потока в предстоящих обновлениях GeneXus (спасибо за отчет), а также уведомим Apple о проблеме с проверкой основного потока. Тем временем вы можете отключить Main Thread Checker из Xcode:

Продукт -> Схема -> Редактировать схему...

Выполнить -> Диагностика -> Проверка основного потока

Кроме того, вам не нужно беспокоиться о том, что это проблема для ваших пользователей, поскольку средство проверки основного потока активно только тогда, когда приложение запускается из Xcode (с включенной диагностикой средства проверки основного потока).

person Fabian Inthamoussu    schedule 11.02.2020
comment
Идентификатор отзыва, отправленный в Apple: FB7573340 - person Fabian Inthamoussu; 11.02.2020