iOS 10-Fehler [Zugriff] <privat> bei Verwendung von UIImagePickerController

102

Ich verwende XCode 8 und teste mit iOS 10.2 Beta.

Ich habe die Frameworks Photos, PhotosUI und MobileCoreServices zum Projekt hinzugefügt.

Sehr einfacher Code:

#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

und Umsetzung:

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

Sobald ich auf die Schaltfläche tippe, stürzt die App mit einem sehr nutzlosen Fehler ab:

[access] <private>

Das ist es. Nichts anderes.

Mit break-Anweisungen scheint die App bei "presentViewController" abzustürzen.

Dies ist eine brandneue App und ich habe nichts anderes in der Benutzeroberfläche als den Grab-Button.

Auch beim Testen unter iOS 9.3 funktioniert dies einwandfrei. Vermisse ich etwas, das in iOS 10 geändert werden könnte?

Pranoy C.
quelle
Reinigen und dann bauen. Wenn sich nichts ändert, kann dies leicht ein Fehler in Xcode 8 oder der iOS 10-Beta sein, der von Apple in einem zukünftigen Update behoben wird. Ich finde oft, dass dies der Fall ist - wenn es die letzte Beta oder die GM-Version ist und sie immer noch nicht funktioniert, wäre es an der Zeit, sich Gedanken über die Behebung zu machen.
Jordan Smith
1
Ja, das gleiche Problem auch nach dem Bereinigen und Löschen der App :(
Pranoy C
Ich würde es nicht betonen. Es ist eine Beta-Version. Es ist wahrscheinlicher, dass es sich um ein Problem mit der Beta handelt. Ich würde vorschlagen, auf Xcode 7 zu entwickeln, bis die Veröffentlichung näher rückt.
Jordan Smith
ok macht Sinn! danke @Jordan
Pranoy C
@ Jordan sieht aus wie es eine neue Anforderung ab iOS 10 gibt. Siehe
Pranoy C

Antworten:

172

Möglicherweise müssen Sie die NSPhotoLibraryUsageDescription in Ihre Liste aufnehmen. Mögen

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

Überprüfen Sie alle Verwendungsbeschreibungen hier .

rockdaswift
quelle
1
Entschuldigung, wie haben Sie diese Versionsnummer gefunden?
Pranoy C
1
Auf der iOS-Download-Website habe ich gerade mit dem richtigen UsageDescription-Schlüssel gelöst.
Rockdaswift
Vielen Dank, Ihre Antwort hat das Problem sofort gelöst! Dies ist eine neue Anforderung seit iOS 10. Willkommen beim Stapelüberlauf übrigens!
Pranoy C
Vielen Dank! Ich wurde von NSAppleMusicUsageDescription (Zugriff auf die iTunes-Musikbibliothek) verbrannt.
Lebensfreude
4
@iomer Ich habe das Problem behoben. Ich habe den Schlüssel in info.plist hinzugefügt, konnte ihn aber unter Projekt> Ziel> Info nicht sehen. Also habe ich auch dort hinzugefügt und Apple hat meine Binärdatei bestanden. Das ist mir auch schon mal mit Facebook ID passiert. Ich weiß nicht, warum es dort nicht gezeigt wurde.
Raheel Sadiq
132

Bevor Sie in iOS10 auf datenschutzrelevante Daten wie Kamera, Kontakte usw. zugreifen, müssen Sie nach der Autorisierung fragen. Andernfalls stürzt Ihre App ab, wenn Sie darauf zugreifen. Anschließend protokolliert Xcode wie folgt:

Diese App ist abgestürzt, weil versucht wurde, auf datenschutzrelevante Daten ohne Verwendungsbeschreibung zuzugreifen. Die Info.plist der App muss einen NSContactsUsageDescriptionSchlüssel mit einem Zeichenfolgenwert enthalten, der dem Benutzer erklärt, wie die App diese Daten verwendet.

Wie gehe ich damit um?

Öffnen Sie die Datei in Ihrem Projektnamen info.plist, klicken Sie mit der rechten Maustaste darauf und öffnen Sie sie Source Code. Fügen Sie diesen Code unten ein. Oder Sie können öffnen , info.plistwie Property Liststandardmäßig, klicken Sie auf die Schaltfläche Hinzufügen, Xcode geben Ihnen die vorschlagen Vervollständigungen während der Eingabe Privacy - mit Hilfe der Tastatur ⬆️ und ⬇️.

Denken Sie daran, Ihre Beschreibung zu schreiben, warum Sie zwischen <string>und um diese Autorisierung bitten </string>, oder Ihre App wird von Apple abgelehnt:

<!-- 🖼 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>

Wenn dies nicht funktioniert, fragen Sie nach der Hintergrundautorisierung:

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

Oder gehen Sie zu target -> Capabilities -> Background Modes -> open the background Modes:

Geben Sie hier die Bildbeschreibung ein

Bereinigen Sie dann Ihr Projekt und führen Sie es aus.

Weitere Informationen finden Sie hier: iOS10AdaptationTips .

ElonChan
quelle
2
Ich habe nirgendwo Fotos verwendet und Apple lehnt meine App ab. Ich überprüfe auch alle Pods-Projekte
Raheel Sadiq
@RaheelSadiq Denken Sie daran, Ihre Beschreibung zu schreiben, warum Sie zwischen <string> und um diese Autorisierung bitten </string>, oder Ihre App wird von Apple abgelehnt.
ElonChan
23

In iOS 10 müssen Sie den im folgenden Bild genannten Schlüssel hinzufügen, wenn Sie eine Kamera oder eine Fotogalerie in Ihrer App verwenden

.plist Bild

Pritesh
quelle
14

Sie müssen die neuen Datenschutzeinstellungen zu Ihrer info.plist hinzufügen.

Vergessen Sie nicht, den Wert hinzuzufügen, der beschreibt, warum die App auf den Dienst zugreifen muss.

Geben Sie hier die Bildbeschreibung ein


quelle
9

In iOS 10 hat Apple geändert, wie Sie auf private Datentypen von Benutzern zugreifen können.

Sie müssen den Schlüssel " Datenschutz - Fotobibliothek - Nutzungsbeschreibung" zu den App- Info.plistund Nutzungsinformationen Ihrer App hinzufügen .

Weitere Informationen finden Sie im folgenden GIF.

GIF

Wenn Sie über hinzufügen möchten, info.plistmüssen Sie den NSPhotoLibraryUsageDescription- Schlüssel hinzufügen .

Kopieren Sie einfach die Zeichenfolge und fügen Sie sie ein info.plist.

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

Weitere Informationen finden Sie im folgenden GIF.

GIF

Ramkrishna Sharma
quelle
1
und auch <key>NSCameraUsageDescription </ key> <string> Machen Sie das Foto </ string>
Nasir Khan