Aqui está um guia completo para iOS 8+ (sem ALAssetLibrary):
Em primeiro lugar, temos que fornecer uma descrição de uso, pois agora ela é exigida pelo PHPhotoLibrary.
Para fazer isso, devemos abrir o info.plist
arquivo, encontrar a chave Privacy - Photo Library Usage Description
e fornecer um valor para ela. Se a chave não existir, basta criá-la.
Aqui está uma imagem, por exemplo:
Certifique-se também de que o valor da chave Bundle name
não está vazio no info.plist
arquivo.
Agora, quando temos a descrição, podemos normalmente solicitar autorização chamando o requestAuthorization
método:
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
switch (status) {
case PHAuthorizationStatusAuthorized:
NSLog(@"PHAuthorizationStatusAuthorized");
break;
case PHAuthorizationStatusDenied:
NSLog(@"PHAuthorizationStatusDenied");
break;
case PHAuthorizationStatusNotDetermined:
NSLog(@"PHAuthorizationStatusNotDetermined");
break;
case PHAuthorizationStatusRestricted:
NSLog(@"PHAuthorizationStatusRestricted");
break;
}
}];
NOTA 1: requestAuthorization
na verdade não mostra alerta em todas as chamadas. Mostra uma vez a cada vez, salva a resposta do usuário e a retorna todas as vezes ao invés de mostrar o alerta novamente. Mas como não é o que precisamos, aqui está um código útil que sempre mostra alerta sempre que precisamos de permissão (com redirecionamento para as configurações):
- (void)requestAuthorizationWithRedirectionToSettings {
dispatch_async(dispatch_get_main_queue(), ^{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized)
{
//We have permission. Do whatever is needed
}
else
{
//No permission. Trying to normally request it
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status != PHAuthorizationStatusAuthorized)
{
//User don't give us permission. Showing alert with redirection to settings
//Getting description string from info.plist file
NSString *accessDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSPhotoLibraryUsageDescription"];
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:accessDescription message:@"To give permissions tap on 'Change Settings' button" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:cancelAction];
UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:@"Change Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}];
[alertController addAction:settingsAction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}
}];
}
});
}
Problema comum 1: Alguns usuários reclamam que o aplicativo não mostra alerta após fazer as alterações mencionadas acima no info.plist
arquivo.
Solução: Para testar, tente mudar Bundle Identifier
do arquivo de projeto para outro, limpe e reconstrua o aplicativo. Se começou a funcionar, então está tudo bem, renomeie-o novamente.
Problema comum 2: há alguns casos específicos em que os resultados de busca não são atualizados (e as visualizações que usaram imagens dessas solicitações de busca ainda estão vazias de acordo) quando o aplicativo obtém permissões para fotos, enquanto é executado conforme prometido na documentação.
Na verdade, isso acontece quando usamos código ERRADO como este:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
Nesse caso, se o usuário negou a concessão de permissões viewDidLoad
, saltou para as configurações, permitiu e voltou para o aplicativo, as visualizações não serão atualizadas porque as [self reloadCollectionView]
solicitações de busca não foram enviadas.
Solução: só precisamos ligar [self reloadCollectionView]
e fazer outras solicitações de busca antes de exigir uma autorização como esta:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}