Flutter如何通过audio_service在iOS实现后台音频播放

在Flutter中使用audio_service插件时,iOS平台的后台音频播放功能始终无法正常工作。我已经按照文档配置了Info.plist中的后台模式权限,并实现了AudioServiceBackground.run(),但应用切换到后台后音频仍会中断。以下是具体问题:

  1. 是否需要额外设置Capabilities中的Background Modes?
  2. audio_service的iOS端是否需要单独注册后台任务?
  3. 是否有完整的iOS端配置示例(包括AppDelegate修改)?
    测试环境:Flutter 3.7,audio_service ^0.18.7,Xcode 14.2。

更多关于Flutter如何通过audio_service在iOS实现后台音频播放的实战教程也可以访问 https://www.itying.com/category-92-b0.html

2 回复

在Flutter中,使用audio_service包实现iOS后台音频播放,需配置Info.plist文件,添加后台音频模式权限。在AudioService配置中启用后台播放,并处理音频会话和远程控制事件。

更多关于Flutter如何通过audio_service在iOS实现后台音频播放的实战系列教程也可以访问 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

创建自定义的 AudioHandler 类:

import 'package:audio_service/audio_service.dart';
import 'package:just_audio/just_audio.dart';

class MyAudioHandler extends BaseAudioHandler {
  final _player = AudioPlayer();
  
  MyAudioHandler() {
    _player.playbackEventStream.map(_transformEvent).pipe(playbackState);
  }

  @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,
      },
      androidCompactActionIndex: 0,
      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,
    );
  }
}

4. 初始化 AudioService

main.dart 中初始化:

void main() async {
  await AudioService.init(
    builder: () => MyAudioHandler(),
    config: AudioServiceConfig(
      androidNotificationChannelId: 'com.example.audio',
      androidNotificationChannelName: 'Audio Playback',
      androidNotificationOngoing: true,
    ),
  );
  runApp(MyApp());
}

5. 控制播放

在 UI 中使用:

FloatingActionButton(
  onPressed: () {
    AudioService.play(); // 开始播放
  },
  child: Icon(Icons.play_arrow),
)

注意事项:

  • 确保音频源支持流式传输(如 HTTPS URL)
  • 测试时使用真机,模拟器可能不支持后台音频
  • 处理音频会话和远程控制(耳机按钮、控制中心)

这样配置后,应用在 iOS 进入后台时仍能继续播放音频,并显示控制界面。

回到顶部