Pedir permiso para acceder a Camera Roll

Tengo una vista de configuración en la que el usuario puede elegir activar o desactivar la función ‘ Exportar a carrete de la cámara

Cuando el usuario lo enciende por primera vez (y no cuando toma la primera foto), me gustaría que la aplicación le pida permiso para acceder al carrete de la cámara.

He visto comportamiento en muchas aplicaciones pero no puedo encontrar la manera de hacerlo.

No estoy seguro de si hay algún método de comstackción en esto, pero una manera fácil sería usar ALAssetsLibrary para extraer algo de información sin sentido de la biblioteca de fotos cuando encienda la función. Entonces puede simplemente anular cualquier información que haya extraído, y habrá solicitado al usuario el acceso 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  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: Acabo de tropezar con esto, a continuación se muestra cómo puede verificar el estado de autorización de sus aplicaciones para acceder a los á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]; } 

Desde iOS 8 con Photos Framework, use:

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 documentación :

Este método siempre regresa inmediatamente. Si el usuario ha concedido o denegado previamente el permiso de acceso a la biblioteca de fotos, ejecuta el bloque de controlador cuando se le llama; de lo contrario, muestra una alerta y ejecuta el locking solo después de que el usuario haya respondido a la alerta.

Desde iOS 10 también necesitamos proporcionar una descripción del uso de la biblioteca de fotos en el archivo info.plist que describí allí . Y luego solo use este código para que la alerta aparezca cada vez que necesitemos:

 - (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 eche un vistazo a esta respuesta .

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 tiene que agregar código adicional (antes de eso, el estado de autorización es ALAuthorizationStatusNotDetermined).

Si el usuario niega la primera vez, no puede volver a preguntar (hasta donde yo sé). El usuario debe cambiar manualmente la configuración específica de la aplicación en la sección 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

Rápido:

 import AssetsLibrary var status:ALAuthorizationStatus = ALAssetsLibrary.authorizationStatus() if status != ALAuthorizationStatus.Authorized{ println("User has not given authorization for the camera roll") } 
 #import  

//////

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

iOS 9.2.1, Xcode 7.2.1, ARC habilitado

‘ALAuthorizationStatus’ está en desuso: primero se desaprobó en iOS 9.0 – Use PHAuthorizationStatus en el marco de Fotos en su lugar

Por favor, mira 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, deberá manejar tanto ALAuthorizationStatus como PHAuthorizationStatus .

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 usar como fuente, esto es dictado por el dispositivo que su aplicación. se ejecutará y qué versión de sistema operativo está utilizando.

  • Es posible que desee dirigir al usuario a la configuración si el usuario deniega la autorización.