Błąd systemu iOS 10 [dostęp] <private> podczas korzystania z UIImagePickerController

102

Używam XCode 8 i testuję z iOS 10.2 Beta.

Dodałem do projektu frameworki Photos, PhotosUI i MobileCoreServices.

Bardzo prosty kod:

#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

i realizacja:

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

Jak tylko kliknę przycisk, aplikacja zawiesza się z bardzo bezużytecznym błędem:

[access] <private>

Otóż ​​to. Nic więcej.

Korzystając z instrukcji break, aplikacja wydaje się zawieszać pod adresem „presentViewController”.

To zupełnie nowa aplikacja i nie mam nic innego w interfejsie użytkownika poza przyciskiem pobierania.

Również testowanie na iOS 9.3 działa dobrze. Czy brakuje mi czegoś, co można by zmienić w iOS 10?

Pranoy C
źródło
Wyczyść, a następnie zbuduj. Jeśli nie ma zmian, może to być błąd w Xcode 8 lub iOS 10 beta, który zostanie rozwiązany przez Apple w przyszłej aktualizacji. Często tak jest - jeśli jest to ostatnia beta lub wydanie GM i nadal nie działa, to byłby czas, aby się martwić o naprawienie tego.
Jordan Smith,
1
tak, ten sam problem nawet po wyczyszczeniu i usunięciu aplikacji :(
Pranoy C
Nie stresowałbym się tym. To jest wersja beta. Jest bardziej prawdopodobne, że jest to problem z wersją beta. Sugerowałbym programowanie na Xcode 7, aż do wydania znacznie bliżej.
Jordan Smith,
ok ma sens! dziękuję @Jordan
Pranoy C
@Jordan wygląda na to, że od iOS 10 pojawiły się nowe wymagania, patrz rozwiązanie: stackoverflow.com/a/38241350/1634905
Pranoy C

Odpowiedzi:

172

Może być konieczne umieszczenie NSPhotoLibraryUsageDescription w pliku plist. Lubić

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

Sprawdź wszystkie opisy użycia tutaj .

rockdaswift
źródło
1
przepraszam, jak znalazłeś ten numer wydania?
Pranoy C
1
W witrynie pobierania na iOS właśnie rozwiązałem, używając prawidłowego klucza UsageDescription.
rockdaswift
dziękuję, Twoja odpowiedź od razu rozwiązała problem! jest to nowy wymóg od iOS 10. Przy okazji, witamy w przepełnieniu stosu!
Pranoy C
Dzięki wielkie! Zostałem spalony przez NSAppleMusicUsageDescription (dostęp do biblioteki muzycznej iTunes).
lifjoy
4
@iomer Naprawiłem problem, dodałem klucz w info.plist, ale nie mogłem go zobaczyć w Project> Target> Info. Więc dodałem tam również i Apple przeszedł mój plik binarny. Zdarzyło mi się to już raz z Facebook ID. Nie wiem, dlaczego go tam nie pokazano.
Raheel Sadiq,
132

W systemie iOS10, zanim uzyskasz dostęp do danych wrażliwych na prywatność, takich jak aparat, kontakty itp., Musisz poprosić o autoryzację, w przeciwnym razie Twoja aplikacja ulegnie awarii podczas uzyskiwania do nich dostępu.

Ta aplikacja uległa awarii, ponieważ próbowała uzyskać dostęp do danych wrażliwych na prywatność bez opisu użytkowania. Aplikacja Info.plist musi zawierać NSContactsUsageDescriptionklucz z wartością ciągu wyjaśniającą użytkownikowi, w jaki sposób aplikacja wykorzystuje te dane.

Jak sobie z tym poradzić?

Otwórz plik w swoim projekcie o nazwie info.plist, kliknij go prawym przyciskiem myszy, otwierając jako Source Code, wklej poniższy kod do niego. Czy można otworzyć info.plistjako Property Listdomyślnie, kliknij przycisk Add, Xcode daje sugerować uzupełnienia podczas pisania Privacy - za pomocą klawiatury ⬆️ i ⬇️.

Pamiętaj, aby opisać, dlaczego prosisz o tę autoryzację w okresie od <string>do </string>, lub Twoja aplikacja zostanie odrzucona przez 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>

Jeśli to nie zadziała, spróbuj poprosić o autoryzację w tle:

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

Lub przejdź do target -> Capabilities -> Background Modes -> open the background Modes:

wprowadź opis obrazu tutaj

następnie wyczyść projekt, uruchom go.

Przejdź tutaj, aby uzyskać więcej informacji: iOS10 AdaptationTips .

ElonChan
źródło
2
Nigdzie nie korzystałem ze zdjęć, a Apple odrzuca moją aplikację, jakiś pomysł? Sprawdzam również wszystkie projekty strąków
Raheel Sadiq
@RaheelSadiq Pamiętaj, aby opisać, dlaczego prosisz o tę autoryzację w okresie od <string> do </string>, lub Twoja aplikacja zostanie odrzucona przez Apple.
ElonChan,
23

w iOS 10 musisz dodać klucz wymieniony na poniższym obrazku, jeśli używasz aparatu lub galerii zdjęć w swojej aplikacji

Obraz .plist

Pritesh
źródło
14

Musisz dodać nowe ustawienia prywatności do ciebie info.plist.

Nie zapomnij dodać wartości opisującej, dlaczego aplikacja musi mieć dostęp do usługi.

wprowadź opis obrazu tutaj


źródło
9

W iOS 10 firma Apple zmieniła sposób uzyskiwania dostępu do prywatnych typów danych użytkownika.

Musisz dodać klucz Prywatność - opis użycia biblioteki zdjęć do informacji o swojej aplikacji Info.plisti ich użyciu.

Więcej informacji znajdziesz w poniższym pliku GIF.

GIF

Lub jeśli chcesz dodać przez info.plist, musisz dodać klucz NSPhotoLibraryUsageDescription .

Po prostu skopiuj i wklej poniższy ciąg info.plist.

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

Aby uzyskać więcej informacji, znajdź poniższy GIF.

GIF

Ramkrishna Sharma
źródło
1
a także <key>NSCameraUsageDescription</key> <string> Zrób zdjęcie </string>
Nasir Khan,