iOS端Flutter应用后台时audio_service无法触发闹钟求助
解决Flutter后台闹钟音频播放问题
问题根源
后台听不到声音基本都是音频会话配置不对,或者平台后台权限没配全,导致系统在后台限制了应用的音频通道。
具体解决步骤
1. 配好平台后台权限
- Android:打开
AndroidManifest.xml,添加以下权限并声明服务类型<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" /> <!-- 将该服务声明添加到<application>标签内(若audio_service未自动生成) --> <service android:name="com.ryanheise.audioservice.AudioService" android:foregroundServiceType="mediaPlayback" /> - iOS:在
Info.plist中开启后台音频模式<key>UIBackgroundModes</key> <array> <string>audio</string> </array>
2. 正确配置音频会话
在你的AudioPlayerHandler初始化时,设置合适的音频属性,提升后台播放优先级:
import 'package:audio_session/audio_session.dart'; class AudioPlayerHandler extends BaseAudioHandler { final _player = AudioPlayer(); AudioPlayerHandler() { _initAudioSession(); _player.setUrl("https://s3.amazonaws.com/scifri-episodes/scifri20181123-episode.mp3"); } Future<void> _initAudioSession() async { final session = await AudioSession.instance; await session.configure(AudioSessionConfiguration( // iOS端设为playback,允许后台播放 avAudioSessionCategory: AVAudioSessionCategory.playback, avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.mixWithOthers, avAudioSessionMode: AVAudioSessionMode.defaultMode, // Android端设为alarm类型,提升后台播放优先级 androidAudioAttributes: const AndroidAudioAttributes( contentType: AndroidAudioContentType.music, flags: AndroidAudioFlags.none, usage: AndroidAudioUsage.alarm, ), androidAudioFocusGainType: AndroidAudioFocusGainType.gain, androidWillPauseWhenDucked: false, )); } @override Future<void> play() { try { print("****** play *******"); return _player.play(); } catch (e) { print(e); return Future.value(null); } } @override Future<void> pause() { return _player.pause(); } }
核心是Android端将AndroidAudioUsage设为alarm,iOS端将AVAudioSessionCategory设为playback,让系统认可后台播放的合法性。
3. 让audio_service保持前台状态
触发闹钟时,不能只调用handler.play(),需让audio_service启动前台服务,避免被系统回收:
// GPS触发闹钟的代码示例 await handler.play(); // 更新媒体元数据,让系统识别为合法前台服务 handler.updateMediaItem(MediaItem( id: "alarm", title: "警戒区域提醒", artist: "闹钟", ));
audio_service依赖前台通知维持后台运行,必须提供媒体元数据完成这一流程。
4. 检查IsolatedAudioHandler的使用
如果使用IsolatedAudioHandler,需确保所有初始化逻辑(包括音频会话配置)都在隔离区内完成,避免跨隔离区的资源访问冲突。
验证注意事项
- 测试时先将应用切到后台,再触发GPS离开事件,确认音频是否正常播放
- Android可通过日志排查权限或音频会话相关错误
- iOS模拟器存在后台音频限制,建议用真机测试
内容的提问来源于stack exchange,提问作者Steve Neal
相关产品推荐
相关产品推荐

