You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Tokbox iOS 问题:锁屏时视频通话断开连接

解决iOS上Tokbox视频通话锁屏后音视频流断开的问题

我之前帮好几个开发者踩过这个Tokbox的iOS后台坑,锁屏后断流本质是iOS的后台限制机制和Tokbox的会话配置没匹配上,下面给你一步步拆解解决方案:

1. 先把iOS后台权限配置到位

iOS默认会在锁屏后暂停非必要的后台进程,所以必须给App开启对应的后台模式:

  • 打开Xcode,进入你的项目目标 -> Signing & Capabilities -> 添加Background Modes
  • 勾选Voice over IPAudio, AirPlay, and Picture in Picture这两个选项
  • 同时在Info.plist里确保添加了麦克风和相机的权限描述(不然权限被拒也会导致流中断):
    <key>NSMicrophoneUsageDescription</key>
    <string>需要使用麦克风进行视频通话</string>
    <key>NSCameraUsageDescription</key>
    <string>需要使用相机进行视频通话</string>
    

2. 正确配置AVAudioSession,确保后台音频不被暂停

Tokbox的音视频流依赖iOS的音频会话,锁屏后音频会话如果被系统挂起,流就会断开。你需要在初始化Tokbox会话之前配置音频会话:

import AVFoundation

func configureAudioSession() {
    let audioSession = AVAudioSession.sharedInstance()
    do {
        // 用playAndRecord类别,支持同时播放和录制,适配语音通话场景
        try audioSession.setCategory(.playAndRecord, mode: .voiceChat, options: [.mixWithOthers, .allowBluetooth])
        try audioSession.setActive(true)
    } catch {
        print("音频会话配置失败: \(error.localizedDescription)")
    }
    
    // 监听音频中断(比如来电),中断结束后重新激活会话
    NotificationCenter.default.addObserver(self, selector: #selector(handleAudioInterruption(_:)), name: AVAudioSession.interruptionNotification, object: nil)
}

@objc private func handleAudioInterruption(_ notification: Notification) {
    guard let info = notification.userInfo,
          let typeValue = info[AVAudioSessionInterruptionTypeKey] as? UInt,
          let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { return }
    
    if type == .ended {
        guard let optionValue = info[AVAudioSessionInterruptionOptionKey] as? UInt else { return }
        let options = AVAudioSession.InterruptionOptions(rawValue: optionValue)
        if options.contains(.shouldResume) {
            do {
                try AVAudioSession.sharedInstance().setActive(true)
            } catch {
                print("恢复音频会话失败: \(error)")
            }
        }
    }
}

3. 不要在后台主动销毁Tokbox会话

很多开发者会在applicationDidEnterBackground里调用OTSession.disconnect()或者销毁发布的流,这直接导致通话结束。你需要:

  • 保持OTSession实例在后台时不被释放
  • 不要主动断开会话,除非用户主动结束通话
  • 如果需要优化性能,可以在后台暂停本地相机的采集(减少资源占用),但不要断开会话:
    // 进入后台时暂停本地视频采集
    func applicationDidEnterBackground(_ application: UIApplication) {
        if let publisher = self.localPublisher {
            publisher.cameraCapture?.stopCapture()
        }
    }
    
    // 回到前台时恢复采集
    func applicationDidBecomeActive(_ application: UIApplication) {
        if let publisher = self.localPublisher {
            publisher.cameraCapture?.startCapture()
        }
    }
    

4. 确认Tokbox SDK版本

旧版本的Tokbox SDK可能存在后台兼容问题,建议升级到最新版的OpenTok iOS SDK,官方一直在优化后台场景的稳定性。

测试小技巧

你可以用Xcode的Debug -> Simulate Background功能模拟锁屏场景,实时查看控制台日志,检查OTSession的状态变化,确认会话是否保持连接。

按照上面的步骤配置完,基本就能解决锁屏后音视频流断开的问题了,我之前的几个项目都是这么搞定的。

内容的提问来源于stack exchange,提问作者Akshada-Systematix

火山引擎 最新活动