Ось повний посібник для 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: Існує певний конкретний випадок, коли результати завантаження не оновлюються (а представлення, які використовували зображення з цих запитів на отримання даних, все ще порожні відповідно), коли програма отримує дозволи на фотографії, працюючи так, як це було обіцяно в документації.
Насправді це відбувається, коли ми використовуємо такий код WRONG :
- (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)
{
// ...
}