Спросите разрешения на доступ к фотопленке
У меня есть вид настроек, где пользователь может выбрать включение или выключение функции ' экспорт в Camera Roll'
когда пользователь включает его в первый раз (а не когда он делает первый снимок), я хотел бы, чтобы приложение попросило у него разрешение на доступ к рулону камеры.
Я видел поведение многих приложений, но не могу найти способ сделать это.
7 ответов:
Я не уверен, есть ли какой-то встроенный метод для этого, но простой способ-использовать ALAssetsLibrary, чтобы вытащить какой-то бессмысленный бит информации из библиотеки фотографий при включении этой функции. Тогда вы можете просто аннулировать то, что когда-либо информацию вы вытащили, и вы будете запрашивать у пользователя доступ к своим фотографиям.
следующий код, например, не делает ничего больше, чем получить количество фотографий в рулоне камеры, но будет достаточно, чтобы вызвать разрешение быстрый.
#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); } }];
EDIT: просто наткнулся на это, как вы можете проверить статус разрешения приложениям получать доступ фотоальбомы.
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]; }
начиная с iOS 8 с рамки для фотографий использование:
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 } }
С:
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { switch (status) { case PHAuthorizationStatusAuthorized: <#your code#> break; case PHAuthorizationStatusRestricted: <#your code#> break; case PHAuthorizationStatusDenied: <#your code#> break; default: break; } }];
важное примечание от документация:
этот метод всегда возвращается немедленно. Если пользователь ранее предоставил или отказал в доступе к библиотеке фотографий, он выполняет блок обработчика при вызове; в противном случае он отображает предупреждение и выполняет только блок после того, как пользователь ответил на предупреждение.
начиная с iOS 10 нам также необходимо предоставить описание использования библиотеки фотографий в
info.plist
файл, который я описал здесь. А затем просто используйте этот код, чтобы сделать предупреждение появляется каждый раз, когда нам нужно:- (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]; } }]; } }); }
также есть некоторые общие случаи, когда предупреждение не появляется. Чтобы избежать копирования, я хотел бы, чтобы вы взглянули на это ответ.
при первой попытке записи в Camera roll на ios 6 у пользователя автоматически запрашивается разрешение. Вам не нужно добавлять дополнительный код (до этого authorisationstatus является ALAuthorizationStatusNotDetermined ).
Если пользователь отрицает в первый раз, вы не можете спросить снова (насколько я знаю). Пользователь должен вручную изменить эту настройку приложения в разделе Настройки - > Конфиденциальность - > фотографии.
есть еще один вариант, и то, что он пользователь не может дать разрешение из-за других ограничений, таких как родительский контроль, в этом случае статус ALAuthorizationStatusRestricted
Swift:
import AssetsLibrary var status:ALAuthorizationStatus = ALAssetsLibrary.authorizationStatus() if status != ALAuthorizationStatus.Authorized{ println("User has not given authorization for the camera roll") }
#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; }
iOS 9.2.1, Xcode 7.2.1, ARC enabled
' ALAuthorizationStatus ' устарел: первый устарел в iOS 9.0 - Используйте PHAuthorizationStatus в рамках фотографий вместо
пожалуйста, смотрите этот пост для обновленного решения:
определите, установлен ли доступ к библиотеке фотографий - PHPhotoLibrary (iOS 8)
ключевые особенности:
- скорее всего вы проектирование для iOS7. 0+ по состоянию на сегодняшнюю дату, из-за этого вам нужно будет обрабатывать оба
ALAuthorizationStatus
иPHAuthorizationStatus
.проще всего это сделать...
if ([PHPhotoLibrary class]) { //Use the Photos framework } else { //Use the Asset Library framework }
вам нужно будет решить, какую коллекцию носителей вы хотите использовать в качестве источника, это диктуется устройством, которое ваше приложение. будет работать и какая версия ОС он использует.
вы можете направить пользователя в настройки, если авторизация запрещена пользователь.