objective-c - tutorial - objective c vs swift
Pide permiso para acceder a Camera Roll (7)
Desde iOS 10 también necesitamos proporcionar una descripción del uso de la biblioteca de fotos en el archivo info.plist
que describí there . Y luego use este código para que aparezca la alerta cada vez que necesitamos:
- (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];
}
}];
}
});
}
También hay algunos casos comunes cuando la alerta no aparece. Para evitar copiar, me gustaría que echara un vistazo a esta there .
Tengo una vista de configuración donde el usuario puede elegir activar o desactivar la función " Exportar a Camera Roll "
Cuando el usuario lo enciende por primera vez (y no cuando toma la primera foto), me gustaría que la aplicación le pidiera permiso para acceder al rollo de la cámara.
He visto comportamientos en muchas aplicaciones pero no puedo encontrar la manera de hacerlo.
Desde iOS 8 con uso del marco de fotos :
Swift 3.0 :
PHPhotoLibrary.requestAuthorization { status in
switch status {
case .authorized:
<#your code#>
case .restricted:
<#your code#>
case .denied:
<#your code#>
default:
// place for .notDetermined - in this callback status is already determined so should never get here
break
}
}
Objective-C :
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
switch (status) {
case PHAuthorizationStatusAuthorized:
<#your code#>
break;
case PHAuthorizationStatusRestricted:
<#your code#>
break;
case PHAuthorizationStatusDenied:
<#your code#>
break;
default:
break;
}
}];
Nota importante de la documentation :
Este método siempre vuelve inmediatamente. Si el usuario ha otorgado o denegado previamente el permiso de acceso a la biblioteca de fotos, ejecuta el bloqueo del controlador cuando se le llama; de lo contrario, muestra una alerta y ejecuta el bloqueo solo después de que el usuario haya respondido a la alerta.
La primera vez que el usuario intenta escribir en el rollo de la cámara en ios 6, se le solicita permiso automáticamente. No es necesario agregar código adicional (antes de que el estado de autorización sea ALAuthorizationStatusNotDetermined).
Si el usuario niega la primera vez, no puede volver a preguntar (que yo sepa). El usuario debe cambiar manualmente la configuración específica de la aplicación en la sección de configuración-> privacidad-> fotos.
Hay otra opción y es que el usuario no puede dar permiso debido a otras restricciones como el control parental, en ese caso el estado es ALAuthorizationStatusRestricted
No estoy seguro de que exista algún método de compilación para esto, pero una forma fácil sería utilizar ALAssetsLibrary para obtener información de la biblioteca de fotos cuando encienda la función. Luego, puede simplemente anular la información que haya obtenido, y le habrá pedido al usuario que acceda a sus fotos.
El siguiente código, por ejemplo, no hace más que obtener el número de fotos en el rollo de la cámara, pero será suficiente para activar el aviso de permiso.
#import <AssetsLibrary/AssetsLibrary.h>
ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init];
[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
NSLog(@"%zd", [group numberOfAssets]);
} failureBlock:^(NSError *error) {
if (error.code == ALAssetsLibraryAccessUserDeniedError) {
NSLog(@"user denied access, code: %zd", error.code);
} else {
NSLog(@"Other error code: %zd", error.code);
}
}];
EDITAR: Simplemente se topó con esto, a continuación se muestra cómo puede verificar el estado de autorización de sus aplicaciones para acceder a álbumes de fotos.
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
if (status != ALAuthorizationStatusAuthorized) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Attention" message:@"Please give this app permission to access your photo library in your settings app!" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];
[alert show];
}
Rápido:
import AssetsLibrary
var status:ALAuthorizationStatus = ALAssetsLibrary.authorizationStatus()
if status != ALAuthorizationStatus.Authorized{
println("User has not given authorization for the camera roll")
}
iOS 9.2.1, Xcode 7.2.1, ARC habilitado
''ALAuthorizationStatus'' está en desuso: primero en desuso en iOS 9.0 - Use PHAuthorizationStatus en el marco de Photos en su lugar
Por favor, consulte esta publicación para una solución actualizada:
Determine si el acceso a la biblioteca de fotos está configurado o no - PHPhotoLibrary (iOS 8)
Notas clave:
- Lo más probable es que esté diseñando para iOS7.0 + a partir de la fecha de hoy, debido a este hecho, necesitará manejar tanto
ALAuthorizationStatus
comoPHAuthorizationStatus
.
Lo más fácil es hacer ...
if ([PHPhotoLibrary class])
{
//Use the Photos framework
}
else
{
//Use the Asset Library framework
}
Tendrá que decidir qué colección de medios desea utilizar como su fuente, esto es dictado por el dispositivo que su aplicación. se ejecutará en y qué versión de sistema operativo está utilizando.
Es posible que desee dirigir al usuario a la configuración si la autorización es denegada por el usuario.
#import <AssetsLibrary/AssetsLibrary.h>
//////
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
switch (status) {
case ALAuthorizationStatusRestricted:
{
//Tell user access to the photos are restricted
}
break;
case ALAuthorizationStatusDenied:
{
// Tell user access has previously been denied
}
break;
case ALAuthorizationStatusNotDetermined:
case ALAuthorizationStatusAuthorized:
// Try to show image picker
myPicker = [[UIImagePickerController alloc] init];
myPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
myPicker.delegate = self;
[self presentViewController: myPicker animated:YES completion:NULL];
break;
default:
break;
}