Я использую следующий код, чтобы проверить и запросить авторизацию для камеры. Проблема заключается в следующем. Следующий сценарий приводит к состоянию неправильной авторизации:Разрешение камеры iOS - неправильный статус
- Пользователь снимает авторизацию в первый раз
- Прерывает App
- перезапускает приложение
- Листья заявки, разрешение грантов для камеры в настройках приложения
- возврат к приложению
[AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]
AVAuthorizationStatusDeclined
вернется (санкционированный как сказано).
После завершения и возобновления результатов в AVAuthorizationStatusAuthorized
как следует. В этом случае пользователь переходит к настройкам и отказывает в доступе камеры, результат останется AVAuthorizationStatusAuthorized
до следующего перезапуска.
Любые идеи, что я пропущу здесь?
- (void) popCamera {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
//picker.allowsEditing = YES;
#if !(TARGET_IPHONE_SIMULATOR)
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
#endif
self.view.translatesAutoresizingMaskIntoConstraints = YES;
[self presentViewController:picker animated:YES completion:NULL];
}
- (void)camDenied
{
NSLog(@"%@", @"Denied camera access");
NSString *alertText;
NSString *alertButton;
BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL);
if (canOpenSettings)
{
alertText = LSS(@"DeniedCamera1");
SDCAlertView *alert = [[SDCAlertView alloc]
initWithTitle:LSS(@"DeniedCameraTitle")
message:alertText
delegate:self
cancelButtonTitle:LSS(@"Cancel")
otherButtonTitles:LSS(@"Goto"), nil];
alert.tag = 3491832;
[alert show];
}
else
{
alertText = LSS(@"DeniedCamera2");
SDCAlertView *alert = [[SDCAlertView alloc]
initWithTitle:LSS(@"DeniedCameraTitle")
message:alertText
delegate:self
cancelButtonTitle:LSS(@"Cancel")
otherButtonTitles:nil];
alert.tag = 3491832;
[alert show];
}
}
- (IBAction) onTakePhoto:(id)sender {
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if(authStatus == AVAuthorizationStatusAuthorized)
{
[self popCamera];
}
else if(authStatus == AVAuthorizationStatusNotDetermined)
{
NSLog(@"%@", @"Camera access not determined. Ask for permission.");
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted)
{
if(granted)
{
[self popCamera];
}
else
{
[self camDenied];
}
}];
}
else if (authStatus == AVAuthorizationStatusRestricted)
{
SDCAlertView *alert = [[SDCAlertView alloc]
initWithTitle:LSS(@"RestrictCameraTitle")
message:LSS(@"RestrictCamera")
delegate:self
cancelButtonTitle:LSS(@"OK")
otherButtonTitles:nil];
}
else
{
[self camDenied];
}
}
Кредиты для исходного кода: Is there a way to ask user for Camera access after they have already denied it on iOS 8?
Я действительно не понимаю. 1) Пользователь запрещает доступ. 2) Приложение прекращено. 3) Пользователь предоставляет доступ в настройках. 4) При повторном запуске приложение получает разрешенный статус. Пока, так хорошо, это правильно. Но я не понимаю, что будет дальше, если вы считаете неправильным. Вы имеете в виду, что пользователь переходит к настройкам и отказывает в доступе _while, когда приложение работает_, и оно не влияет на текущий сеанс? – DarkDust
Да, я имею в виду это. Пользователь denies => завершает приложение => перезапускает приложение => оставляет приложение в фоновом режиме (многозадачность) => переходит в приложение «Настройки» и изменяет авторизацию => возвращает в приложение (т. Е. Кнопка «Назад» в верхнем левом углу) => Статус остается «отрицательным» сообщено authorizationStatusForMediaType (пока камера работает так, как должна) => Завершает приложение => Перезапустить приложение => Статус принят. И наоборот. Кажется, что авторизация не будет обновляться. – Teddy