我知道,如果我在前台启动音频录制会话,并在功能 -> 后台模式中激活音频、Airplay 和画中画;即使在后台,我也可以继续录制,但前提是我在前台开始录制会话,然后进入后台。
我的问题是我想从后台启动录音会话,这可能看起来不太好,不是苹果想要的,但用例是这样的:
我有一个带有按钮和 iOS 应用程序的蓝牙 LE 设备。这两个设备已配对(蓝牙 LE 设备和运行 iOS 应用程序的 iPhone),并且 iOS 应用程序正在侦听蓝牙 LE 设备上的事件,例如按下按钮等事件。
现在,当用户点击蓝牙 LE 设备上的按钮时,iOS 应用程序会捕获该事件,即使应用程序处于后台,我也可以运行代码,但无法开始录音。
我的问题是:这可能吗?要从后台开始录音?即使我们在这里进行用户交互,不是在 iOS 应用程序上,而是在蓝牙 LE 上,所以录音不会在后台开始并且用户没有意识到,他按下了蓝牙 LE 设备上的按钮,他知道他在做什么。
任何帮助、文档、Apple 工程师的推文,任何东西都将不胜感激。谢谢。
更新:不需要 MFI。 https://mfi.apple.com/MFiWeb/getFAQ.action#1-2。
如果您查看该部分:
“哪些类型的配件和技术不属于 MFi 计划的一部分?”
你会看到:
“仅使用蓝牙低功耗 (BTLE) 的配件(注意:支持 BTLE 的 HomeKit 配件和支持 BTLE 的 MFi 助听器属于 MFi 计划的一部分)”
被提及,这意味着MFI在这种情况下不是必需的。
连续播放或录制音频的应用程序(即使该应用程序处于运行状态) 在后台运行)可以注册以执行这些任务 背景。您可以从后台模式部分启用音频支持 Xcode 项目中的“功能”选项卡。 (您还可以启用 通过在音频中包含 UIBackgroundModes 键来实现此支持 应用程序的 Info.plist 文件中的值。)播放音频内容的应用程序 背景必须播放有声内容而不是静音。
后台音频应用程序的典型示例包括:
音乐播放器应用程序 录音应用程序 支持音频或音频的应用程序 通过 AirPlay VoIP 应用程序播放视频
对于需要更多执行时间来实现的任务,您必须 请求特定权限以在后台运行它们,而无需 他们被停职。在 iOS 中,只允许特定的应用程序类型 在后台运行:
- 在后台录制音频内容的应用程序
编辑:
还有关于您的“蓝牙设备”:
查看 ExternalAccessory 的文档。
请注意,您需要申请并获得特殊开发人员计划的批准才能创建外部配件。
有用的提示::
事实证明,如果您只需将音频多任务标志添加到信息中,经过一些修改的 Apple 的 SpeakHere 示例代码将开始在后台录制音频。您可能会在 https://github.com/benvium/SpeakHere 寻找 SpeakHere 的更新版本,因为 Apple 已经有一段时间没有更新它了。
我在这个话题上苦苦思索了好几个星期。当应用程序在后台运行时,Apple 不希望您听人说话。 当应用程序移至后台时,我最终立即激活了麦克风。
这个想法是用空代码激活麦克风 - 这意味着在您需要收听之前不会浪费电池,然后用真正的收听者替换麦克风回调。
这是我在 React Native 中构建的一个示例 并不是说下面的函数 - backgroundMicEmptyListener() 创建一个空监听器,除了调用该函数并返回之外,不使用任何 CPU。
const handleAppStateChange = (nextAppState) => {
console.log("handleAppStateChange(): ", nextAppState);
if (nextAppState === 'background') {
console.log("nextAppState === 'background'");
BackgroundJob.start(backgroundMicEmptyListener, backgroundOptions)
.then(() => {
console.log('Background job started successfully');
})
.catch((err) => {
console.error('Error starting background job:', err);
});
}
我知道这不是最好的解决方案,但却是我找到的唯一解决方案。
我将其用于 VAD 和唤醒词检测,效果非常好。