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

102

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

J'ai ajouté les frameworks Photos, PhotosUI et MobileCoreServices au projet.

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 plante avec une erreur très inutile:

[access] <private>

C'est tout. Rien d'autre.

En utilisant des instructions break, l'application semble planter à "presentViewController".

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

De plus, en testant sur iOS 9.3, cela fonctionne bien. Est-ce que je manque quelque chose qui pourrait être changé dans iOS 10?

Pranoy C
la source
Nettoyez puis construisez. Si aucun changement, cela pourrait facilement être un bogue dans Xcode 8 ou la version bêta d'iOS 10 qui sera résolu par Apple dans une future mise à jour. Je trouve souvent que c'est le cas - si c'est la dernière version bêta, ou la version GM et que cela ne fonctionne toujours pas, alors ce serait le moment de s'inquiéter de le réparer.
Jordan Smith
1
oui, même problème même après le nettoyage et la suppression de l'application :(
Pranoy C
Je ne serais pas stressé à ce sujet. C'est une version bêta. Il est plus probable que ce soit un problème avec la version bêta. Je suggérerais de développer sur Xcode 7 jusqu'à ce que beaucoup plus proche de la sortie.
Jordan Smith
ok a du sens! merci @Jordan
Pranoy C
@Jordan semble qu'il y ait une nouvelle exigence à partir d'iOS 10. Reportez-vous à la solution: stackoverflow.com/a/38241350/1634905
Pranoy C

Réponses:

172

Vous devrez peut-être mettre la NSPhotoLibraryUsageDescription dans votre plist. Comme

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

Consultez toutes les descriptions d'utilisation ici .

rockdaswift
la source
1
désolé comment avez-vous trouvé ce numéro de version?
Pranoy C
1
Sur le site Web de téléchargement iOS, je viens de résoudre avec la clé UsageDescription correcte.
rockdaswift
merci, votre réponse a résolu le problème tout de suite! c'est une nouvelle exigence depuis iOS 10. Bienvenue dans Stack overflow btw!
Pranoy C
Merci beaucoup! J'ai été brûlé par NSAppleMusicUsageDescription (accès à la bibliothèque musicale iTunes).
lifjoy le
4
@iomer j'ai résolu le problème, j'ai ajouté la clé dans info.plist, mais je ne l'ai pas vue sous Projet> Cible> Info. J'ai donc ajouté là aussi, et Apple a passé mon binaire. Cela m'est arrivé une fois auparavant avec un identifiant Facebook. Je ne sais pas pourquoi il n'y a pas été montré.
Raheel Sadiq
132

Dans iOS10, avant d'accéder à des données sensibles à la confidentialité telles que l'appareil photo, les contacts, etc., vous devez demander l'autorisation, sinon votre application se bloquera lorsque vous y accéderez.Ensuite, Xcode se connectera comme:

Cette application a planté, car elle a tenté d'accéder à des données sensibles à la confidentialité sans description d'utilisation. Le fichier Info.plist de l'application doit contenir une NSContactsUsageDescriptionclé 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, faites un clic droit dessus, ouvrez en tant que Source Code, collez ce code ci-dessous. Vous pouvez aussi ouvrir info.plistque Property Listpar défaut, cliquez sur le bouton Ajouter, Xcode vous donnera le suggérer complétions lors de la frappe Privacy - à l'aide du clavier ⬆️ et ⬇️.

N'oubliez pas d'écrire votre description de la raison pour laquelle vous demandez cette autorisation, entre <string>et </string>, ou 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:

entrez la description de l'image ici

puis nettoyez votre projet, exécutez-le.

Cliquez ici pour plus d'informations: iOS10AdaptationTips .

ElonChan
la source
2
Je n'ai utilisé de photos nulle part, et Apple rejette mon application, une idée ?. Je vérifie également tous les projets de pods
Raheel Sadiq
@RaheelSadiq N'oubliez pas d'écrire votre description des raisons pour lesquelles vous demandez cette autorisation, entre <string> et </string>, ou votre application sera rejetée par Apple.
ElonChan
23

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

Image .plist

Pritesh
la source
14

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

N'oubliez pas d'ajouter la valeur décrivant pourquoi l'application doit accéder au service.

entrez la description de l'image ici


la source
9

Dans iOS 10, Apple a changé la façon dont vous pouvez accéder à tous les types de données privées des utilisateurs.

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

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

GIF

Ou si vous souhaitez ajouter via, info.plistvous devez ajouter la clé NSPhotoLibraryUsageDescription .

Copiez et collez simplement la chaîne ci-dessous info.plist.

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

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

GIF

Ramkrishna Sharma
la source
1
et aussi <key>NSCameraUsageDescription</key> <string> Prendre la photo </string>
Nasir Khan