由于缺少 NSPhotoLibraryAddUsageDescription 而报告应用程序崩溃,但我的应用程序从不使用任何照片

app crashes reported due to missing NSPhotoLibraryAddUsageDescription, but my app never uses any photos

我看到一些崩溃报告说

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY

Termination Reason: TCC, This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value explaining to the user how the app uses this data.

一切都非常有趣,尤其是因为 我的应用程序永远不会出于任何原因靠近照片库。那么这里到底发生了什么,TCC 到底是什么?

我非常愿意添加此密钥,但我无法解释为什么需要它,所以我无法提供任何有意义的文本!

问题仅在 iOS 12.1 中出现,尽管这可能不是有意义的数据,因为您无法证明是否定的。我当然怀疑 iOS 错误,并且会报告这个,但我很好奇是否有其他人看到过这种奇怪的现象。

这里还有一些典型的崩溃报告:

Triggered by Thread: 3

[跳过线程 0 和 1]

Thread 2 name:
Thread 2:
0   libsystem_kernel.dylib          0x000000019ffe3f0c semaphore_wait_trap + 8
1   libdispatch.dylib               0x000000019fe32f8c _dispatch_sema4_wait$VARIANT$mp + 24 (lock.c:134)
2   libdispatch.dylib               0x000000019fe33a10 _dispatch_semaphore_wait_slow + 136 (semaphore.c:132)
3   AssetsLibraryServices           0x00000001ade2d140 __79-[PLPrivacy _isPhotosAccessAllowedWithScope:forceHandler:accessAllowedHandler:]_block_invoke_2 + 412 (PLPrivacy.m:183)
4   AssetsLibraryServices           0x00000001ade138b4 __pl_dispatch_async_block_invoke + 36 (PLDispatchHelpers.m:23)
[skipping the rest]

Thread 3 Crashed:
0   libsystem_kernel.dylib          0x000000019ffeddf8 __abort_with_payload + 8
1   libsystem_kernel.dylib          0x000000019ffe7838 abort_with_payload_wrapper_internal + 100 (terminate_with_reason.c:71)
2   libsystem_kernel.dylib          0x000000019ffe7868 abort_with_payload + 12 (terminate_with_reason.c:93)
3   TCC                             0x00000001a32aea70 __CRASHING_DUE_TO_PRIVACY_VIOLATION__ + 204 (TCC.c:372)
4   TCC                             0x00000001a32ae9a4 __TCCAccessRequest_block_invoke.77 + 708 (TCC.c:508)
5   TCC                             0x00000001a32b2a90 __tccd_send_message_block_invoke + 276 (TCC.c:220)
[skipping the rest]

我能够重现崩溃!事情是这样的:我的应用程序包含一个网络视图。如果用户在该 Web 视图中按下图像,则会出现“保存”菜单项。如果用户点击保存,我们需要权限;如果 Info.plist 中没有隐私字符串,我们会在那一刻崩溃(如果有,我们会得到授权对话框)。

在我看来,这是一个 iOS 错误。我从来没有打算让用户这样做;这只是网络视图的一个功能。因此,从 Web 视图保存到照片库的操作实际上是在进程外的;是 user 在做这件事,而不是我的应用程序。并且用户不需要许可;是用户点击了图像,然后点击了“保存”按钮。如果用户不进行多次有意的操作,这种情况就不可能发生,其中 none 直接涉及我的应用程序。我会向 Apple 报告此事。