在后台和屏幕关闭时在 WatchKit 锻炼应用程序中播放音频

Posted

技术标签:

【中文标题】在后台和屏幕关闭时在 WatchKit 锻炼应用程序中播放音频【英文标题】:Playing audio in a WatchKit workout app when backgrounded and screen is off 【发布时间】:2017-12-19 12:15:15 【问题描述】:

我正在尝试构建一个可以在锻炼期间提供音频反馈的 WatchKit 应用。音频是一系列预先录制的简短语音片段。

应用开始锻炼 当应用程序处于活动状态时,音频剪辑可以正常播放 当应用程序在后台而屏幕打开时(例如通过点击数字表冠或打开另一个应用程序),音频也可以正常播放。

但是,当屏幕关闭时 - 例如通过开始锻炼然后放下手腕 - 直到应用再次激活音频才会播放。

    开始锻炼 + 将应用程序保持在屏幕上 = 声音播放正常。 开始锻炼 + 点按数字表冠将应用移至后台 + 保持屏幕开启 = 声音播放正常。 开始锻炼 + 下手腕 = 屏幕关闭且不再播放声音。 开始锻炼 + 将应用程序移至后台 + 下手腕 = 屏幕关闭且不再播放声音。

我正试图弄清楚我错过了什么,以便在屏幕关闭时支持锻炼应用中的音频...

该应用有一个活跃的HKWorkoutSession。 该扩展在WKBackgroundModes 下启用了“锻炼处理”后台模式 该扩展程序还在UIBackgroundModes 下启用了“音频”背景模式。 该扩展程序具有 HealthKit 权利,并且所有 HealthKit 功能都可以正常工作。 在 ios 应用上,我添加了“音频”背景模式。

我试过了:

使用AVAudioPlayer播放音频片段 使用AVAudioEngine+AVAudioPlayerNode播放音频 完全放弃剪辑并使用 AVSpeechSynthesizer

行为是相同的 - 一旦屏幕关闭,声音就不再播放。如果应用程序在后台并且屏幕仍然亮着,声音会播放。

该应用程序在 Watch OS 4 上运行。我在 Series 2 和 Series 3 手表上进行了测试,两者都相同。

我错过了什么?

【问题讨论】:

有这样的应用吗? Nike+ 跑步应用可以做到这一点,并且可以提供跑步反馈(我假设音频是由剪辑组成的)。 Strava 正在运行的应用程序还设法在运行中提供音频反馈 - 我认为他们正在使用 AVSpeechSynthesizer,我也尝试过并且发现同样的问题......似乎我错过了一些阻止背景音频正常工作的东西。它似乎只在屏幕保持打开时播放...... 你在什么设备上运行这个?此功能是否仅限于较新的设备? @NitinAlabur 在系列 2 和系列 3 上进行了测试,但都无法正常工作。这个功能肯定可以在其他正在运行的应用程序中使用,所以我一定错过了什么...... 【参考方案1】:

啊,终于找到this的帖子,发现我也遇到了同样的问题:

AVAudioSession 类别需要设置为 AVAudioSessionCategoryPlayback(我已将其设置为环境)。

只要我将会话类别更改为 AVAudioSessionCategoryPlayback,它就起作用了!

【讨论】:

很高兴您找到了修复程序!这无论如何都会帮助其他人! 这仅在使用锻炼课程时有效吗?【参考方案2】:

要在后台播放音频,除了设置“锻炼处理”后台模式外,您还需要在扩展 plist 中将 UIBackgroundModes 设置为“音频”。

Refrence HKWorkoutSession

要在后台播放音频或提供触觉反馈,您还必须将 UIBackgroundModes 键添加到 WatchKit 扩展的 Info.plist 文件中。该键的值是一个包含音频值的数组。

【讨论】:

谢谢,但我已经做到了。扩展的 Info.plist 包含:UIBackgroundModes:“audio”、“location”和 WKBackgroundModes:“workout-processing”。

以上是关于在后台和屏幕关闭时在 WatchKit 锻炼应用程序中播放音频的主要内容,如果未能解决你的问题,请参考以下文章

WatchKit App 仅返回一些 HealthKit 数据

如何在应用程序关闭时在颤动中执行后台任务?

React Native:关闭应用程序时在 iOS 上运行后台任务的最佳方法?

即使 Apple Watch 屏幕关闭,也能访问锻炼数据

使用 WatchKit 和小部件(今日扩展)保存/删除到 HealthKit?

使用 WatchKit 和小部件(今日扩展)保存/删除到 HealthKit?