在Crashlytics中,我可以看到iOS 10用户经常遇到这种崩溃。然而,当我使用iPhone 7/10.2在模拟器中测试时,我无法重现崩溃。在我的plist中,我已经有了字符串
NS日历使用说明、NS麦克风使用说明和NSP照片库使用说明。
下面是来自Crashlytics的堆栈跟踪:
Crashed: com.apple.root.default-qos
0 libsystem_kernel.dylib 0x183765d74 __abort_with_payload + 8
1 libsystem_kernel.dylib 0x18376249c <redacted> + 100
2 libsystem_kernel.dylib 0x1837624c8 abort_with_payload + 10
3 TCC 0x1869d6328 __TCCAccessRequest_block_invoke_2.80 + 258
4 TCC 0x1869d6224 __CRASHING_DUE_TO_PRIVACY_VIOLATION__ + 702
5 TCC 0x1869d9330 __tccd_send_block_invoke + 348
6 libxpc.dylib 0x18386afcc _xpc_connection_reply_callout + 80
7 libxpc.dylib 0x18386af3c _xpc_connection_call_reply + 40
8 libdispatch.dylib 0x1836221bc _dispatch_client_callout + 16
9 libdispatch.dylib 0x183630a4c _dispatch_queue_override_invoke + 732
10 libdispatch.dylib 0x18363234c _dispatch_root_queue_drain + 572
11 libdispatch.dylib 0x1836320ac _dispatch_worker_thread3 + 124
12 libsystem_pthread.dylib 0x18382b2a0 _pthread_wqthread + 1288
13 libsystem_pthread.dylib 0x18382ad8c start_wqthread + 4
如何重现或修复这个问题?我确实允许用户访问联系人,但当我在模拟器中测试该功能时,没有提示我输入任何权限。然而,当用户从我的应用访问相机时,模拟器确实提示我输入权限。这让我认为访问联系人不需要字符串。
8条答案
按热度按时间a6b3iqyw1#
如果你在iPhone X上看到这些崩溃,而你使用的是Touch ID/Face ID,原因可能是你的Info. plist中缺少
NSFaceIDUsageDescription
密钥。这个密钥是在iOS 11中添加的,看起来在iOS 11.3之后可能成为强制性的,因为我在iOS 11.3发布之后看到iPhone X上崩溃的高峰。苹果here对此有模糊的记录:NSFaceIDUsageDescription(字符串- iOS)。此键可让您描述应用使用面孔ID的原因。
重要提示:为了保护用户隐私,在iOS 11或之后版本上链接并且在硬件支持的情况下访问面容ID的iOS应用必须静态声明访问意图。请在应用的Info.plist文件中包含NSFaceIDUsageDescription项,并为此项提供目的字符串。如果应用尝试访问面容ID而没有相应的目的字符串,则应用可能会退出。
iOS 11及更高版本支持此密钥。
有趣的是,我无法在我的开发iPhone X上重现iOS 11.3的崩溃,也许它在调试或TestFlight构建版本中的表现不同。如果我们相信苹果的文档,在应用中使用Face ID时,仍然值得添加密钥。
zwghvu4y2#
我不得不在plist中为
NSCameraUsageDescription
添加一个字符串,因为允许用户拍照。ia2d9nvy3#
让我们了解两件事。
在plist文件中有这么多的隐私密钥,例如相机使用,联系人使用位置使用,面部ID使用等...如果你错过了任何键,并试图使用这些功能,你会得到一个崩溃,所以使用键和描述,以避免崩溃。
第二件事是,特别是对于NSPhotoLibraryUsageDescription,如果您在iOS 6以上版本和iOS 11.3以下版本中使用此密钥,则不会出现任何崩溃,但在iOS 11.3及更高版本之后,您需要再添加一个密钥,即NSPhotoLibraryAddUsageDescription。
同时,如果您的应用是iOS 8或9或更高版本至最新iOS 11.3及更高版本,您可以使用这两个键。
Reference for all the keys
swvgeqrz4#
__CRASHING_DUE_TO_PRIVACY_VIOLATION__
崩溃发生在应用的plist上缺少强制权限字符串的时候。苹果有时会在新的iOS版本中更改权限级别。因此,在iOS更新对plist有新要求时,正常运行的代码将开始崩溃。您应评估此处所有答案中列出的哪些权限可能会影响您(
NSFaceIDUsageDescription
、NSCameraUsageDescription
、NSPhotoLibraryAddUsageDescription
、其他?),因为您可能不会在应用中使用其中的任何功能。在我的例子中,我们支持蓝牙BLE设备,从iOS13开始,需要一个新的强制权限:**
NSBluetoothAlwaysUsageDescription
**所以我在我的列表中添加了:这就解决了问题。
balp4ylt5#
我在运行iOS 14的iPhone X上也遇到了同样的问题。在我的Info.Plist文件中添加NSPhotoLibraryAddUsageDescription解决了这个问题。
根据本论坛:https://forums.developer.apple.com/thread/100732
h9vpoimq6#
案例1
当我尝试使用
UIDocumentPickerViewController
读取文件而没有首先在返回的URL
上调用startAccessingSecurityScopedResource()
时,我得到了相同的崩溃报告。案例二
下面是另一种可能的(极端)情况:
如果您使用
EKEventEditViewController
向用户的日历添加事件,则info.plist中的NSCalendarsUsageDescription
键可能不够!如果用户尝试向事件添加被邀请者,则还需要
NSContactsUsageDescription
密钥。否则,当用户尝试搜索其联系人时,将发生隐私侵犯,应用程序将崩溃。rryofs0p7#
您必须向用户授予权限才能访问通讯簿。
iOS 9.0及更高版本有更新:
来自Apple网站:
重要事项iOS 9中已弃用“通讯簿UI”框架。请改用ContactsUI框架中定义的API。若要了解更多信息,请参阅ContactsUI。
v6ylcynt8#
当我忘记将
NSAppleMusicUsageDescription
添加到Info.plist时,就会发生这种情况,Xcode调试控制台中也有一条关于它的错误消息。