2015-12-28 2 views
0

Я использую следующий код, чтобы проверить и запросить авторизацию для камеры. Проблема заключается в следующем. Следующий сценарий приводит к состоянию неправильной авторизации:Разрешение камеры iOS - неправильный статус

  1. Пользователь снимает авторизацию в первый раз
  2. Прерывает App
  3. перезапускает приложение
  4. Листья заявки, разрешение грантов для камеры в настройках приложения
  5. возврат к приложению

[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?

+0

Я действительно не понимаю. 1) Пользователь запрещает доступ. 2) Приложение прекращено. 3) Пользователь предоставляет доступ в настройках. 4) При повторном запуске приложение получает разрешенный статус. Пока, так хорошо, это правильно. Но я не понимаю, что будет дальше, если вы считаете неправильным. Вы имеете в виду, что пользователь переходит к настройкам и отказывает в доступе _while, когда приложение работает_, и оно не влияет на текущий сеанс? – DarkDust

+0

Да, я имею в виду это. Пользователь denies => завершает приложение => перезапускает приложение => оставляет приложение в фоновом режиме (многозадачность) => переходит в приложение «Настройки» и изменяет авторизацию => возвращает в приложение (т. Е. Кнопка «Назад» в верхнем левом углу) => Статус остается «отрицательным» сообщено authorizationStatusForMediaType (пока камера работает так, как должна) => Завершает приложение => Перезапустить приложение => Статус принят. И наоборот. Кажется, что авторизация не будет обновляться. – Teddy

ответ

0

Это, как представляется, предполагаемое поведение. Если Apple захочет, чтобы вы реагировали на изменения авторизации во время выполнения, было бы уведомление о том, что оно изменилось.

Но прямо сейчас, there is no such notification (насколько я вижу). Вы просто вызываете +authorizationStatusForMediaType:, и он либо возвращает окончательный статус (например, отрицается, либо авторизован), либо возвращает AVAuthorizationStatusNotDetermined, чтобы сообщить вам, что вам необходимо запросить авторизацию через requestAccessForMediaType:completionHandler:.

К сожалению, это не авторитетный ответ; Я просто делаю выводы и угадываю здесь. Вы можете спросить на форуме разработчиков Apple и надеяться получить ответ от инженера Apple.

+0

Я понимаю, что такого уведомления нет. Но когда я запрашиваю с + authorizationStatusForMediaType: он должен вернуть правильный статус. Зачем мне нужен перезапуск приложения для правильного определения состояния? – Teddy

+0

Возможно, он кэширует значение и не знает, что изменилась фактическая авторизация. Поскольку нет способа получить информацию о таком изменении авторизации, IMHO хорошо, что значение стабильно на протяжении всего сеанса: в противном случае вам нужно будет запрашивать статус все время. Поскольку я не тестировал его: я думаю, если метод возвращает 'AVAuthorizationStatusAuthorized', вы можете получить доступ к камере, даже если пользователь изменил настройку? – DarkDust

+0

Да, но это так непоследовательно. Т.е.: сравните с услугами определения местоположения. Вы предоставляете разрешение, и оно распознается приложением.Что делает это очень тревожным, так это то, что пользователь увидит черный экран вместо получения правильного сообщения об ошибке. – Teddy

Смежные вопросы