Вот полное руководство для 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)
{
// ...
}