102

Utilizzo XCode 8 e test con iOS 10.2 Beta.Errore iOS 10 [accesso] <private> quando si utilizza UIImagePickerController

Ho aggiunto le strutture Foto, PhotosUI e MobileCoreServices da proiettare.

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 applicazione:

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

Appena si tocca il pulsante, l'applicazione si blocca con errore molto inutile:

[access] <private>

Questo è tutto. Nient'altro.

Utilizzando le istruzioni di interruzione, l'applicazione sembra bloccarsi su "presentViewController".

Questa è una nuova app e non ho nient'altro nell'interfaccia utente oltre al pulsante di selezione.

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

+0

Pulire e quindi costruire. Se nessuna modifica, potrebbe facilmente essere un bug in Xcode 8 o iOS 10 beta che verrà risolto da Apple in un futuro aggiornamento. Spesso capisco che questo è il caso - se è l'ultima beta, o la versione GM e ancora non funziona, allora sarebbe il momento di preoccuparsi di ripararlo. –

+1

sì, lo stesso problema anche dopo la pulizia e l'eliminazione della app :( –

+0

Non vorrei sottolineare a questo proposito.E 'una versione beta.Possibilità è che si tratti di un problema con la beta.Vorrei suggerire lo sviluppo su Xcode 7 fino a molto –

risposta

173

Potrebbe essere necessario inserire NSPhotoLibraryUsageDescription nel plist. Come

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

visualizzate tutte le descrizioni di utilizzo here.

+1

scusa come hai trovato questo numero di rilascio? –

+1

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

+0

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

131

In iOS10, Prima di accedere ai dati sensibili alla privacy come la fotocamera, contatti, e così via, è necessario chiedere l'autorizzazione, o la vostra applicazione andrà in crash quando si accede them.Then Xcode registrerà come:

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSContactsUsageDescription key with a string value explaining to the user how the app uses this data.

Come affrontare questo?

Aprire il file nel progetto info.plist, fare clic con il pulsante destro del mouse, aprendo come Source Code, incollare il codice riportato di seguito. Oppure puoi aprire info.plist come Property List per impostazione predefinita, fare clic sul pulsante aggiungi, Xcode ti darà i suggerimenti di completamento mentre digiti Privacy - con l'aiuto della tastiera ⬆️ e ⬇️.

Ricordatevi di scrivere il vostro descrizione perché si chiede tale autorizzazione, tra il <string> e </string>, o la vostra applicazione saranno respinte da Apple:

<!-- Photo Library --> 
<key>NSPhotoLibraryUsageDescription</key> 
<string>$(PRODUCT_NAME) photo use</string> 

<!-- Camera --> 
<key>NSCameraUsageDescription</key> 
<string>$(PRODUCT_NAME) camera use</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, provate a chiedere la lo sfondo autorizzazione:

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

o andare a target -> Capabilities -> Background Modes -> open the background Modes:

enter image description here

quindi pulire il progetto, eseguirlo.

Vai a qui per ulteriori informazioni: iOS10AdaptationTips.

+2

Ho usato le foto da nessuna parte e Apple sta rifiutando la mia app, qualche idea ?. Controllo anche tutti i progetti relativi ai pod –

+0

@RaheelSadiq Ricordarsi di scrivere la descrizione del motivo per cui si richiede questa autorizzazione, tra "" e "" o la tua app verrà rifiutata da Apple. – ElonChan

24

in iOS 10 è necessario aggiungere la chiave menzionata immagine qui sotto se si utilizza fotocamera o una galleria foto nella vostra app

.plist image

14

È necessario l'aggiungere le nuove impostazioni di privacy per voi info.plist .

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

enter image description here

10

in IOS 10, Apple ha cambiato il modo è possibile accedere a qualsiasi tipo di dati privati ​​degli utenti.

È necessario aggiungere la chiave Privacy - Descrizione della libreria di foto all'app Info.plist e le relative informazioni di utilizzo.

Per ulteriori informazioni, consultare la GIF di seguito.

GIF

Oppure, se si desidera aggiungere tramite info.plist allora avete bisogno di aggiungere NSPhotoLibraryUsageDescription chiave.

Basta copiare e incollare sotto stringa in info.plist.

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

Per ulteriori informazioni, consultare la GIF seguente.

GIF

+1

e anche NSCameraUsageDescription Scattare la foto