0

在装有 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"
4

1 回答 1

1

实际上,这是 Apple 的 Main Thread Checker 工具中的误报。让我解释:

主线程检查器在应用程序启动时工作,用预先检查的版本动态替换应该只在主线程上调用的方法的实现。已知可安全用于后台线程的方法被排除在此检查之外。

从后台线程调用的方法是-[UIApplication userInterfaceLayoutDirection]。GeneXus 应用程序使用 UIApplication (GXUIApplication) 的子类,它覆盖此方法 (userInterfaceLayoutDirection),以便在运行时(或相反)支持从左到右配置的设备上从右到左语言的SetLanguage 功能。在这个覆盖中,[super userInterfaceLayoutDirection] 被调用,这是主线程检查器发出警告的地方。

正如您在发布的 Backtrace 中所见,此方法在 Apple 的框架实现内部在后台调用,除了 GXUIApplication userInterfaceLayoutDirection 方法本身之外的所有内容都不是 GeneXus 代码。

问题是主线程检查器仅在显式调用时才会引发 [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。同时,您可以从 Xcode 禁用主线程检查器:

产品 -> 方案 -> 编辑方案...

运行 -> 诊断 -> 主线程检查器

此外,您不必担心这对您的用户来说是个问题,因为主线程检查器仅在从 Xcode 启动应用程序时才处于活动状态(启用主线程检查器诊断)。

于 2020-02-11T09:43:24.060 回答