Приложение приостанавливается при вызове метода GeneXus.SD.Media.Camera.TakePhoto () с использованием генератора GX16 U7 SD IOS - PullRequest
0 голосов
/ 04 февраля 2020

На устройствах с 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"

1 Ответ

1 голос
/ 11 февраля 2020

На самом деле, это ложный положительный результат в инструменте проверки основных нитей Apple. Позвольте мне объяснить:

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

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

Этот метод вызывается внутренне в фоновом режиме из реализаций фреймворков Apple, как вы можете видеть в опубликованной вами Backtrace, все, кроме самого метода userInterfaceLayoutDirection GXUIApplication, не является кодом 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]));

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

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

image Scheme -> Edit Scheme...">

image Diagnostics -> Main Thread Checker">

Также вы не беспокойтесь о том, что это является проблемой для ваших пользователей, так как Main Thread Checker активен только тогда, когда приложение запускается из XCode (с включенной диагностикой Main Thread Checker c).

...