2016-07-15 2 views
0

Это может показаться действительно основным вопросом, но я изо всех сил пытаюсь найти ответ. Насколько мне известно, AVAudioInputNode доступен с iOS 8, и его можно использовать для записи с микрофона на iPhone, например.AVAudioInputNode разрешение

Я знаю ранее, я хотел бы использовать AVAudioRecorderSession, чтобы запросить разрешение на запись и проверку, если у меня есть разрешение и т. Д. То, с чем я борюсь, - это увидеть, как запрашивать и проверять разрешение при использовании AVAudioEngine.

Так что-то вроде ниже, как бы я это сделал?

import AVFoundation 

class ViewController: UIViewController { 
    let audioEngine = AVAudioEngine() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func recordPressed(sender:AnyObject) { 
     try! startRecording() 
    } 

    func startRecording() throws{ 
     let audioSession = AVAudioSession.sharedInstance() 
     try audioSession.setCategory(AVAudioSessionCategoryRecord) 
     try audioSession.setMode(AVAudioSessionModeMeasurement) 
     try audioSession.setActive(true, withOptions: .NotifyOthersOnDeactivation) 

     guard let inputNode = audioEngine.inputNode else { fatalError("Audio engine has no input node") } 

     let recordingFormat = inputNode.outputFormatForBus(0) 

     inputNode.installTapOnBus(0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in 

     } 

     audioEngine.prepare() 

     try audioEngine.start() 


    } 

} 

Я заметил, что сообщение микрофона конфиденциальности может быть установлено в PLIST и вызов audioEngine.inputNode кажется представить это сообщение. Но я все еще не вижу, где проверить, предоставлено ли это разрешение. Если добавить

if (audioSession.recordPermission() == AVAudioSessionRecordPermission.granted){ 

    }else{ 
     print("No permission") 
    } 

непосредственно после guard let inputNode линии он представляет сообщение, но всегда говорит мне, что разрешение не предоставлено, прежде чем я даже ответил на чеку.

Каков наилучший способ сделать это? Должен ли я просто вернуться к использованию методов audioSession? Для чего это стоит многого, это было снято с кода WWDC вокруг speechRecognizer. Я просто не вижу, где они обрабатывают разрешение микрофона.

Фактически, это не всегда означает, что предупреждение запрашивает разрешения. Что я здесь отсутствует как примеры, которые я нашел, кажется, чтобы пропустить этот шаг разрешения

ответ

0

ИТАК, глядя на документы, которые я нашел это:

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

Этот метод всегда возвращается немедленно, но блок ответа ожидает ввода пользователя , если пользователь ранее не предоставлял или не разрешал разрешение для записи в вашем приложении.

Когда пользователь отвечает на запрос разрешения на запись для вашего приложения, , система запоминает выбор. Если пользователь отказал в регистрации разрешения , они могут его включить в Настройках> Конфиденциальность> Микрофон.

Так это выглядит, как он делает это автоматически, когда первым пытается использовать микрофон, но в идеале я должен спросить это разрешение авансового