IOS 10 error [access] <private> при использовании UIImagePickerController

Я использую XCode 8 и тестирую с помощью бета-версии iOS 10.2.

Я добавил фреймы 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?

Ответ 1

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

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

Проверьте все описания использования здесь.

Ответ 2

В iOS10 перед тем, как вы получите доступ к конфиденциальным данным, таким как Camera, Contacts и т.д., вы должны попросить авторизацию или ваше приложение выйдет из строя при доступе к ним. Затем 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>

<!-- 🎤 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:

enter image description here

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

Перейдите к дополнительной информации: iOS10AdaptationTips.

Ответ 3

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

. plist image

Ответ 4

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

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

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

Ответ 5

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

Вам нужно добавить в свои приложения Info.plist ключ Privacy - Photo Library Usage Description.

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

GIF

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

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

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

Подробнее см. ниже GIF.

GIF