Aquí hay una guía completa para iOS 8+ (sin ALAssetLibrary):
En primer lugar, debemos proporcionar una descripción de uso , ya que ahora es requerida por PHPhotoLibrary.
Para hacer esto debemos abrir el info.plist
archivo, buscar la clave Privacy - Photo Library Usage Description
y darle un valor. Si la clave no existe, créala.
Aquí hay una imagen por ejemplo:
También asegúrese de que el valor de la clave Bundle name
no esté vacío eninfo.plist
archivo.
Ahora que tenemos una descripción, normalmente podemos solicitar autorización llamando al 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: en requestAuthorization
realidad, no muestra alerta en cada llamada. Se muestra una vez cada cierto tiempo, guarda la respuesta del usuario y la devuelve cada vez en lugar de mostrar la alerta nuevamente. Pero como no es lo que necesitamos, aquí hay un código útil que siempre muestra una alerta cada vez que necesitamos permiso (con redirección a la configuración):
- (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 común 1: algunos usuarios se quejan de que la aplicación no muestra una alerta después de realizar los cambios mencionados anteriormente en el info.plist
archivo.
Solución: Para probar, intente cambiar Bundle Identifier
del archivo del proyecto a otra cosa, limpie y reconstruya la aplicación. Si comenzó a funcionar, entonces todo está bien, cámbiele el nombre.
Problema común 2: hay un caso específico en el que los resultados de recuperación no se actualizan (y las vistas que usaron imágenes de esas solicitudes de recuperación siguen vacías en consecuencia) cuando la aplicación obtiene permisos para las fotos, mientras se ejecuta como se prometió en la documentación.
En realidad sucede cuando usamos código INCORRECTO 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];
// ...
}];
}
// ...
}
En este caso, si el usuario negó otorgar permisos y viewDidLoad
luego saltó a la configuración, permitió y saltó de nuevo a la aplicación, las vistas no se actualizarán porque [self reloadCollectionView]
no se enviaron las solicitudes de recuperación.
Solución: solo tenemos que llamar [self reloadCollectionView]
y realizar otras solicitudes de recuperación antes de requerir una autorización como esta:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}