Ошибка iOS 10 [доступ] <private> при использовании UIImagePickerController


102

Я использую XCode 8 и тестирую iOS 10.2 Beta.

Я добавил в проект фреймворки Photos, PhotosUI и MobileCoreServices.

Очень простой код:

#import <Photos/Photos.h>
#import <PhotosUI/PhotosUI.h>
#import <MobileCoreServices/MobileCoreServices.h>

@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, PHLivePhotoViewDelegate>

@property (strong, nonatomic) IBOutlet UIImageView *imageview;

@end

и реализация:

- (IBAction)grab:(UIButton *)sender{
    UIImagePickerController *picker = [[UIImagePickerController alloc]init];
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    picker.allowsEditing = NO;
    picker.delegate = self;

    // make sure we include Live Photos (otherwise we'll only get UIImages)
    NSArray *mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeLivePhoto];
    picker.mediaTypes = mediaTypes;

    // bring up the picker
    [self presentViewController:picker animated:YES completion:nil];
}

Как только я нажимаю на кнопку, приложение вылетает с очень бесполезной ошибкой:

[access] <private>

Вот и все. Ничего больше.

Используя операторы break, кажется, что приложение вылетает на «presentViewController».

Это совершенно новое приложение, и у меня в пользовательском интерфейсе нет ничего, кроме кнопки захвата.

Кроме того, при тестировании на iOS 9.3 это нормально работает. Мне не хватает чего-то, что можно было бы изменить в iOS 10?


Очистите, а затем создайте. Если никаких изменений нет, это может быть ошибка в Xcode 8 или бета-версии iOS 10, которая будет устранена Apple в будущем обновлении. Я часто нахожу, что это так - если это последняя бета-версия или выпуск GM, и он все еще не работает, то самое время подумать об исправлении.
Jordan Smith

1
да, та же проблема даже после очистки и удаления приложения :(
Pranoy C 07

Я бы не стал переживать по этому поводу. Это бета-версия. Скорее всего, проблема связана с бета-версией. Я бы посоветовал разработать Xcode 7, пока он не будет намного ближе к выпуску.
Jordan Smith

хорошо, имеет смысл! спасибо @Jordan
Pranoy C 07

@Jordan похоже, что с iOS 10 появилось новое требование. См. Решение: stackoverflow.com/a/38241350/1634905
Pranoy C 07

Ответы:


172

Возможно, вам потребуется поместить описание NSPhotoLibraryUsageDescription в свой список. подобно

<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) uses photos</string>

Ознакомьтесь со всеми описаниями использования здесь .


1
извините, как вы нашли этот номер версии?
Pranoy C 07

1
На веб-сайте загрузок iOS я просто решил с правильным ключом UsageDescription.
rockdaswift 07

спасибо, ваш ответ сразу решил проблему! это новое требование, начиная с iOS 10. Кстати, добро пожаловать в Stack overflow!
Pranoy C 07

Спасибо! Я был сожжен NSAppleMusicUsageDescription (доступ к музыкальной библиотеке iTunes).
lifjoy

4
@iomer Я исправил проблему, я добавил ключ в info.plist, но не смог его увидеть в Project> Target> Info. Так что я тоже добавил туда, а Apple передала свой двоичный файл. Со мной такое случалось и раньше с Facebook ID. Не знаю, почему его там не показали.
Raheel Sadiq

132

В iOS10, прежде чем вы получите доступ к конфиденциальным данным, таким как камера, контакты и т. Д., Вы должны запросить авторизацию, иначе ваше приложение выйдет из строя при доступе к ним. Затем Xcode будет регистрировать как:

В этом приложении произошел сбой из-за попытки доступа к конфиденциальным данным без описания использования. Info.plist приложения должен содержать NSContactsUsageDescriptionключ со строковым значением, объясняющий пользователю, как приложение использует эти данные.

Как с этим бороться?

Откройте файл в своем проекте с именем info.plist, щелкните его правой кнопкой мыши, откройте как Source Codeи вставьте в него этот код ниже. Или вы можете открыть info.plistкак Property Listпо умолчанию, нажмите кнопку добавления, Xcode предложит вам Privacy - варианты завершения при вводе с помощью клавиатуры ⬆️ и ⬇️.

Не забудьте написать свое описание, почему вы запрашиваете эту авторизацию, между <string>и </string>, иначе ваше приложение будет отклонено Apple:

