如何在后台应用运行时开始录音?

How to start audio recording when app running on background?

我正在从事录音工作。当应用程序 运行 在前台运行时,我必须开始录音并转到后台,那时录音工作正常。

但我的问题是当我已经在后台时如何开始录音,我的录音功能是这样启动的:

我有一个带按钮的低功耗蓝牙设备和一个 iOS 应用程序。这两个是配对的(蓝牙 LE 设备和 iPhone,其中 运行 是 iOS 应用程序)并且 iOS 应用程序正在侦听蓝牙 LE 设备上的事件,例如事件按下按钮。

现在,当用户点击 Bluetooth LE 设备上的按钮时,iOS 应用程序会捕获该事件,即使应用程序处于后台,我也能够 运行 编码,但我我无法开始录音。

我已经启用了 Background Modes:

这是我的录音代码:

func startRecording() {
        
        DispatchQueue.global(qos: .background).asyncAfter(deadline: DispatchTime.now(), qos: .background) {
            let audioFilename = self.getDocumentsDirectory().appendingPathComponent("recording.m4a")
            print("record Audio \(audioFilename)")
            let settings = [
                AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                AVSampleRateKey: 12000,
                AVNumberOfChannelsKey: 1,
                AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
            ]

            do {
                self.audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
                self.audioRecorder.delegate = self
                self.audioRecorder.record()
            } catch {
                self.finishRecording(success: false)
            }
        }
    }

我找不到合适的解决方案来做那件事,请给我建议正确的方法,在此先感谢。

出于安全原因,如果没有明确的 UI 交互,这是不可能的,否则就有可能“监视”某人(一旦配对,房间外的人就可以开始录音并听听房间内发生的事情)。

解决方法可以是:

  • 发送本地通知,例如“设备已准备好录制,要开始吗?”。点击此按钮后,应用程序会在前台打开,并且应该能够开始录制。
  • 使用 CallKit(适用于 phone 类用例)。当用户在 CallKit 系统中按下“接受”时 UI,即使在后台也可以开始录制音频。

这是我的解决方案:

  1. 从您的应用程序触发 CallKit 呼叫并控制您的耳机接听电话。

  2. 使用耳机通过蓝牙通道录制和传输语音数据。