iOS背景模式下无法播放音频/声音。

3
我的应用程序(使用Flutter制作,但这并不重要)具有类似于计时器功能的东西,以固定时间间隔(10秒至3分钟之间)进行滴答声。我已经开启了后台模式下的音频、AirPlay和画中画,并在我的Info.plist文件中添加了以下内容。
    <key>UIBackgroundModes</key>
    <array>
        <string>audio</string>
    </array>

但是在后台运行时音频仍将停止。

当我以配置文件模式运行应用程序时,出现此问题。而以调试模式运行时,则可以在后台继续播放音频。

我该怎么做才能让音频在后台继续运行?


使用Flutter制作,但这并不重要:D - 但实际上很重要,可能是由于操作系统杀死了Flutter隔离进程。 - kuhnroyal
@kuhnroyal,你有这方面的文档吗?我不明白为什么使用Flutter开发的应用在iOS上需要执行不同的操作。 - Jonas
3个回答

2

在 audio_service 0.18.0 的 README 中有一个相关说明,可以帮助解决这个问题:

请注意,音频后台模式仅允许应用程序在后台运行以播放音频。如果您的应用程序在没有播放音频的情况下空闲,例如使用计时器休眠几秒钟,则操作系统可能会终止您的进程。如果您的应用程序需要在音频曲目之间暂停几秒钟,请考虑播放无声音轨来创建该效果,而不是使用空闲计时器。


1

好的,除非您使用本机代码(Swift/Objective-C),否则您的代码将在Flutter引擎内运行-可能使用某些Dart Timer.periodic

当应用程序处于后台时,Flutter引擎可能会在任何时间点终止。 在Android上,即使只是切换到相机然后再切换回应用程序,也可能会发生这种情况。 在iOS上通常在一定时间后或在高系统负载时发生。

在这方面,Flutter(和大多数其他跨平台工具包)与本机应用程序非常不同。

您可以从这里开始阅读官方文档:https://flutter.dev/docs/development/packages-and-plugins/background-processes 这可能是一篇不错的文章:https://medium.com/vrt-digital-studio/flutter-workmanager-81e0cfbd6f6e

我对iOS了解不够,但我认为没有简单的方法可以安排您需要的小间隔执行。 在Android上可以使用类似AlarmManager的东西。

您可以尝试本地编写调度代码,并在设置周期后通过MethodChannel从应用程序进行调度。

您可以查看以下库:
https://pub.dev/packages/workmanager(可能无法在您需要的小间隔时间内唤醒)
https://pub.dev/packages/android_alarm_manager_plus(仅适用于Android)
https://pub.dev/packages/audio_service(可能会给您一些关于如何在iOS上实现后台执行的想法)

编辑:
在阅读更多关于 iOS 启用后台音频 的信息后,我认为只有使用AVAudioSession时才能正常工作。你可能没有使用它。要使其正常工作,您需要一些本机代码。 audio_service包使用此类会话。您可以尝试使用Dart代码进行调度,并通过audio_service包播放声音。听起来似乎可以,但我没有使用过此包的经验。


1
在iOS上,通常会在一定时间后或系统负载高时出现这种情况。我可能会对这种行为感到满意,但是应用程序在进入后台后立即停止运行。在Android上它可以正常工作,但在iOS上不行。当它在进行轻量级工作时能够运行几分钟就足够了,但事实并非如此。 - Jonas
1
您可能会对来自audio_service README的此注释感兴趣:“请注意,音频后台模式仅允许应用程序在后台运行以播放音频。如果您的应用程序在没有播放音频的情况下闲置,例如使用计时器休眠几秒钟,则操作系统可能会终止您的进程。如果您的应用程序需要在音频曲目之间暂停几秒钟,请考虑播放静音音轨以创建该效果,而不是使用空闲计时器。” - Ryan Heise
2
仅限于“audio_service”软件包使用此会话,旧版本的“audio_service”确实使用了“AVAudioSession”,但是从0.18.0开始,它只处理媒体回调,由您的应用程序负责与音频会话进行交互。如果在这些回调中使用任何音频播放器插件,那么几乎肯定该音频播放器插件将与音频会话进行交互。在“just_audio”的情况下,您可以选择禁用它,并通过“audio_session”软件包直接与音频会话进行交互。 - Ryan Heise
感谢 @RyanHeise 的见解和您的软件包! - kuhnroyal

0

请注意 @RyanHeise 的回答——他在使用 AudioSession 时是正确的:在后台中,应该播放声音或者静音。一旦音频暂停,应用就会被挂起。

另外,重要提示:当应用进入后台时,计划中的定时器会被暂停。这就是为什么你会觉得它停止工作了。不要在后台使用定时器进行调度——依赖系统的事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接