it-roy-ru.com

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

Я использую 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?

102
Pranoy C

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

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

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

172
rockdaswift

В 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:

enter image description here

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

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

132
ElonChan

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

.plist image

23
Pritesh

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

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

enter image description here

14
user4034301

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

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

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

GIF

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

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

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

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

GIF

9
Ramkrishna Sharma