概要
AVCaptureSession でビデオセッションがバックグラウンド・フォアグラウンドに移行した場合の動作に関して。
Reference
AVCaptureSession.InterruptionReason.videoDeviceNotAvailableInBackground
- iOS9.0以降
- Mac Catalyst 13.0+
- AVFoundation
宣言
case videoDeviceNotAvailableInBackground = 1
Discussion
バックグラウンドでのカメラの使用は禁止されています。バックグラウンドでカメラの実行を開始しようとすると、キャプチャセッションはこの中断理由でAVCaptureSessionWasInterrupted
を送信します。stopRunning()
メソッドを明示的に呼び出さない場合、startRunning()
リクエストは保持され、アプリがフォアグラウンドに戻ると、AVCaptureSessionInterruptionEnded
を受信してセッションの実行が開始されます。
解説
AVCaptureがバックグラウンド・バックグラウンドに移行しても、明示的にsession を stopRunning, startRunning を行う必要はなく、自動的に停止・再開される。フォアグランドに戻った時に、AVCaptureSessionInterruptionEnded
が呼ばれるので、そこで必要な処理(Permission のチェックなど)を行えば良い。
実装例
override func viewDidLoad() { NotificationCenter.default.addObserver(self, selector: #selector(avCaptureSessionInterruptionEnded), name: Notification.Name.AVCaptureSessionInterruptionEnded, object: nil) } // フォアグランドに戻って、session が自動的に再開された @objc func avCaptureSessionInterruptionEnded() { debugPrint("avCaptureSessionInterruptionEnded フォアグラウンドに戻ったので、session が自動的に再開された") doSomething() }