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
これを再現または修正する手がかりはありますか?ユーザーに連絡先へのアクセスを許可しますが、シミュレーターでその機能をテストするときに、許可を求めるプロンプトは表示されません。ただし、ユーザーが私のアプリからカメラにアクセスすると、シミュレーターは許可を求めるプロンプトを表示します。そのため、連絡先へのアクセスに文字列は必要ないと思います。
ユーザーが写真を撮ることが許可されているため、plistにNSCameraUsageDescription
の文字列を追加する必要がありました。
IPhone Xでこれらのクラッシュが発生し、Touch ID/Face IDを使用している場合は、Info.plistにNSFaceIDUsageDescription
キーがないことが原因である可能性があります。このキーはiOS 11で追加されたもので、iOS 11.3のリリース後にiPhone Xでクラッシュが急増したことを考えると、iOS 11.3の後で必須になったようです。 Apple here :
NSFaceIDUsageDescription(文字列-iOS)。このキーにより、アプリがFace IDを使用する理由を説明できます。
重要:ユーザーのプライバシーを保護するために、iOS 11以降にリンクし、ハードウェアがサポートしている場合にFace IDにアクセスするiOSアプリは、そうする意図を静的に宣言する必要があります。 NSFaceIDUsageDescriptionキーをアプリのInfo.plistファイルに含め、このキーの目的文字列を提供します。アプリが対応する目的文字列なしでFace IDにアクセスしようとすると、アプリが終了する場合があります。
このキーはiOS 11以降でサポートされています。
興味深いことに、開発中のiPhone XではiOS 11.3でのクラッシュを再現できませんでした。デバッグビルドとTestFlightビルドでは動作が異なる可能性があります。アプリでFace IDを使用する場合は、Appleのドキュメントが信頼できる場合は、キーを追加する価値があります。
2つのことを理解しましょう。
Plistファイルには、カメラの使用法、連絡先の使用法の場所の使用法、顔IDの使用法など、非常に多くのプライバシーキーがあります...キーのいずれかを逃してこれらの機能を使用しようとすると、クラッシュするので、キーを使用し、クラッシュを回避するための説明。
2つ目は、特にNSPhotoLibraryUsageDescriptionの場合、iOS上のからこのキーを使用していた場合6 =およびiOS 11.3未満の場合、クラッシュは発生しませんが、iOS 11.3以降の後で、キーを1つ追加する必要がありますこれはNSPhotoLibraryAddUsageDescriptionです。
同時に、アプリがiOS 8または9以上から最新のiOS 11.3以上の場合は、両方のキーを使用できます。
IOS 14を実行しているiphone Xでも同じ問題が発生しました。info.plistファイルにNSPhotoLibraryAddUsageDescriptionを追加する際の問題を解決しました。
このフォーラムによると: https://forums.developer.Apple.com/thread/100732
AddressBookにアクセスするには、ユーザーから許可を付与する必要があります。
#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ウェブサイトから:
重要アドレス帳UIフレームワークはiOS 9で廃止されました。代わりに ContactsUI フレームワークで定義されたAPIを使用してください。詳細については、ContactsUIを参照してください。
__CRASHING_DUE_TO_PRIVACY_VIOLATION__
クラッシュは、アプリのplistに必須許可文字列がない場合に発生します。アクセス許可レベルは、Apple=新しいiOSバージョンで変更される場合があります。そのため、機能していたコードは、plistsの新しい要件を持つiOSのアップデートで機能しなくなります。
これらすべてを使用していない可能性があるため、ここに記載されているすべての回答にリストされているアクセス許可のうち、あなたに影響を与える可能性があるもの(NSFaceIDUsageDescription
、NSCameraUsageDescription
、NSPhotoLibraryAddUsageDescription
、その他?)を評価する必要があります。アプリの機能。
私の場合、Bluetooth BLEデバイスをサポートしており、iOS13から新しい必須の権限が必要でした:NSBluetoothAlwaysUsageDescription
なので、plistに追加しました:
<key>NSBluetoothAlwaysUsageDescription</key>
<string>We use Bluetooth to connect to your ... while the app is in the background</string>
そして、それはそれを修正しました。
私の場合、返されたUIDocumentPickerViewController
でstartAccessingSecurityScopedResource()
を最初に呼び出さずにURL
を使用してファイルを読み取ろうとすると、同じクラッシュレポートが表示されました。