__CRASHING_DUE_TO_PRIVACY_VIOLATION__

__CRASHING_DUE_TO_PRIVACY_VIOLATION__

在 Crashlytics 中,我可以看到 iOS 10 个用户经常遇到此崩溃。但是,当我使用 iPhone 7/10.2 在模拟器中进行测试时,我无法重现崩溃。在我的 plist 中,我已经有了

的字符串

NSCalendarsUsageDescription, NSMicrophoneUsageDescription, and 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 __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

知道如何重现或解决这个问题吗?我确实允许用户访问联系人,但是当我在模拟器中测试该功能时,系统不会提示我提供任何权限。但是,当用户从我的应用程序访问相机时,模拟器会提示我获得许可。这让我觉得访问联系人不需要字符串。

您必须授予用户权限才能访问地址簿。

  #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。要了解更多信息,请参阅联系人UI。

我必须在 plist 中为 NSCameraUsageDescription 添加一个字符串,因为允许用户拍照。

如果您在 iPhone X 上看到这些崩溃并且您使用 Touch ID/Face ID,原因可能是您的 Info.plist 中缺少 NSFaceIDUsageDescription 键.密钥是在 iOS 11 中添加的,看起来它可能在 iOS 11.3 之后成为强制性的,因为我在 iOS 11.3 之后看到 iPhone X 上的崩溃峰值释放。 Apple here:

对它进行了模糊的记录

NSFaceIDUsageDescription (String - iOS). This key lets you describe the reason your app uses Face ID.

Important: To protect user privacy, an iOS app that links on or after iOS 11 and that would access Face ID if the hardware supports it, must statically declare the intent to do so. Include the NSFaceIDUsageDescription key in your app’s Info.plist file and provide a purpose string for this key. If your app attempts to access Face ID without a corresponding purpose string, your app may exit.

This key is supported in iOS 11 and later.

有趣的是,我无法在 iOS 11.3 上重现崩溃 iPhone X,也许它在调试或 TestFlight 构建中的行为不同。如果我们相信 Apple 的文档,那么在您的应用中使用 Face ID 时仍然值得添加密钥。

我遇到了与 iphone X 运行 iOS 相同的问题 14. 解决了将 NSPhotoLibraryAddUsageDescription 添加到我的 info.plist 文件中的问题。

根据这个论坛:https://forums.developer.apple.com/thread/100732

让我们了解两件事。

在 plist 文件中有很多隐私密钥,例如相机使用、联系人使用、位置使用、面部 ID 使用等...如果您错过任何密钥并尝试使用这些功能,您将遇到崩溃,所以使用键和描述来避免崩溃。

第二件事是,特别是对于 NSPhotoLibraryUsageDescription,如果您使用 above iOS 6below iOS 11.3 则不会崩溃,但在 iOS 11.3 及更高版本 之后,您需要再添加一个密钥这是 NSPhotoLibraryAddUsageDescription.

如果您的应用是 iOS 8 或 9 或更高版本到最新的 iOS 11.3 及更高版本,您可以同时使用这两个密钥。

Reference for all the keys

案例一

我在尝试使用 UIDocumentPickerViewController 读取文件时收到了相同的崩溃报告,而没有先在返回的 URL 上调用 startAccessingSecurityScopedResource()

案例二

这是另一个可能的(角落)案例:

如果您使用 EKEventEditViewController 将事件添加到用户的日历中,info.plist 中的 NSCalendarsUsageDescription 键可能不够用

如果用户尝试将受邀者添加到活动中,则还需要 NSContactsUsageDescription 键。否则,当用户尝试搜索他们的联系人时,就会发生隐私侵犯并导致应用程序崩溃。

只要应用程序的 plist 上缺少 mandatory 权限字符串,就会发生 __CRASHING_DUE_TO_PRIVACY_VIOLATION__ 崩溃。 Apple 有时会使用新的 iOS 版本更改权限级别。因此,工作代码将开始破坏 iOS 对 plist 有新要求的更新。

您应该评估此处所有答案中列出的哪些权限可能会影响您(NSFaceIDUsageDescriptionNSCameraUsageDescriptionNSPhotoLibraryAddUsageDescription、其他?),因为您可能没有使用任何权限您应用中的这些功能。

就我而言,我们支持蓝牙 BLE 设备,并且从 iOS13 开始需要一个新的强制许可:NSBluetoothAlwaysUsageDescription 所以我添加到我的列表:

<key>NSBluetoothAlwaysUsageDescription</key>
    <string>We use Bluetooth to connect to your ... while the app is in the background</string>

然后就解决了。