<!-- 🖼 Photo Library -->
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) photo use</string>

<!-- 📷 Camera -->
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) camera use</string>

<!-- 🖼 Write To Image Gallery>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME) save phots in gallry</string>


<!-- 🎤 Microphone -->
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) microphone use</string>

<!-- 📍 Location -->
<key>NSLocationUsageDescription</key>
<string>$(PRODUCT_NAME) location use</string>

<!-- 📍 Location When In Use -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) location use</string>

<!-- 📍 Location Always -->
<key>NSLocationAlwaysUsageDescription</key>
<string>$(PRODUCT_NAME) always uses location </string>

<!-- 📆 Calendars -->
<key>NSCalendarsUsageDescription</key>
<string>$(PRODUCT_NAME) calendar events</string>

<!--  Reminders -->
<key>NSRemindersUsageDescription</key>
<string>$(PRODUCT_NAME) reminder use</string>

<!-- 📒 Contacts -->
<key>NSContactsUsageDescription</key>
<string>$(PRODUCT_NAME) contact use</string>

<!-- 🏊 Motion -->
<key>NSMotionUsageDescription</key>
<string>$(PRODUCT_NAME) motion use</string>

<!-- 💊 Health Update -->
<key>NSHealthUpdateUsageDescription</key>
<string>$(PRODUCT_NAME) heath update use</string>

<!-- 💊 Health Share -->
<key>NSHealthShareUsageDescription</key>
<string>$(PRODUCT_NAME) heath share use</string>

<!-- ᛒ🔵 Bluetooth Peripheral -->
<key>NSBluetoothPeripheralUsageDescription</key>
<string>$(PRODUCT_NAME) Bluetooth Peripheral use</string>

<!-- 🎵 Media Library -->
<key>NSAppleMusicUsageDescription</key>
<string>$(PRODUCT_NAME) media library use</string>

<!-- 📱 Siri -->
<key>NSSiriUsageDescription</key>
<string>$(PRODUCT_NAME) siri use</string>

<!-- 🏡 HomeKit -->
<key>NSHomeKitUsageDescription</key>
<string>$(PRODUCT_NAME) home kit use</string>

<!-- 📻 SpeechRecognition -->
<key>NSSpeechRecognitionUsageDescription</key>
<string>$(PRODUCT_NAME) speech use</string>

<!-- 📺 VideoSubscriber -->
<key>NSVideoSubscriberAccountUsageDescription</key>
<string>$(PRODUCT_NAME) tvProvider use</string>

Если не работает, попробуйте запросить фоновую авторизацию:

<key>UIBackgroundModes</key>
<array>
    <!-- something you should use in background -->
    <string>location</string>
</array>

Или перейдите по ссылке target -> Capabilities -> Background Modes -> open the background Modes:

введите описание изображения здесь

затем очистите свой проект, запустите его.

Перейдите сюда для получения дополнительной информации: iOS10AdaptationTips .


2
Я нигде не использовал фотографии, а Apple отклоняет мое приложение, есть идея? Я также проверяю все проекты
модулей

@RaheelSadiq Не забудьте написать свое описание, почему вы запрашиваете эту авторизацию, между <string> и </string>, иначе ваше приложение будет отклонено Apple.
ElonChan

23

в iOS 10 вам нужно добавить ключ, указанный на изображении ниже, если вы используете камеру или фотогалерею в своем приложении.

.plist изображение


14

Вам нужно добавить новые настройки конфиденциальности в ваш info.plist.

Не забудьте добавить значение, описывающее, почему приложению требуется доступ к службе.

введите описание изображения здесь


9

В iOS 10 Apple изменила способ доступа к любым личным типам данных пользователя.

Вам необходимо добавить ключ « Конфиденциальность - описание использования фото-библиотеки» в информацию об использовании вашего приложения Info.plistи их использовании.

Для получения дополнительной информации, пожалуйста, найдите ниже GIF.

Гифка

Или, если вы хотите добавить через, info.plistвам нужно добавить ключ NSPhotoLibraryUsageDescription .

Просто скопируйте и вставьте строку ниже info.plist.

<key>NSPhotoLibraryUsageDescription</key>
<string>Take the photo</string>

Пожалуйста, найдите ниже GIF для получения дополнительной информации.

Гифка


1
а также <key>NSCameraUsageDescription</key> <string> Сфотографируйте </string>
Насир Хан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.