ios __因侵犯隐私而坠毁__

8fq7wneg  于 2023-03-20  发布在  iOS
关注(0)|答案(8)|浏览(456)

在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

如何重现或修复这个问题?我确实允许用户访问联系人,但当我在模拟器中测试该功能时,没有提示我输入任何权限。然而,当用户从我的应用访问相机时,模拟器确实提示我输入权限。这让我认为访问联系人不需要字符串。

a6b3iqyw

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时,仍然值得添加密钥。

zwghvu4y

zwghvu4y2#

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

ia2d9nvy

ia2d9nvy3#

让我们了解两件事。
在plist文件中有这么多的隐私密钥,例如相机使用,联系人使用位置使用,面部ID使用等...如果你错过了任何键,并试图使用这些功能,你会得到一个崩溃,所以使用键和描述,以避免崩溃。
第二件事是,特别是对于NSPhotoLibraryUsageDescription,如果您在iOS 6以上版本和iOS 11.3以下版本中使用此密钥,则不会出现任何崩溃,但在iOS 11.3及更高版本之后,您需要再添加一个密钥,即NSPhotoLibraryAddUsageDescription
同时,如果您的应用是iOS 8或9或更高版本至最新iOS 11.3及更高版本,您可以使用这两个键。
Reference for all the keys

swvgeqrz

swvgeqrz4#

__CRASHING_DUE_TO_PRIVACY_VIOLATION__崩溃发生在应用的plist上缺少强制权限字符串的时候。苹果有时会在新的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>

这就解决了问题。

balp4ylt

balp4ylt5#

我在运行iOS 14的iPhone X上也遇到了同样的问题。在我的Info.Plist文件中添加NSPhotoLibraryAddUsageDescription解决了这个问题。
根据本论坛:https://forums.developer.apple.com/thread/100732

h9vpoimq

h9vpoimq6#

案例1

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

案例二

下面是另一种可能的(极端)情况:
如果您使用EKEventEditViewController向用户的日历添加事件,则info.plist中的NSCalendarsUsageDescription键可能不够
如果用户尝试向事件添加被邀请者,则还需要NSContactsUsageDescription密钥。否则,当用户尝试搜索其联系人时,将发生隐私侵犯,应用程序将崩溃。

rryofs0p

rryofs0p7#

您必须向用户授予权限才能访问通讯簿。

#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及更高版本有更新:
来自Apple网站:
重要事项iOS 9中已弃用“通讯簿UI”框架。请改用ContactsUI框架中定义的API。若要了解更多信息,请参阅ContactsUI。

v6ylcynt

v6ylcynt8#

当我忘记将NSAppleMusicUsageDescription添加到Info.plist时,就会发生这种情况,Xcode调试控制台中也有一条关于它的错误消息。

相关问题