Вот полное руководство для iOS 8+ (без ALAssetLibrary):
Во-первых, мы должны предоставить описание использования, поскольку теперь это требуется PHPhotoLibrary.
Для этого мы должны открыть info.plist
файл, найти ключ Privacy - Photo Library Usage Description
и указать для него значение. Если ключа не существует, просто создайте его.
Вот изображение, например:
Также убедитесь, что значение ключа Bundle name
не пусто в info.plist
файле.
Теперь, когда у нас есть описание, мы обычно можем запросить авторизацию, вызвав requestAuthorization
метод:
[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;
}
}];
ПРИМЕЧАНИЕ 1: на requestAuthorization
самом деле оповещение не отображается при каждом вызове. Он отображается один раз в какое-то время, сохраняет ответ пользователя и возвращает его каждый раз вместо того, чтобы снова показывать предупреждение. Но поскольку это не то, что нам нужно, вот полезный код, который всегда показывает предупреждение каждый раз, когда нам нужно разрешение (с перенаправлением на настройки):
- (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];
}
}];
}
});
}
Распространенная проблема 1. Некоторые пользователи жалуются, что приложение не отображает предупреждение после внесения вышеупомянутых изменений в info.plist
файл.
Решение: для тестирования попробуйте перейти Bundle Identifier
с файла проекта на что-то другое, очистить и пересобрать приложение. Если заработало то все нормально, переименуйте обратно.
Распространенная проблема 2: существует конкретный случай, когда результаты выборки не обновляются (и представления, которые использовали изображения из этих запросов на выборку, по-прежнему пусты), когда приложение получает разрешения на фотографии во время работы, как было обещано в документации.
На самом деле это происходит, когда мы используем НЕПРАВИЛЬНЫЙ код, например:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
В этом случае, если пользователь отказался предоставлять разрешения, viewDidLoad
затем перешел к настройкам, разрешил и перешел обратно в приложение, представления не будут обновлены, потому что [self reloadCollectionView]
запросы на выборку не были отправлены.
Решение: нам просто нужно позвонить [self reloadCollectionView]
и выполнить другие запросы на выборку, прежде чем запрашивать авторизацию, например:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}