Errore di iOS 10 [accesso] <privato> quando si utilizza UIImagePickerController


102

Sto usando XCode 8 e sto provando con iOS 10.2 Beta.

Ho aggiunto i framework Foto, PhotosUI e MobileCoreServices al progetto.

Codice molto semplice:

#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 implementazione:

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

Non appena tocco il pulsante, l'app si blocca con un errore molto inutile:

[access] <private>

Questo è tutto. Nient'altro.

Utilizzando le istruzioni break, l'app sembra bloccarsi in "presentViewController".

Questa è un'app nuova di zecca e non ho nient'altro nell'interfaccia utente oltre al pulsante di cattura.

Inoltre, testando su iOS 9.3, funziona bene. Mi manca qualcosa che potrebbe essere cambiato in iOS 10?


Pulisci e poi costruisci. In assenza di modifiche, potrebbe facilmente essere un bug in Xcode 8 o iOS 10 beta che verrà risolto da Apple in un futuro aggiornamento. Trovo spesso che sia così - se è l'ultima beta, o la versione GM e ancora non funziona, allora sarebbe il momento di preoccuparsi di risolverlo.
Jordan Smith

1
sì, stesso problema anche dopo aver pulito ed eliminato l'app :(
Pranoy C

Non lo sottolineerei. È una versione beta. È più probabile che si tratti di un problema con la beta. Suggerirei di sviluppare su Xcode 7 fino a quando sarà molto più vicino al rilascio.
Jordan Smith

ok ha senso! grazie @Jordan
Pranoy C

Sguardi @Jordan che ci sia un nuovo requisito di iOS 10. si riferiscono a una soluzione: stackoverflow.com/a/38241350/1634905
Pranoy C

Risposte:


172

Potrebbe essere necessario inserire NSPhotoLibraryUsageDescription nel tuo plist. Piace

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

Controllare tutte le descrizioni di utilizzo qui .


1
scusa come hai trovato questo numero di rilascio?
Pranoy C

1
Nel sito Web di download di iOS, ho appena risolto con la chiave UsageDescription corretta.
rockdaswift

grazie, la tua risposta ha risolto subito il problema! questo è un nuovo requisito da iOS 10. Benvenuto in Stack overflow btw!
Pranoy C

Grazie mille! Sono stato bruciato da NSAppleMusicUsageDescription (accedendo alla libreria musicale di iTunes).
lifjoy

4
@iomer ho risolto il problema, ho aggiunto la chiave in info.plist, ma non riuscivo a vederlo in Progetto> Destinazione> Informazioni. Quindi ho aggiunto anche lì e Apple ha passato il mio file binario. È successo anche a me una volta con l'ID di Facebook. Non so perché non è stato mostrato lì.
Raheel Sadiq

132

In iOS10, prima di accedere a dati sensibili alla privacy come Fotocamera, Contatti e così via, devi chiedere l'autorizzazione, altrimenti la tua app si bloccherà quando accederai. Quindi Xcode registrerà come:

Questa app si è arrestata in modo anomalo perché ha tentato di accedere a dati sensibili alla privacy senza una descrizione dell'utilizzo. Il file Info.plist dell'app deve contenere una NSContactsUsageDescriptionchiave con un valore stringa che spiega all'utente come l'app utilizza questi dati.

Come affrontarlo?

Apri il file nel tuo progetto denominato info.plist, fai clic con il pulsante destro del mouse, aprendolo come Source Code, incolla questo codice qui sotto. Oppure puoi aprire info.plistcome Property Listpredefinito, fare clic sul pulsante Aggiungi, Xcode ti darà i completamenti suggeriti durante la digitazione Privacy - con l'aiuto della tastiera ⬆️ e ⬇️.

Ricordati di scrivere la descrizione del motivo per cui chiedi questa autorizzazione, tra <string>e </string>, o la tua app verrà rifiutata da 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>

Se non funziona, prova a chiedere l'autorizzazione in background:

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

Oppure vai a target -> Capabilities -> Background Modes -> open the background Modes:

inserisci qui la descrizione dell'immagine

quindi pulisci il tuo progetto, eseguilo.

Vai a qui per maggiori informazioni: iOS10AdaptationTips .


2
Non ho usato foto da nessuna parte e Apple sta rifiutando la mia app, qualche idea ?. Controllo anche tutti i progetti dei pod
Raheel Sadiq,

@RaheelSadiq Ricordati di scrivere la descrizione del motivo per cui chiedi questa autorizzazione, tra il <string> e </string>, o la tua app verrà rifiutata da Apple.
ElonChan

23

in iOS 10 è necessario aggiungere la chiave menzionata nell'immagine sottostante se si utilizza la fotocamera o la galleria fotografica nella propria app

immagine .plist


14

È necessario aggiungere le nuove impostazioni sulla privacy a info.plist.

Non dimenticare di aggiungere il valore che descrive il motivo per cui l'app deve accedere al servizio.

inserisci qui la descrizione dell'immagine


9

In iOS 10, Apple ha cambiato il modo in cui puoi accedere a qualsiasi tipo di dati privati ​​dell'utente.

È necessario aggiungere la chiave Privacy - DescrizioneInfo.plist dell'utilizzo della libreria di foto alle informazioni sull'utilizzo della tua app .

Per ulteriori informazioni, trova la GIF di seguito.

GIF

Oppure, se si desidera aggiungere tramite, info.plistè necessario aggiungere NSPhotoLibraryUsageDescription chiave .

Basta copiare e incollare sotto la stringa in info.plist.

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

Si prega di trovare la GIF di seguito per ulteriori informazioni.

GIF


1
e anche <key>NSCameraUsageDescription</key> <string> Scatta la foto </string>
Nasir Khan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.