ошибка iOS 10 [доступ] при использовании UIImagePickerController
Я использую XCode 8 и тестирование с iOS 10.2 Beta.
я добавил фотографии, 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?
5 ответов:
возможно, вам придется поместить NSPhotoLibraryUsageDescription в свой plist. Как
<key>NSPhotoLibraryUsageDescription</key> <string>$(PRODUCT_NAME) uses photos</string>
проверьте все описания использования здесь.
в iOS10, прежде чем вы получите доступ к конфиденциальным данным, таким как камера, контакты и т. д., Вы должны запросить авторизацию, или ваше приложение рухнет при доступе к ним.Тогда Xcode будет регистрироваться как:
это приложение разбилось, потому что он пытался получить доступ к конфиденциальным данным без описания использования. Информация о приложении.plist должен содержать
NSContactsUsageDescription
ключ со строковым значением объяснить пользователю, как приложение использует эти данные.как бороться с этим?
откройте файл в вашем проекте с именем
info.plist
, щелкните правой кнопкой мыши, открывая какSource Code
вставьте этот код ниже его. Или вы можете открытьinfo.plist
какProperty List
по умолчанию нажмите кнопку Добавить, Xcode даст вам предложить завершения при вводеPrivacy -
С помощью клавиатуры ⬆️ и ⬇️.не забудьте написать свое описание, почему вы просите это разрешение, между
<string>
и</string>
, или ваше приложение будет отклонено яблоко:<!-- 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 .
В iOS 10 Apple изменила способ доступа к любым типам личных данных пользователей.
вам нужно добавить Конфиденциальность-Описание Использования Библиотеки Фотографий ключ к вашему приложению
Info.plist
и информация об их использовании.для получения дополнительной информации, пожалуйста, найдите ниже GIF.
или если вы хотите добавить через
info.plist
тогда вам нужно добавить NSPhotoLibraryUsageDescription ключ.просто скопируйте и вставьте строку ниже в
info.plist
.<key>NSPhotoLibraryUsageDescription</key> <string>Take the photo</string>
пожалуйста, найдите ниже GIF для получения дополнительной информации.