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