You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中音频会话设为Playback仍与其他会话混音问题排查

看起来你遇到的问题有两个核心点:一是音频会话的混音控制没按预期生效,二是锁屏播放按钮的配置可能没做全。我来帮你拆解问题并给出针对性的解决方案:

问题1:重复配置音频会话导致状态冲突

你同时调用了AKSettings.setSession和AVAudioSession.sharedInstance().setCategory,这属于重复操作——AudioKit的AKSettings.setSession已经封装了系统音频会话的配置逻辑,重复设置很可能导致会话状态混乱,甚至覆盖了你想要的不混音规则。

问题2:未主动激活音频会话

很多开发者容易忽略:设置完音频会话类别后,必须激活会话才能让配置真正生效。如果只设置类别但不激活,系统可能不会应用你的不混音限制。

问题3:锁屏控制需要额外注册远程命令

仅仅设置playback类别只能实现后台播放,但锁屏界面的播放/暂停按钮需要你主动注册远程命令、更新播放状态信息,系统才会在锁屏界面显示这些控件。


修正后的完整代码示例

import AudioKit
import MediaPlayer

private func configureAudio() {
    do {
        // 只用AudioKit的API配置会话,避免重复操作
        try AKSettings.setSession(category: .playback, with: [])
        // 关键步骤:激活音频会话,让配置生效
        try AVAudioSession.sharedInstance().activate()
        
        AKSettings.playbackWhileMuted = true
    } catch {
        print("音频会话配置失败: \(error.localizedDescription)")
    }
    
    // 配置锁屏与控制中心的播放控制按钮
    setupRemoteCommandCenter()
}

private func setupRemoteCommandCenter() {
    let commandCenter = MPRemoteCommandCenter.shared()
    
    // 注册播放命令处理逻辑
    commandCenter.playCommand.addTarget { [weak self] _ in
        guard let self = self else { return .commandFailed }
        // 替换成你实际的播放逻辑,比如调用AudioKit播放器的play()方法
        // self.audioPlayer.play()
        // 更新锁屏显示的播放信息
        updateNowPlayingInfo()
        return .success
    }
    
    // 注册暂停命令处理逻辑
    commandCenter.pauseCommand.addTarget { [weak self] _ in
        guard let self = self else { return .commandFailed }
        // 替换成你实际的暂停逻辑
        // self.audioPlayer.pause()
        // 更新锁屏显示的播放信息
        updateNowPlayingInfo()
        return .success
    }
    
    // 可选:按需启用上一曲/下一曲等其他控制按钮
    // commandCenter.nextTrackCommand.isEnabled = true
    // commandCenter.previousTrackCommand.isEnabled = true
}

private func updateNowPlayingInfo() {
    var nowPlayingInfo = [String: Any]()
    // 替换成你的音频元数据
    nowPlayingInfo[MPMediaItemPropertyTitle] = "当前播放标题"
    nowPlayingInfo[MPMediaItemPropertyArtist] = "艺术家名称"
    
    // 如果需要显示播放进度,可添加以下字段
    // nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = audioPlayer.currentTime
    // nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = audioPlayer.duration
    
    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}

额外排查点

如果按上述配置后仍存在混音问题,你可以检查:

  • 项目中是否有其他代码(或第三方库)设置了mixWithOthers选项,这个选项会强制开启混音,直接覆盖playback类别的默认不混音行为。
  • 测试时先关闭其他正在播放音频的应用,确保你的音频会话能正确抢占音频焦点。

内容的提问来源于stack exchange,提问作者5AMWE5T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:39:31