PHPhotoLibrary запрос Авторизация, не запрашивая
Для тестирования я пытался воссоздать всплывающее окно с системой "Запрос доступа".
Обновить:
В iOS 11 после удаления приложения всплывающее окно системы будет отображаться снова.
(предыдущий вопрос)
При первом запуске приложения (и единственном) показывалось всплывающее окно с запросом доступа. После этого даже не удаление приложения и перезапуск устройства снова вызовут это всплывающее окно.
Другими словами, устройство "запоминает" запрос пользователя, и нет способа его сбросить.
Вот код:
[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;
}
}];
Когда доступ отключен в настройках, он продолжает печатать "PHAuthorizationStatusDenied". Но не представляет никакого всплывающего окна. Возвращается немедленно.
Было предложено добавить "отображаемое имя пакета" в список. Пробовал безрезультатно, с пустым значением $(PRODUCT_NAME) и разными строками.
Очистил проект, удалил DrivedData (и удаляю приложение из симулятора каждый раз). Неудачно.
Больше информации:
Пример кода Apple "SamplePhotosApp", вылетает, когда вы отключаете доступ к фотографиям в настройках.
2 ответа
После дальнейшего прочтения, это, кажется, было разработано.
От Apple:
Этот метод всегда возвращается немедленно. Если пользователь ранее предоставил или отказал в доступе к библиотеке фотографий, он выполняет блок обработчика при вызове; в противном случае он отображает предупреждение и выполняет блок только после того, как пользователь ответил на предупреждение.
Говоря "Этот метод всегда возвращается немедленно", если пользователь был приглашен один раз. После этого он не будет показывать запрос снова. Похоже, нет никакого способа (но некоторые пользовательские сообщения) снова использовать системное сообщение.
Важно добавить это в файл Info.plist вашего приложения. "Конфиденциальность - описание использования библиотеки фотографий"
Я использовал что-то вроде этого: "Используется для доступа к фотографиям в библиотеке фотографий".
Это описание должно отображаться в окне запроса запрошенного доступа. Может быть локализован, если хотите.
+ (void)imageLibraryCheckAccess:(UIViewController *)presenting
handler:(void (^)(PHAuthorizationStatus status))handler
{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusNotDetermined) {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status != PHAuthorizationStatusAuthorized) {
if (handler != nil)
handler(status);
NSString *title = NSLocalizedStringWithDefaultValue(@"photo.library.access.disabled.alert.title",
@"Localizable", [NSBundle mainBundle],
@"Photos access", @"Alert title.");
NSString *text = NSLocalizedStringWithDefaultValue(@"photo.library.access.disabled.alert.text",
@"Localizable", [NSBundle mainBundle],
@"You explicitly disabled photo library access. This results in inability to work with photos.",
@"Alert text.");
[self alertWithPresenting:presenting title:title text:text buttons:@[[L10n okButton]]
handler:nil];
} else if (status == PHAuthorizationStatusAuthorized) {
if (handler != nil)
handler(status);
}
}];
} else if (status != PHAuthorizationStatusAuthorized) {
if (handler != nil)
handler(status);
NSString *title = NSLocalizedStringWithDefaultValue(@"photo.library.access.notauthorized.alert.title",
@"Localizable", [NSBundle mainBundle],
@"Photos access", @"Alert title.");
NSString *text = NSLocalizedStringWithDefaultValue(@"photo.library.access.notauthorized.alert.text",
@"Localizable", [NSBundle mainBundle],
@"Photo library access is disabled. Please check the application permissions or parental control settings in order to work with photos.", @"Alert text.");
[self alertWithPresenting:presenting title:title text:text buttons:@[[L10n okButton]]
handler:nil];
} else if (status == PHAuthorizationStatusAuthorized) {
if (handler != nil)
handler(status);
}
}
И вот как я это использую:
[YourClassName imageLibraryCheckAccess:self handler:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized) {
}
}];
Удачи!