ios objective-c uiimagepickercontroller presentviewcontroller ios10

Error de iOS 10[acceso]<privado> al usar UIImagePickerController



objective-c presentviewcontroller (5)

Estoy usando XCode 8 y estoy probando con iOS 10.2 Beta.

He agregado los marcos de fotos, PhotosUI y MobileCoreServices al proyecto.

Código muy simple:

#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

e implementación:

- (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]; }

Tan pronto como toco el botón, la aplicación se bloquea con un error muy inútil:

[access] <private>

Eso es. Nada más.

Usando declaraciones de interrupción, la aplicación parece fallar en "presentViewController".

Esta es una aplicación completamente nueva y no tengo nada más en la interfaz de usuario que no sea el botón de captura.

Además, probando en iOS 9.3, esto funciona bien. ¿Me estoy perdiendo algo que podría cambiar en iOS 10?


En iOS 10, Apple ha cambiado la forma en que puede acceder a los tipos de datos privados de cualquier usuario.

Info.plist agregar la clave Privacidad - Descripción de uso de la biblioteca de fotos a la Info.plist información de su aplicación y su información de uso.

Para obtener más información, busque el siguiente GIF.

O si desea agregar a través de info.plist entonces necesita agregar la clave NSPhotoLibraryUsageDescription .

Simplemente copie y pegue debajo de la cadena en info.plist .

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

Encuentre el siguiente GIF para obtener más información.


En iOS10, antes de acceder a datos sensibles a la privacidad como Cámara, Contactos, etc., debe solicitar la autorización o su aplicación se bloqueará cuando acceda a ellos. Luego, Xcode se registrará como:

Esta aplicación se ha bloqueado porque intentó acceder a datos sensibles a la privacidad sin una descripción del uso. El Info.plist de la aplicación debe contener una clave NSContactsUsageDescription con un valor de cadena que explique al usuario cómo la aplicación utiliza estos datos.

Como lidiar con esto?

Abra el archivo en su proyecto llamado info.plist , haga clic con el botón derecho, info.plist como Source Code , pegue este código a continuación. O puede abrir info.plist como Property List de forma predeterminada, haga clic en el botón Agregar, Xcode le dará las sugerencias sugeridas mientras escribe Privacy - con la ayuda del teclado ⬆️ y ⬇️.

Recuerde escribir su descripción por qué solicita esta autorización, entre <string> y </string> , o su aplicación será rechazada por 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>

Si no funciona, intente solicitar la autorización de fondo:

<key>UIBackgroundModes</key> <array> <!-- something you should use in background --> <string>location</string> </array>

O vaya al target -> Capabilities -> Background Modes -> open the background Modes :

luego limpie su proyecto, ejecútelo.

Vaya aquí para obtener más información: iOS10AdaptationTips .


Es posible que deba poner NSPhotoLibraryUsageDescription en su lista. Me gusta

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

Verifique todas las descripciones de uso here .


Necesita agregar la nueva configuración de privacidad a su info.plist.

No olvide agregar el valor que describe por qué la aplicación necesita acceder al servicio.


en iOS 10, debe agregar la clave mencionada en la imagen a continuación si está utilizando la cámara o la galería de fotos en su aplicación