20

在 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 __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

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

4

7 回答 7

31

如果您在 iPhone X 上看到这些崩溃并且您使用 Touch ID/Face ID,原因可能是NSFaceIDUsageDescription您的 Info.plist 中缺少密钥。该密钥是在 iOS 11 中添加的,看起来它可能在 iOS 11.3 之后成为强制性的,因为我在 iOS 11.3 发布后看到 iPhone X 上的崩溃高峰。Apple在这里模糊地记录了它:

NSFaceIDUsageDescription(字符串 - iOS)。此键可让您描述您的应用使用 Face ID 的原因。

重要提示:为了保护用户隐私,在 iOS 11 上或之后链接并且在硬件支持的情况下将访问 Face ID 的 iOS 应用程序必须静态声明这样做的意图。在应用的 Info.plist 文件中包含 NSFaceIDUsageDescription 键,并为此键提供用途字符串。如果您的应用尝试在没有相应目的字符串的情况下访问 Face ID,您的应用可能会退出。

iOS 11 及更高版本支持此密钥。

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

于 2018-04-12T08:45:16.860 回答
12

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

于 2017-03-14T23:37:52.287 回答
8

让我们理解两件事。

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

第二件事是,特别是对于NSPhotoLibraryUsageDescription ,如果您在iOS 6 以上iOS 11.3 以下使用此密钥,那么您将不会发生任何崩溃,但在iOS 11.3 及更高版本之后,您需要再添加一个密钥,即NSPhotoLibraryAddUsageDescription

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

所有键的参考

于 2018-08-13T05:23:06.290 回答
6

只要应用程序的plist 上缺少强制__CRASHING_DUE_TO_PRIVACY_VIOLATION__权限字符串,就会发生崩溃。Apple 有时会使用新的 iOS 版本更改权限级别。因此,正在运行的代码将开始与对 plist 有新要求的 iOS 更新中断。

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

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

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

这解决了它。

于 2020-02-05T10:25:29.737 回答
2

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

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

于 2018-08-06T12:40:26.903 回答
1

您必须授予用户访问通讯录的权限。

  #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 及以上版本有更新:

从苹果网站:

重要 iOS 9 中不推荐使用地址簿 UI 框架。请改用ContactsUI框架中定义的 API。要了解更多信息,请参阅 ContactsUI。

于 2017-03-10T03:52:18.133 回答
0

情况1

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

案例2

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

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

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

于 2019-08-12T17:35:32.263 回答