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


102

Estoy usando XCode 8 y probando con iOS 10.2 Beta.

He agregado los marcos Photos, 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 nueva y no tengo nada más en la interfaz de usuario que no sea el botón de agarrar.

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


Limpiar y luego construir. Si no hay cambios, podría ser fácilmente un error en Xcode 8 o la versión beta de iOS 10 que Apple resolverá en una actualización futura. A menudo encuentro que este es el caso: si es la última versión beta o la versión de GM y aún no funciona, entonces sería el momento de preocuparse por solucionarlo.
Jordan Smith

1
sí, el mismo problema incluso después de limpiar y eliminar la aplicación :(
Pranoy C

No me estresaría por eso. Es una versión Beta. Es más probable que sea un problema con la versión beta. Sugeriría desarrollar en Xcode 7 hasta que esté mucho más cerca del lanzamiento.
Jordan Smith

ok tiene sentido! gracias @Jordan
Pranoy C

@Jordan parece que hay un nuevo requisito a partir de iOS 10. Consulte la solución: stackoverflow.com/a/38241350/1634905
Pranoy C

Respuestas:


172

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

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

Consulte todas las descripciones de uso aquí .


1
perdón, ¿cómo encontraste este número de publicación?
Pranoy C

1
En el sitio web de descargas de iOS, acabo de resolverlo con la clave UsageDescription correcta.
rockdaswift

gracias, tu respuesta resolvió el problema de inmediato. este es un nuevo requisito desde iOS 10. ¡Bienvenido a Stack overflow por cierto!
Pranoy C

¡Muchas gracias! Me quemó NSAppleMusicUsageDescription (acceder a la biblioteca de música de iTunes).
Lifjoy

4
@iomer solucioné el problema, agregué la clave en info.plist, pero no pude verla en Proyecto> Destino> Información. Así que agregué allí también, y Apple pasó mi binario. Me pasó una vez antes también con Facebook ID. No sé por qué no se mostró allí.
Raheel Sadiq

132

En iOS10, antes de acceder a datos sensibles a la privacidad como la cámara, los 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 bloqueó porque intentó acceder a datos sensibles a la privacidad sin una descripción de uso. El Info.plist de la aplicación debe contener unNSContactsUsageDescription clave 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 derecho en él, abriendo como Source Code, pegue este código a continuación. O puede abrir info.plistcomo Property Listpredeterminado, haga clic en el botón Agregar, Xcode le dará las sugerencias de finalización 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 antecedentes:

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

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

ingrese la descripción de la imagen aquí

luego limpia tu proyecto, ejecútalo.

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


2
Usé fotos en ninguna parte y Apple está rechazando mi aplicación, ¿alguna idea ?. También reviso todos los proyectos de pods
Raheel Sadiq

@RaheelSadiq Recuerde escribir su descripción por qué solicita esta autorización, entre <string> y </string>, o su aplicación será rechazada por Apple.
ElonChan

23

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

.plist imagen


14

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.

ingrese la descripción de la imagen aquí


9

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

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

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

GIF

O si desea agregar a través de info.plist, debe agregar NSPhotoLibraryUsageDescription clave .

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

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

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

GIF


1
y también <key>NSCameraUsageDescription</key> <string> Tome la foto </string>
Nasir Khan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.