Как отказаться от камеры macOS, микрофона

#swift #macos

#swift #macos

Вопрос:

При попытке закодировать прототип, мне кажется, что нет способа отменить запрос?

Итак, вы добавляете интересующие вас права к возможностям вашего приложения, и вот я проверяю:

 internal func avStatus(for media: AVMediaType) -> AVAuthorizationStatus {
    let status = AVCaptureDevice.authorizationStatus(for: media)
    switch status {
        case .authorized: // The user has previously granted access to the microphone.
            return .authorized
        
        case .notDetermined: // The user has not yet been asked for microphone access.
            return .notDetermined
        
        case .denied: // The user has previously denied access.
            return .denied

        case .restricted: // The user can't grant access due to restrictions.
            return .restricted
        default:
            Swift.print("Unknown AV status (status) for .audio")
            return status
    }
}
  

Я думал, что потребуется действие пользователя для запроса использования права и отказа:

 @objc @IBAction func audioVideoServicesPress(_ sender: AnyObject) {
    let service = sender.title.components(separatedBy: " ").last
    let media : AVMediaType = service == "Audio" ? .audio : .video
    let status = self.avStatus(for: media)
    
    guard ![.denied,.restricted].contains(status) else { return }
    
    if status == .authorized {
        print("how do we relinquish need in the a/v device")
    }
    else
    {
        AVCaptureDevice.requestAccess(for: media, completionHandler: { granted in
               return
        })
    }
}
  

В других действиях пользователя, если они были отключены или отклонены, я бы перенаправил их в соответствующее приложение настроек, но прежде чем я туда доберусь, как отменить запрос?

Это не способ отменить запрос доступа к a / v устройству?

Я думаю, это говорит о том, что я все делаю неправильно?

Ответ №1:

«Отказываться» не от чего.

Нажатие кнопки пользователем является намерением. Пользователь хочет выполнить какое-то действие, которое может быть выполнено только при наличии авторизации. Итак, если у вас это есть или вы можете получить, ваша задача сейчас — сделать это.

Итак, либо у вас есть авторизация, либо ее нет. Если статус авторизации есть .undetermined , вы можете его получить. Если это так .authorized , вы уже получили это. В любом из этих случаев делайте то, что намеревается пользователь!

  • Во время вашей print строки у вас есть авторизация, так что теперь продолжайте и делайте все, что пользователь нажал на кнопку, намереваясь сделать.

  • Аналогично, не return используйте обработчик завершения для запроса доступа; вместо этого проверьте granted и, если true, сделайте все, что пользователь нажал на кнопку, намереваясь сделать.

В любом другом случае вы находитесь под водой, поэтому ничего не делайте. Намерение пользователя требует авторизации, которой у вас нет, и которую вы не можете получить. Вы можете создать диалоговое окно, объясняющее, почему вы не можете этого сделать, или отправить их туда, где они могут получить доступ к своим настройкам, но это все, что вы можете сделать отсюда.

Комментарии:

1. Наверное, я хотел получить сходство со службами определения местоположения.

2. Какое именно сходство вы имели в виду? Вы имеете в виду запуск / остановку обновлений? Это не имеет ничего общего с авторизацией. Вы также не можете авторизоваться в службах определения местоположения.

3. Презентация для пользователя — это все, что мне нужно, и когда они скажут «Нет», я сделаю в разумных пределах, чтобы удовлетворить, что касается местоположения, я бы прекратил мониторинг / обновление и выпустил свой объект manager. Все, что хранится, должно быть легко высвобождаемым, а не неуклюжим, чтобы для отказа в доступе к приложению требовался перезапуск приложения и / или сеанс приложения конфиденциальности, когда все, что я хотел, это просто показать и подтвердить остановку интереса или удержание на ресурсе или устройстве.

4. Ну, если они скажут «Нет», вы будете знать, потому что ваше защитное предложение будет выполнено : guard ![.denied,.restricted].contains(status) else { return } . Поэтому вместо того, чтобы просто return , если у вас есть ресурсы, которые вы хотите освободить, освободите их (хотя я не могу себе представить, какими они могут быть). Я действительно совсем не понимаю, что вы хотите знать, что мой ответ вам не говорит.

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