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 .