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

iOS集成最新版Jitsi Meet SDK遇QoS优先级反转崩溃问题求助

iOS集成Jitsi Meet SDK后多次通话崩溃(QoS优先级反转问题)

问题描述

集成最新版Jitsi Meet SDK到iOS应用后,重复发起/结束一对一通话2-3次后应用崩溃,报错:

Thread running at QOS_CLASS_USER_INTERACTIVE waiting on a lower QoS thread running at QOS_CLASS_DEFAULT. Investigate ways to avoid priority inversions.

复现步骤:

  • 发起一对一通话
  • 接收方加入后离开会议
  • 再次发起一对一通话
  • 接收方再次加入后离开会议
  • 应用崩溃并触发上述错误

崩溃前日志:

2023-05-25 12:40:13.351655+0530 GatherHall-Staging[14842:1032673] [JitsiMeetSDK] [JitsiConference.js] Removing remote P2P track: RemoteTrack[userID: f9dd57e1, type: audio, ssrc: 2609474008, p2p: true, sourceName: f9dd57e1-a0, status: {readyState: live, muted: false, enabled: true}] 
2023-05-25 12:40:13.351803+0530 GatherHall-Staging[14842:1032662] [JitsiMeetSDK] [JitsiConference.js] Stopping remote stats for P2P connection participantLeft [AnyHashable(“participantId”): f9dd57e1] 
2023-05-25 12:40:13.354828+0530 GatherHall-Staging[14842:1032872] [JitsiMeetSDK] [JitsiConference.js] Stopping CallStats for P2P connection 
2023-05-25 12:40:13.355889+0530 GatherHall-Staging[14842:1032674] [JitsiMeetSDK] [modules/xmpp/JingleSessionPC.js] JingleSessionPC[session=P2P,initiator=true,sid=07968ae8bcb6] Skipped sending session-terminate 
2023-05-25 12:40:13.357528+0530 GatherHall-Staging[14842:1032662] [JitsiMeetSDK] [modules/xmpp/JingleSessionPC.js] JingleSessionPC[session=P2P,initiator=true,sid=07968ae8bcb6] Session terminated undefined undefined 
2023-05-25 12:40:13.361885+0530 GatherHall-Staging[14842:1032662] [JitsiMeetSDK] [JitsiConference.js] Peer to peer connection closed!

解决方案

1. 调整SDK线程QoS优先级

在初始化Jitsi Meet前,强制将SDK相关操作的线程优先级与主线程对齐为QOS_CLASS_USER_INTERACTIVE,避免高低优先级线程锁竞争:

// 初始化前设置线程优先级
Thread.current.qualityOfService = .userInteractive

// 初始化JitsiMeet配置
let options = JitsiMeetConferenceOptions.fromBuilder { builder in
    builder.setServerURL(URL(string: "你的Jitsi服务器地址"))
    // 其他业务配置
}
JitsiMeet.sharedInstance().initialize(options)

同时,在会议结束的回调中,将资源清理操作放到高优先级线程执行:

func conferenceTerminated(_ data: [AnyHashable : Any]!) {
    DispatchQueue.global(qos: .userInteractive).async {
        // 自定义资源清理逻辑
    }
}

2. 主动清理SDK资源

每次会议结束后调用destroy()释放SDK持有的所有资源,避免重复创建会议导致的资源堆积和线程冲突:

func conferenceTerminated(_ data: [AnyHashable : Any]!) {
    JitsiMeet.sharedInstance().destroy()
    
    // 若需要再次发起会议,延迟重新初始化
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        let newOptions = JitsiMeetConferenceOptions.fromBuilder { builder in
            // 重新配置会议参数
        }
        JitsiMeet.sharedInstance().initialize(newOptions)
    }
}

3. 降级到稳定版SDK

部分开发者反馈最新版SDK存在未修复的QoS线程问题,可降级到6.2.0等已知稳定版本,在Podfile中指定版本:

pod 'JitsiMeetSDK', '~> 6.2.0'

4. 临时禁用P2P模式

如果业务允许,可在会议配置中关闭P2P模式,强制使用SFU服务器转发,规避P2P连接的线程管理问题:

let options = JitsiMeetConferenceOptions.fromBuilder { builder in
    builder.setFeatureFlag("p2p.enabled", withBoolean: false)
    // 其他配置
}

内容的提问来源于stack exchange,提问作者S K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:00:16