web-dev-qa-db-fra.com

Erreur iOS 10 [accès] <privé> lors de l'utilisation de UIImagePickerController

J'utilise XCode 8 et teste avec iOS 10.2 Beta.

J'ai ajouté les infrastructures Photos, PhotosUI et MobileCoreServices à projeter.

Code très 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

et mise en œuvre:

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

Dès que j'appuie sur le bouton, l'application se bloque avec une erreur très inutile:

[access] <private>

C'est ça. Rien d'autre.

En utilisant des instructions de rupture, l'application semble se bloquer à "presentViewController".

Ceci est une toute nouvelle application et je n'ai rien d'autre dans l'interface utilisateur que le bouton de capture.

En outre, en testant sur iOS 9.3, cela fonctionne bien. Me manque-t-il quelque chose qui pourrait être modifié dans iOS 10?

102
Pranoy C

Vous devrez peut-être placer la description NSPhotoLibraryUsage dans votre plist. Comme

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

Vérifiez toutes les descriptions d'utilisation ici .

172
rockdaswift

Dans iOS10, avant d’accéder à des données confidentielles telles que Appareil photo, Contacts, etc., vous devez demander une autorisation, sinon votre application se bloquera lorsque vous y accéderez. Ensuite, Xcode se connectera de la manière suivante:

Cette application s'est bloquée car elle a tenté d'accéder à des données confidentielles sans description d'utilisation. Info.plist de l'application doit contenir une clé NSContactsUsageDescription avec une valeur de chaîne expliquant à l'utilisateur comment l'application utilise ces données.

Comment gérer cela?

Ouvrez le fichier dans votre projet nommé info.plist, cliquez dessus avec le bouton droit de la souris et ouvrez-le en tant que Source Code, collez-y le code ci-dessous. Ou vous pouvez ouvrir info.plist en tant que Property List par défaut, cliquez sur le bouton Ajouter. Xcode vous donnera les suggestions suggérées lors de la saisie de Privacy - à l'aide du clavier et.

N'oubliez pas d'écrire votre description pour laquelle vous demandez cette autorisation, entre <string> et </string>, sinon votre application sera rejetée par 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 cela ne fonctionne pas, essayez de demander l'autorisation d'arrière-plan:

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

Ou allez à target -> Capabilities -> Background Modes -> open the background Modes:

enter image description here

puis nettoyez votre projet, exécutez-le.

Allez ici pour plus d'informations: iOS10AdaptationTips .

132
ElonChan

dans iOS 10, vous devez ajouter la clé mentionnée dans l'image ci-dessous si vous utilisez un appareil photo ou une galerie de photos dans votre application.

.plist image

23
Pritesh

Vous devez ajouter les nouveaux paramètres de confidentialité à info.plist.

N'oubliez pas d'ajouter la valeur décrivant les raisons pour lesquelles l'application doit accéder au service.

enter image description here

14
user4034301

Dans iOS 10, Apple a modifié la manière dont vous pouvez accéder aux types de données privées de l'utilisateur.

Vous devez ajouter la clé Confidentialité - Description de l'utilisation de la photothèque à Info.plist de votre application et à leurs informations d'utilisation.

Pour plus d'informations, veuillez trouver le GIF ci-dessous.

GIF

Ou si vous voulez ajouter via info.plist, vous devez ajouter la clé NSPhotoLibraryUsageDescription .

Il suffit de copier et coller ci-dessous la chaîne dans info.plist.

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

Veuillez trouver le GIF ci-dessous pour plus d'informations.

GIF

9
Ramkrishna Sharma