как программно проверить NSMicrophoneUsageDescription

Я хочу, чтобы пользователь использовал микрофон в приложении и добавил соответствующий ключ в info.plist «Privacy-MicrophoneUsageDescription». Если пользователь нажмет кнопку микрофона, появится окно с вопросом о разрешении на использование. Если пользователь нажимает «Разрешить», приложение работает без каких-либо проблем. Но если нет и снова нажать кнопку микрофона, приложение вылетает.

Я хочу проверять статус NSMicrophoneUsageDescription при каждом нажатии кнопки. В случае отказа снова запросите разрешение у пользователя.


person Antonio K    schedule 24.05.2017    source источник


Ответы (2)


Выбранный ответ не будет работать, метод requestRecordPermission является асинхронным, и он не изменит значение разрешенияCheck до того, как значение будет возвращено в операторе возврата. Правильный способ сделать это - использовать обработчик завершения

func askMicroPhonePermission(completion: @escaping (_ success: Bool)-> Void) {
    switch AVAudioSession.sharedInstance().recordPermission() {
    case AVAudioSessionRecordPermission.granted:
        completion(true)
    case AVAudioSessionRecordPermission.denied:
        completion(false) //show alert if required
    case AVAudioSessionRecordPermission.undetermined:
        AVAudioSession.sharedInstance().requestRecordPermission({ (granted) in
            if granted {
                completion(true)
            } else {
                completion(false) // show alert if required
            }
        })
    default:
        completion(false)
    }
}

Я изменил выбранный ответ, включив в него обработчик завершения вместо оператора возврата.

person DatForis    schedule 24.05.2017

Для быстрого 3:

func askMicroPhonePermission() {
    switch AVAudioSession.sharedInstance().recordPermission() {
    case AVAudioSessionRecordPermission.granted:
        //permissionCheck = true 
    case AVAudioSessionRecordPermission.denied:
       // permissionCheck = false //show alert if required
    case AVAudioSessionRecordPermission.undetermined:
        AVAudioSession.sharedInstance().requestRecordPermission({ (granted) in
            if granted {
                //permissionCheck = true
            } else {
                //permissionCheck = false // show alert if required or completion handler
            }
        })
    default:
        break
    }
}
person RMRAHUL    schedule 24.05.2017
comment
отлично, все время искал класс NSMicrophoneUsageDescription, спасибо :) - person Antonio K; 24.05.2017
comment
Метод requestRecordPermission является асинхронным, поэтому его нельзя использовать для изменения значения разрешенияCheck перед оператором return. Вместо возвращаемого значения Bool вы должны использовать обработчик завершения - person DatForis; 24.05.2017
comment
Согласен, мы должны использовать обработчик завершения здесь. - person RMRAHUL; 24.05.2017