Dans Crashlytics, je peux voir que les utilisateurs d'iOS 10 subissent fréquemment ce blocage. Cependant, lorsque je teste dans Simulator avec iPhone 7/10.2, je ne parviens pas à reproduire le crash. Dans mon plist, j’ai déjà des chaînes pour
NSCalendarsUsageDescription, NSMicrophoneUsageDescription et NSPhotoLibraryUsageDescription.
Voici le stacktrace de 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
Toute idée de comment reproduire ou résoudre ce problème? J'autorise les utilisateurs à accéder aux contacts, mais aucune autorisation n'est demandée lorsque je teste cette fonctionnalité dans le simulateur. Cependant, lorsque l'utilisateur accède à la caméra depuis mon application, le simulateur Me demande une permission. Cela me fait penser qu'une chaîne n'est pas nécessaire pour accéder aux contacts.
J'ai dû ajouter une chaîne pour NSCameraUsageDescription
dans la pliste car l'utilisateur est autorisé à prendre des photos.
Si vous constatez ces blocages sur iPhone X et que vous utilisez Touch ID/Face ID, la raison peut être un manque de clé NSFaceIDUsageDescription
dans votre Info.plist. La clé a été ajoutée dans iOS 11 et semble être devenue obligatoire après iOS 11.3, étant donné que je vois un pic de crash sur iPhone X après la sortie de iOS 11.3. C'est vaguement documenté par Apple ici :
NSFaceIDUsageDescription (String - iOS). Cette clé vous permet de décrire la raison pour laquelle votre application utilise l'identifiant de visage.
Important: pour protéger la confidentialité des utilisateurs, une application iOS qui crée un lien vers ou après iOS 11 et qui accéderait à l'identifiant de visage si le matériel le prend en charge doit déclarer de manière statique l'intention de le faire. Incluez la clé NSFaceIDUsageDescription dans le fichier Info.plist de votre application et fournissez une chaîne de caractères pour cette clé. Si votre application tente d'accéder à l'identifiant de visage sans chaîne de but correspondante, votre application peut se fermer.
Cette clé est prise en charge dans iOS 11 et versions ultérieures.
Chose intéressante, je n'ai pas été en mesure de reproduire le crash sur iOS 11.3 sur mon développement iPhone X. Peut-être que son comportement est différent dans les versions de débogage ou de TestFlight. Cela vaut toujours la peine d'ajouter la clé lorsque vous utilisez Face ID dans votre application, si nous en croyons la documentation d'Apple.
Vous devez disposer de accorder l'autorisation de l'utilisateur pour accéder au carnet d'adresses.
#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
}
Il y a une mise à jour sur iOS 9.0 et supérieur:
Sur le site web d'Apple:
Important La structure de l'interface utilisateur du carnet d'adresses est obsolète dans iOS 9. Utilisez plutôt les API définies dans ContactsUI . Pour en savoir plus, voir ContactsUI.
Comprenons deux choses.
Dans le fichier plist, il y a tellement de clés de confidentialité, par exemple, utilisation de la caméra, utilisation de l'emplacement du contact, utilisation de l'identifiant du visage, etc. Si vous manquez l'une des clés et essayez d'utiliser ces fonctions, vous obtiendrez un blocage. description pour crash de avoding.
La deuxième chose est, en particulier pour NSPhotoLibraryUsageDescription, si vous utilisiez cette clé depuis au-dessus de iOS 6 et au-dessous de iOS 11.3, vous n'obtiendrez aucun plantage, mais après iOS 11.3 et ultérieur vous devez ajouter une clé supplémentaire, NSPhotoLibraryAddUsageDescription.
Dans le même temps, vous pouvez utiliser les deux touches si votre application est iOS 8 ou supérieure ou égale à 9 ou plus récente, jusqu'à iOS 11.3 et supérieur.
J'ai eu le même problème avec un iphone X sous iOS 14. Résolution du problème en ajoutant NSPhotoLibraryAddUsageDescription à mon fichier info.plist
selon ce forum: https://forums.developer.Apple.com/thread/100732