Спросите разрешения на доступ к фотопленке


У меня есть вид настроек, где пользователь может выбрать включение или выключение функции ' экспорт в Camera Roll'

когда пользователь включает его в первый раз (а не когда он делает первый снимок), я хотел бы, чтобы приложение попросило у него разрешение на доступ к рулону камеры.

Я видел поведение многих приложений, но не могу найти способ сделать это.

7 61

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
}
  • вам нужно будет решить, какую коллекцию носителей вы хотите использовать в качестве источника, это диктуется устройством, которое ваше приложение. будет работать и какая версия ОС он использует.

  • вы можете направить пользователя в настройки, если авторизация запрещена пользователь.