Ответ 1
Я должен был добавить строку для NSCameraUsageDescription
в NSCameraUsageDescription
потому что пользователю разрешено делать фотографии.
В 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
Любой ключ, как воспроизвести или исправить это? Я разрешаю пользователю получать доступ к контактам, но я не запрашиваю никаких разрешений при тестировании этой функции в симуляторе. Однако, когда пользователь обращается к камере из моего приложения, симулятор запрашивает у меня разрешение. Это заставляет меня думать, что строка не нужна для доступа к контактам.
Я должен был добавить строку для NSCameraUsageDescription
в NSCameraUsageDescription
потому что пользователю разрешено делать фотографии.
Если вы видите эти сбои на iPhone X, и вы используете Touch ID/Face ID, причиной может быть отсутствие ключа NSFaceIDUsageDescription
в вашем Info.plist. Ключ был добавлен в iOS 11 и выглядит так, как будто он стал обязательным после iOS 11.3, учитывая, что я вижу всплеск сбоев на iPhone X после выхода iOS 11.3. Он смутно задокументированы Apple, здесь:
NSFaceIDUsageDescription (String - iOS). Этот ключ позволяет описать причину, в которой ваше приложение использует идентификатор лица.
Важно: чтобы защитить конфиденциальность пользователей, приложение iOS, которое ссылается на iOS 11 или после него, и которое будет обращаться к идентификатору лица, если аппаратное обеспечение поддерживает его, должно статически объявлять о намерении сделать это. Включите ключ NSFaceIDUsageDescription в свой файл Info.plist приложения и укажите целую строку для этого ключа. Если ваше приложение пытается получить доступ к идентификатору лица без соответствующей целевой строки, ваше приложение может выйти.
Этот ключ поддерживается в iOS 11 и более поздних версиях.
Интересно, что я не смог воспроизвести крах на iOS 11.3 на моем iPhone разработки iPhone, возможно, он ведет себя по-разному в отладочной или тестовой сборке. Все еще стоит добавить ключ, когда вы используете Face ID в своем приложении, если мы верим документации Apple.
Позвольте понять две вещи.
В файле plist есть так много секретных ключей, например, использование камеры, использование использования местоположения, использование идентификатора лица и т.д.... если вы пропустите какой-либо из ключей и попытаетесь использовать эти функции, вы получите сбой, поэтому используйте ключи и описание авария авария.
Во-вторых, особенно для NSPhotoLibraryUsageDescription, если вы использовали этот ключ выше iOS 6 и ниже iOS 11.3, тогда вы не получите никакого сбоя, но после iOS 11.3 и более поздних версий вам нужно добавить еще один ключ, который является NSPhotoLibraryAddUsageDescription.
В то же время вы можете использовать оба ключа, если ваше приложение - iOS 8 или 9 или выше, до последней версии iOS 11.3 и выше.
У меня была такая же проблема с iphone X с iOS 14. Решилась проблема добавления NSPhotoLibraryAddUsageDescription в файл info.plist.
в соответствии с этим форумом: https://forums.developer.apple.com/thread/100732
Вам необходимо предоставить разрешение от пользователя на доступ к адресной книге.
#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. Вместо этого используйте API, определенные в структуре ContactsUI. Дополнительные сведения см. В разделе Контакты.
В моем случае я получил такой же отчет о сбое при попытке прочитать файлы, используя UIDocumentPickerViewController
без предварительного вызова startAccessingSecurityScopedResource()
для возвращенного URL
.