Flutter如何在iOS设备使用audio_service实现后台音频播放并显示通知栏控件

在Flutter中集成audio_service时遇到问题:iOS设备无法实现后台音频播放和通知栏控件显示。按照官方文档配置了AudioServiceBackground.setBackgroundTaskEntryPoint,并在Info.plist中添加了UIBackgroundModes的audio权限,但应用切换到后台后音频仍会中断。通知栏控件也没有正常显示,Android端一切正常。请问还需要额外配置哪些iOS专属参数?是否需要在AppDelegate.swift中添加特定代码?求完整的iOS端实现方案。

2 回复

在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 审核指南,避免滥用后台权限。

回到顶部