__CRASHING_DUE_TO_PRIVACY_VIOLATION__
Posted
技术标签:
【中文标题】__CRASHING_DUE_TO_PRIVACY_VIOLATION__【英文标题】: 【发布时间】:2017-07-31 06:50:37 【问题描述】:在 Crashlytics 中,我可以看到 ios 10 用户经常遇到这种崩溃。但是,当我使用 iPhone 7/10.2 在模拟器中进行测试时,我无法重现崩溃。在我的 plist 中,我已经有了
的字符串NSCalendarsUsageDescription、NSMicrophoneUsageDescription 和 NSPhotoLibraryUsageDescription。
这是来自 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 + 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
任何线索如何重现或解决这个问题?我确实允许用户访问联系人,但是当我在模拟器中测试该功能时,系统不会提示我提供任何权限。但是,当用户从我的应用程序访问相机时,模拟器会提示我获得许可。这让我觉得访问联系人不需要字符串。
【问题讨论】:
对我来说这是新的:Privacy - Tracking Usage Description,在实现ATTrackingManager.requestTrackingAuthorization
代码之后,info.plist 中缺少它。
【参考方案1】:
如果您在 iPhone X 上看到这些崩溃并且您使用 Touch ID/Face ID,原因可能是您的 Info.plist 中缺少 NSFaceIDUsageDescription
键。该密钥是在 iOS 11 中添加的,看起来它可能在 iOS 11.3 之后成为强制性的,因为我在 iOS 11.3 发布后看到 iPhone X 上的崩溃高峰。 Apple here 模糊地记录了这一点:
NSFaceIDUsageDescription(字符串 - iOS)。此键可让您描述您的应用使用 Face ID 的原因。
重要提示:为保护用户隐私,在 iOS 11 上或之后链接的 iOS 应用程序如果硬件支持它会访问 Face ID,必须静态声明这样做的意图。在应用的 Info.plist 文件中包含 NSFaceIDUsageDescription 键,并为此键提供用途字符串。如果您的应用尝试在没有相应用途字符串的情况下访问 Face ID,您的应用可能会退出。
iOS 11 及更高版本支持此密钥。
有趣的是,我无法在我的开发 iPhone X 上重现 iOS 11.3 上的崩溃,也许它在调试或 TestFlight 构建中的行为不同。如果我们相信 Apple 的文档,在您的应用中使用 Face ID 时仍然值得添加密钥。
【讨论】:
非常感谢@Max。非常非常有帮助。 让 context = LAContext() var error:NSError? var status = false status = context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) if #available(iOS 11.0, *) if context.biometryType == .faceID 我只是在检查 biometryType 是否为 faceID,为什么这到底会让我的应用崩溃吗? @Max,你救了我 @Max 我们是否需要添加这个键,即使我们只用于 Touch ID ? 我的理解是即使你使用Touch ID,当这个应用在有Face ID的设备上运行时,它也会切换到那个。我不太确定是否有办法自动阻止该切换,因此在这种情况下添加密钥可能是可取的。【参考方案2】:我必须在 plist 中为 NSCameraUsageDescription
添加一个字符串,因为允许用户拍照。
【讨论】:
【参考方案3】:让我们了解两件事。
在 plist 文件中有很多隐私密钥,例如相机使用、联系人使用位置使用、面部 ID 使用等...如果您错过任何密钥并尝试使用这些功能,您将遇到崩溃,所以使用键和描述来避免崩溃。
第二件事是,特别是对于 NSPhotoLibraryUsageDescription,如果您在 iOS 6 以上 和 iOS 11.3 以下使用此密钥,那么您将不会遇到任何崩溃,但在 iOS 11.3 及更高版本之后,您需要再添加一个键,即 NSPhotoLibraryAddUsageDescription。
同时,如果您的应用是 iOS 8 或 9 或更高版本到最新的 iOS 11.3 或更高版本,您可以同时使用这两个键。
Reference for all the keys
【讨论】:
【参考方案4】:__CRASHING_DUE_TO_PRIVACY_VIOLATION__
崩溃发生在应用的 plist 上缺少 强制 权限字符串时。 Apple 有时会使用新的 iOS 版本更改权限级别。因此,正在运行的代码将开始与对 plist 有新要求的 iOS 更新中断。
您应该评估此处所有答案中列出的哪些权限可能会影响您(NSFaceIDUsageDescription
、NSCameraUsageDescription
、NSPhotoLibraryAddUsageDescription
等?),因为您可能没有在您的应用中使用任何这些功能。
就我而言,我们支持蓝牙 BLE 设备,并且从 iOS13 开始需要新的强制许可:NSBluetoothAlwaysUsageDescription
所以我添加到我的 plist 中:
<key>NSBluetoothAlwaysUsageDescription</key>
<string>We use Bluetooth to connect to your ... while the app is in the background</string>
这就解决了。
【讨论】:
【参考方案5】:我在运行 iOS 14 的 iphone X 上遇到了同样的问题。解决了将 NSPhotoLibraryAddUsageDescription 添加到我的 info.plist 文件的问题。
根据这个论坛:https://forums.developer.apple.com/thread/100732
【讨论】:
【参考方案6】:您必须授予用户权限才能访问地址簿。
#import <AddressBookUI/AddressBookUI.h>
// Request authorization to Address Book
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error)
if (granted)
// First time access has been granted, add the contact
[self _addContactToAddressBook];
else
// User denied access
// Display an alert telling user the contact could not be added
);
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
// The user has previously given access, add the contact
[self _addContactToAddressBook];
else
// The user has previously denied access
// Send an alert telling user to change privacy setting in settings app
iOS 9.0 及以上版本有更新:
来自苹果网站:
重要 地址簿 UI 框架在 iOS 9 中已弃用。请改用在 ContactsUI 框架中定义的 API。要了解更多信息,请参阅 ContactsUI。
【讨论】:
【参考方案7】:案例 1
在尝试使用 UIDocumentPickerViewController
读取文件时,我得到了相同的崩溃报告,而没有先在返回的 URL
上调用 startAccessingSecurityScopedResource()
。
案例 2
这是另一个可能的(角落)案例:
如果您使用EKEventEditViewController
将事件添加到用户的日历中,则 info.plist 中的NSCalendarsUsageDescription
键可能还不够!
如果用户尝试将受邀者添加到活动中,则还需要 NSContactsUsageDescription
键。否则,当用户试图搜索他们的联系人时,就会发生隐私侵犯,应用程序崩溃。
【讨论】:
以上是关于__CRASHING_DUE_TO_PRIVACY_VIOLATION__的主要内容,如果未能解决你的问题,请参考以下文章