由于隐私问题而崩溃

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

有什么线索可以重现或修复这个问题吗?我确实允许用户访问联系人,但当我在模拟器中测试该功能时没有提示任何权限。然而,当用户从我的应用程序访问相机时,模拟器会提示我进行授权。这使我认为访问联系人不需要字符串。


对我来说,缺失的是 info.plist 中的新项:隐私 - 跟踪使用说明,在实现 ATTrackingManager.requestTrackingAuthorization 代码后。 - 7RedBits.com
9个回答

31
如果你在 iPhone X 上使用 Touch ID/Face ID 并且遇到了崩溃,原因可能是你的 Info.plist 文件中缺少 NSFaceIDUsageDescription 键。该键在 iOS 11 中添加,并且似乎在 iOS 11.3 发布后变为强制性要求,因为我看到 iPhone X 在 iOS 11.3 后出现了崩溃高峰。苹果在这里含糊地记录了此内容:

NSFaceIDUsageDescription(字符串 - iOS)。此键允许您描述您的应用程序使用 Face ID 的原因。

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

该键在 iOS 11 及之后版本中受支持。

有趣的是,我在我的开发 iPhone X 上无法在 iOS 11.3 上复现崩溃,也许在调试或 TestFlight 构建中会有所不同。如果我们相信苹果的文档,在你的应用程序中使用 Face ID 时,值得添加这个键。

3
非常感谢 @Max。非常有帮助。 - Muhammad Mehdi Raza
let 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,为什么会导致我的应用程序崩溃? - Satheesh
@Max,你救了我。 - mkll
@Max,即使我们仅用于Touch ID,我们是否需要添加此密钥? - shaqir saiyed
我的理解是,即使您使用了Touch ID,当此应用程序在配备Face ID的设备上运行时,它将切换到Face ID。我不确定是否有一种自动防止切换的方法,因此在这种情况下最好添加这个键。 - Max Desiatov

14

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


8

让我们理解两件事情。

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

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

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

所有密钥的参考资料


6
当应用的plist中缺少强制性权限字符串时,会出现“__CRASHING_DUE_TO_PRIVACY_VIOLATION__”崩溃。有时候苹果公司会随着新的iOS版本更改权限级别。因此,在具有新要求的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

案例1

当我尝试使用UIDocumentPickerViewController读取文件时,如果没有先在返回的URL上调用startAccessingSecurityScopedResource(),就会出现同样的崩溃报告。

案例2

这是另一个可能的(边角)情况:

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

如果用户尝试向事件添加被邀请者,则还需要NSContactsUsageDescription键。否则,当用户尝试搜索他们的联系人时,将违反隐私规定并导致应用程序崩溃。


谢谢!第二个案例让我疯了数月! - Mihai Fratu

2

我曾经遇到过一个问题,我的iPhone X运行iOS 14时出现了同样的问题。通过将NSPhotoLibraryAddUsageDescription添加到我的info.plist文件中解决了这个问题。

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


1

我在我的应用程序中遇到了这个问题,即使我不需要使用相机,我仍然需要添加以下标签:

NSCameraUsageDescription; NSPhotoLibraryUsageDescription; NSPhotoLibraryAddUsageDescription

这是因为在应用程序中我们有一个Webview来打开网站,在该网站中有一个选项,用户可以发送文件,如果他正在使用iPhone,则会出现“拍摄”选项,它使用相机,这就是导致应用程序因缺乏授权而崩溃的原因。


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。


0

这是因为我忘记在 Info.plist 中添加 NSAppleMusicUsageDescription。Xcode 调试控制台中也有相关的错误信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接