Erro iOS 10 [acesso] <privado> ao usar UIImagePickerController

102

Estou usando o XCode 8 e testando com iOS 10.2 Beta.

Eu adicionei as estruturas Photos, PhotosUI e MobileCoreServices ao projeto.

Código muito simples:

#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 implementação:

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

Assim que toco no botão, o aplicativo trava com um erro muito inútil:

[access] <private>

É isso aí. Nada mais.

Usando instruções break, o aplicativo parece travar em "presentViewController".

Este é um aplicativo totalmente novo e não tenho mais nada na interface do usuário além do botão de captura.

Além disso, testando no iOS 9.3, isso funciona bem. Estou perdendo algo que pode ser alterado no iOS 10?

Pranoy C
fonte
Limpe e depois construa. Se não houver mudança, pode ser facilmente um bug no Xcode 8 ou no iOS 10 beta que será resolvido pela Apple em uma atualização futura. Costumo descobrir que é o caso - se for o último beta ou o lançamento do GM e ainda não estiver funcionando, então seria a hora de me preocupar em consertá-lo.
Jordan Smith
1
sim, o mesmo problema mesmo depois de limpar e excluir o aplicativo :(
Pranoy C
Eu não me estressaria com isso. É uma versão beta. É mais provável que seja um problema com o beta. Eu sugiro desenvolver no Xcode 7 até muito mais perto do lançamento.
Jordan Smith
ok faz sentido! obrigado @Jordan
Pranoy C
@Jordan parece que há um novo requisito a partir do iOS 10. consulte a solução: stackoverflow.com/a/38241350/1634905
Pranoy C

Respostas:

172

Pode ser necessário colocar NSPhotoLibraryUsageDescription em seu plist. Gostar

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

Verifique todas as descrições de uso aqui .

rockdaswift
fonte
1
desculpe, como você encontrou este número de lançamento?
Pranoy C
1
No site de downloads do iOS, resolvi apenas com a chave UsageDescription correta.
rockdaswift
obrigado, sua resposta resolveu o problema imediatamente! este é um novo requisito desde o iOS 10. Bem-vindo ao Stack overflow btw!
Pranoy C
Muito obrigado! Eu fui queimado por NSAppleMusicUsageDescription (acessando a biblioteca de música do iTunes).
Lifjoy
4
@iomer resolvi o problema, adicionei a chave em info.plist, mas não consegui vê-la em Projeto> Destino> Informações. Então eu adicionei lá também, e a Apple passou no meu binário. Já aconteceu comigo uma vez também com o ID do Facebook. Não sei porque não foi mostrado lá.
Raheel Sadiq
132

No iOS10, antes de acessar dados confidenciais como câmera, contatos e assim por diante, você deve pedir a autorização, ou seu aplicativo irá travar ao acessá-los. Então o Xcode irá registrar como:

Este aplicativo falhou porque tentou acessar dados confidenciais sem uma descrição de uso. O Info.plist do aplicativo deve conter uma NSContactsUsageDescriptionchave com um valor de string explicando ao usuário como o aplicativo usa esses dados.

Como lidar com isso?

Abra o arquivo em seu projeto chamado info.plist, clique com o botão direito nele, abrindo como Source Code, cole o código abaixo nele. Ou você pode abrir info.plistcomo Property Listpadrão, clique no botão adicionar, o Xcode lhe dará as conclusões sugeridas enquanto você digita Privacy - com a ajuda do teclado ⬆️ e ⬇️.

Lembre-se de escrever sua descrição do motivo pelo qual solicitou essa autorização, entre <string>e </string>, ou seu aplicativo será rejeitado pela 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 não funcionar, tente pedir a autorização de fundo:

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

Ou vá para target -> Capabilities -> Background Modes -> open the background Modes:

insira a descrição da imagem aqui

em seguida, limpe seu projeto e execute-o.

Acesse aqui para obter mais informações: iOS10AdaptationTips .

ElonChan
fonte
2
Não usei fotos em lugar nenhum, e a apple está rejeitando meu aplicativo, alguma ideia ?. Eu verifico todos os projetos de pods também
Raheel Sadiq
@RaheelSadiq Lembre-se de escrever sua descrição do motivo pelo qual solicitou essa autorização, entre <string> e </string>, ou seu aplicativo será rejeitado pela apple.
ElonChan
23

no iOS 10 você precisa adicionar a chave mencionada na imagem abaixo se estiver usando uma câmera ou galeria de fotos em seu aplicativo

imagem .plist

Pritesh
fonte
14

Você precisa adicionar as novas configurações de privacidade ao seu info.plist.

Não se esqueça de adicionar o valor que descreve por que o aplicativo precisa acessar o serviço.

insira a descrição da imagem aqui


fonte
9

No iOS 10, a Apple mudou a forma como você pode acessar qualquer tipo de dados privados do usuário.

Você precisa adicionar a chave Privacidade - Descrição de uso da biblioteca de fotos às Info.plistinformações de uso do seu aplicativo .

Para obter mais informações, encontre o GIF abaixo.

GIF

Ou, se quiser adicionar via info.plist, será necessário adicionar NSPhotoLibraryUsageDescription chave .

Basta copiar e colar a string abaixo info.plist.

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

Encontre o GIF abaixo para obter mais informações.

GIF

Ramkrishna Sharma
fonte
1
e também <key>NSCameraUsageDescription</key> <string> Tire a foto </string>
Nasir Khan