swift4
ios11
Xcode9

バックグラウンドを有効にして録音

XCode初心者でちょっと迷ったので備忘録。

バックグラウンド

AudioSessionProgrammingGuide
UIBackgroundModesフラグを立てるとか書かれている。
XCode上ではこういった感じ。

アプリケーションの設定でCapabilitiesのBackgroundを有効にして、Audio, AirPlay, and Picture in Pictureをチェックする。
image.png

するとinfo.plistにこれ↓が追加される。

image.png

あとは普通に録音開始

do{
    try session.setCategory(AVAudioSessionCategoryRecord)
    let recorder = AVAudioRecorder(....)
    recorder.record()
} catch {
    例外処理
}

ロックしててもバックグラウンドで録音。

image.png

割り込み

ただし、Siriや電話などの割り込みで録音は停止する。
割り込み通知を受け取って一時停止処理などをしなければいけない。割り込み処理用のhandlerがdeprecatedになっていて、NotificationCenterにObserverとして登録して通知を受け取るようにするらしい。

Responding to Interruptions
ここに書いてあるサンプルコードをとりあえずswift4で怒られないコードにしてみた。

NotificationCenter.default.addObserver(self,
    selector: #selector(handleInterruption),
    name: .AVAudioSessionInterruption,
    object: AVAudioSession.sharedInstance()


@objc func handleInterruption(_ notification: Notification) {
    guard let userInfo = notification.userInfo,
          let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
          let type = AVAudioSessionInterruptionType(rawValue: typeValue) else {
              return
    }
    if type == .began {
        // 割り込み開始。保存やUI更新など適切なアクションを取る。
    }
    else if type == .ended {
        guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else {
            return
        }
        let options = AVAudioSessionInterruptionOptions(rawValue: optionsValue)
        if options.contains(.shouldResume) {
            // 割り込み終了。録音再開?
        }
    }
}