Flutter如何在iOS设备使用audio_service实现后台音频播放并显示通知栏控件
在Flutter中集成audio_service时遇到问题:iOS设备无法实现后台音频播放和通知栏控件显示。按照官方文档配置了AudioServiceBackground.setBackgroundTaskEntryPoint,并在Info.plist中添加了UIBackgroundModes的audio权限,但应用切换到后台后音频仍会中断。通知栏控件也没有正常显示,Android端一切正常。请问还需要额外配置哪些iOS专属参数?是否需要在AppDelegate.swift中添加特定代码?求完整的iOS端实现方案。
在Flutter中使用audio_service实现iOS后台音频播放和通知栏控件,需配置Info.plist添加后台音频模式,并设置AudioServiceWidget和AudioServiceBackground。使用just_audio处理播放,在AudioServiceBackground中实现播放逻辑和通知栏更新。
更多关于Flutter如何在iOS设备使用audio_service实现后台音频播放并显示通知栏控件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中,使用 audio_service 包可以在 iOS 设备上实现后台音频播放并显示通知栏控件。以下是关键步骤和代码示例:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
audio_service: ^0.18.0
just_audio: ^0.9.24 # 用于音频播放
2. 配置 iOS 后台模式
在 ios/Runner/Info.plist 中添加:
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
3. 实现 AudioHandler
创建一个继承自 BaseAudioHandler 的类,管理音频播放逻辑:
class MyAudioHandler extends BaseAudioHandler {
final _player = AudioPlayer();
MyAudioHandler() {
_player.playbackEventStream.map(_transformEvent).pipe(playbackState);
_setInitialPlaybackState();
}
@override
Future<void> play() => _player.play();
@override
Future<void> pause() => _player.pause();
@override
Future<void> stop() => _player.stop();
PlaybackState _transformEvent(PlaybackEvent event) {
return PlaybackState(
controls: [
MediaControl.play,
MediaControl.pause,
MediaControl.stop,
],
systemActions: const {
MediaAction.seek,
},
androidCompactActionIndices: const [0, 1, 3],
processingState: const {
ProcessingState.idle: AudioProcessingState.idle,
ProcessingState.loading: AudioProcessingState.loading,
ProcessingState.buffering: AudioProcessingState.buffering,
ProcessingState.ready: AudioProcessingState.ready,
ProcessingState.completed: AudioProcessingState.completed,
}[_player.processingState]!,
playing: _player.playing,
updatePosition: _player.position,
bufferedPosition: _player.bufferedPosition,
speed: _player.speed,
queueIndex: event.currentIndex,
);
}
void _setInitialPlaybackState() {
playbackState.add(PlaybackState(
controls: [MediaControl.play, MediaControl.stop],
processingState: AudioProcessingState.idle,
playing: false,
));
}
}
4. 初始化 AudioService
在 main.dart 中启动服务:
void main() async {
await AudioService.init(
builder: () => MyAudioHandler(),
config: const AudioServiceConfig(
androidNotificationChannelId: 'com.yourapp.channel.audio',
androidNotificationChannelName: 'Audio playback',
androidNotificationOngoing: true,
),
);
runApp(MyApp());
}
5. 控制播放
在 UI 中使用 AudioService 方法控制播放:
FloatingActionButton(
onPressed: () {
AudioService.play(); // 开始播放
},
child: Icon(Icons.play_arrow),
),
注意事项:
- 测试真机:后台功能需在真实 iOS 设备测试,模拟器可能不支持。
- 音频源:使用兼容的音频格式(如 MP3、AAC)。
- 通知栏:iOS 自动显示系统默认播放控件,无需额外配置。
完成以上步骤后,应用即可在 iOS 后台播放音频并显示通知栏控件。确保遵循 Apple 审核指南,避免滥用后台权限。

