はじめに
アプリに撮影機能を実装した際に挙動がおかしな点が見つかったので備忘録として記事にしました。
問題
音量ボタンでシャッターを切る実装をした際に、撮影画面でホーム画面に戻る、または画面ロックすると再度撮影画面に復帰した際に音量ボタンで撮影できなくなってしまいました。
原因
上記ドキュメントのNoteにこう書かれていました。
Starting in iOS 10, the system deactivates an app’s audio session when it suspends the app process.
日本語に翻訳すると、
iOS 10から、アプリのプロセスを中断する際に、アプリのオーディオセッションを非アクティブにするようになりました。
つまり、音量ボタンで撮影するためにアクティブにしたAudioSessionが、アプリがバックグラウンドに移った時や画面ロックした時などに非アクティブになるため撮影画面に復帰したら音量ボタンでの撮影ができなくなってしまうということです。
対策
撮影画面で、アプリがフォアグラウンドになった際に通知を受け取るようNotificationCenterを登録します。
通知を受け取った場合にAudioSessionをアクティブにします。
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.activateAudioSession), name: UIApplication.willEnterForegroundNotification, object: nil)
}
@objc private func activateAudioSession() {
try? self.audioSession.setActive(true)
}
おわりに
気づくまでにかなりの時間を費やしてしまいました。。。
ドキュメントにしっかり書いてあるのに。
ドキュメントは偉大ですね。(ちゃんと読め俺)