Ошибка iOS 10 [доступ] ‹private› при использовании 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?


person sudoExclaimationExclaimation    schedule 07.07.2016    source источник
comment
Очистите, а затем создайте. Если нет изменений, это может быть ошибка в Xcode 8 или бета-версии iOS 10, которая будет устранена Apple в будущем обновлении. Я часто нахожу, что это так - если это последняя бета-версия или выпуск GM, и он все еще не работает, то самое время побеспокоиться о том, чтобы это исправить.   -  person Jordan Smith    schedule 07.07.2016
comment
да, такая же проблема даже после очистки и удаления приложения :(   -  person sudoExclaimationExclaimation    schedule 07.07.2016
comment
Я бы не стал переживать по этому поводу. Это бета-версия. Скорее всего, проблема связана с бета-версией. Я бы посоветовал разработать Xcode 7, пока он не будет намного ближе к релизу.   -  person Jordan Smith    schedule 07.07.2016
comment
хорошо, имеет смысл! спасибо @Jordan   -  person sudoExclaimationExclaimation    schedule 07.07.2016
comment
@Jordan похоже, что в iOS 10 появилось новое требование. См. Решение: stackoverflow.com/a/38241350/1634905   -  person sudoExclaimationExclaimation    schedule 08.07.2016


Ответы (5)


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

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

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

person rockdaswift    schedule 07.07.2016
comment
извините, как вы узнали этот номер версии? - person sudoExclaimationExclaimation; 07.07.2016
comment
На веб-сайте загрузок iOS я просто решил с правильным ключом UsageDescription. - person rockdaswift; 07.07.2016
comment
спасибо, ваш ответ сразу решил проблему! это новое требование, начиная с iOS 10. Кстати, добро пожаловать в Stack overflow! - person sudoExclaimationExclaimation; 08.07.2016
comment
Огромное спасибо! Я был сожжен NSAppleMusicUsageDescription (доступ к музыкальной библиотеке iTunes). - person lifjoy; 14.07.2016
comment
Я использовал это в своем приложении, и сейчас он все еще отклоняется 4 раза, я добавил этот ключ в свой проект, а также в свои проекты модулей. и нигде я не смог бы использовать фотографии в своем рабочем пространстве. Есть идеи, почему это происходит? еще одно сообщение должно быть поводом? - person Raheel Sadiq; 22.09.2016
comment
@RaheelSadiq выполняет поиск в рабочем пространстве по ключевым словам для фотографий, изображений или средств выбора. Может быть, какой-то модуль использует какой-нибудь класс или библиотеку, связанный с фотографиями. - person rockdaswift; 22.09.2016
comment
@iomer Я уже сделал это и искал другие слова, такие как актив от ALAsset, я не нашел ни одного. Я использую эти библиотеки: pod Alamofire, AlamofireImage, EGFloatingTextField, MXSegmentedPager. Еще какие-то намеки или идеи, которые я могу проверить, я был бы очень признателен. - person Raheel Sadiq; 22.09.2016
comment
@iomer Я исправил проблему, я добавил ключ в info.plist, но не увидел его в Project ›Target› Info. Так что я тоже добавил туда, а Apple передала свой двоичный файл. Со мной такое случалось и раньше с Facebook ID. Не знаю, почему его там не показали. - person Raheel Sadiq; 23.09.2016
comment
Или используйте текст "Большой брат видит тебя!" ;) - person Sajjon; 03.10.2016
comment
Я делаю это, и это хорошо работает для фотографий, но мое приложение все равно вылетает, когда я пытаюсь записать видео. Любые идеи? - person Mike; 07.10.2016
comment
Это должно сделать ваше приложение не доступным для управления магазином приложений. - person Olivier de Jonge; 14.10.2016
comment
Что делать, если вы не используете фотографии? Я получил предупреждение, что мне нужен ключ, а затем, когда я добавил его без значения, он отклонил двоичный файл - person James O'Brien; 22.10.2016

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

Or go to target -> Capabilities -> Background Modes -> open the background Modes:

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

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

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

person ElonChan    schedule 29.07.2016
comment
Я нигде не использовал фотографии, а Apple отклоняет мое приложение, есть идея ?. Я также проверяю все проекты модулей - person Raheel Sadiq; 22.09.2016
comment
@RaheelSadiq Не забудьте написать свое описание, почему вы запрашиваете эту авторизацию, между <string> и </string>, иначе ваше приложение будет отклонено Apple. - person ElonChan; 24.10.2016

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

. plist image

person Pritesh    schedule 19.09.2016

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

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

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

person Community    schedule 09.10.2016

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

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

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

GIF

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

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

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

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

GIF

person Ramkrishna Sharma    schedule 29.12.2016
comment
а также ‹key› NSCameraUsageDescription ‹/key› ‹string› Сделайте фото ‹/string› - person Nasir Khan; 07.01.2017