これは非常に基本的な質問のように思えるかもしれませんが、答えを見つけるのに苦労しています。私の知る限り、 AVAudioInputNode は iOS 8 以降で利用可能であり、たとえば iPhone のマイクから録音するために使用できます。
以前は、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 メソッドを使用するようにフォールバックする必要がありますか? 多くの価値があるのは、SpeechRecognizer の周りの WWDC コードから持ち上げられたものです。彼らがマイクの許可を処理している場所がわかりません
実際、アクセス許可を要求するためのアラートが常に表示されるとは限りません。私が見つけた例では、この許可ステップをスキップしているように見えるため、ここで何が欠けていますか