Ответ 1
Возможно, вам понадобится разместить NSPhotoLibraryUsageDescription в вашем plist. Как
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) uses photos</string>
Проверьте все описания использования здесь.
Я использую 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?
Возможно, вам понадобится разместить NSPhotoLibraryUsageDescription в вашем plist. Как
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) uses photos</string>
Проверьте все описания использования здесь.
В 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
:
затем очистите проект, запустите его.
Перейдите к дополнительной информации: iOS10AdaptationTips.
в iOS 10 вам нужно добавить ключ, упомянутый ниже, если вы используете камеру или фотогалерею в своем приложении.
Вам нужно добавить новые параметры конфиденциальности для вас info.plist.
Не забудьте добавить значение, описывающее, почему приложение должно получить доступ к службе.
В iOS 10 Apple изменила способ доступа к любым пользовательским типам данных.
Вам нужно добавить в свои приложения Info.plist
ключ Privacy - Photo Library Usage Description.
Для получения дополнительной информации см. ниже GIF.
Или, если вы хотите добавить через Info.plist
, вам нужно добавить NSPhotoLibraryUsageDescription.
Просто скопируйте и вставьте ниже строку в Info.plist
.
<key>NSPhotoLibraryUsageDescription</key>
<string>Take the photo</string>
Подробнее см. ниже GIF.