我看到一些崩溃报告说
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Run Code Online (Sandbox Code Playgroud)
终止原因:TCC,此应用程序已崩溃,因为它试图在没有使用说明的情况下访问隐私敏感数据。应用程序的 Info.plist 必须包含一个 NSPhotoLibraryAddUsageDescription 键和一个字符串值,向用户解释应用程序如何使用这些数据。
一切都非常有趣,尤其是因为我的应用程序永远不会出于任何原因靠近照片库。那么这里到底发生了什么,TCC 到底是什么?
我非常愿意添加此密钥,但我无法解释为什么需要它,因此我无法提供任何有意义的文本!
问题仅在 iOS 12.1 中出现,尽管这可能不是有意义的数据,因为您无法证明是否定的。我当然怀疑是 iOS 错误,并且会报告这个问题,但我很好奇是否有人看到过这种奇怪的现象。
这是一个典型的崩溃报告:
线程触发: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]
Run Code Online (Sandbox Code Playgroud)
我能够重现崩溃!这是交易:我的应用程序包含一个网络视图。如果用户按下该 Web 视图中的图像,则会出现“保存”菜单项。如果用户点击保存,我们需要权限;如果Info.plist 中没有隐私字符串,我们会在那一刻崩溃(如果有,我们会得到授权对话框)。
在我看来,这是一个 iOS 错误。我从来没有打算让用户这样做;这只是网络视图的一个功能。因此,从 Web 视图保存到照片库的操作实际上已停止;是用户在做这件事,而不是我的应用程序。并且用户应该不需要权限;是用户点击了图像,然后点击了“保存”按钮。如果没有用户进行多次故意移动,这种情况就不可能发生,其中没有一个直接涉及我的应用程序。我会向苹果报告此事。