iOS端MS Teams集成OpenTok时出现重复会话问题
解决方案
问题根因
iOS端MS Teams的标签页运行逻辑和桌面端存在差异:桌面端切换出标签页时会触发页面unload事件销毁页面实例,而iOS端会将页面存入WebView往返缓存,不会触发页面卸载相关事件,所以原绑定在卸载事件里的OpenTok会话销毁逻辑不会执行,再次打开标签页时初始化逻辑重复执行,就会出现新旧会话共存的问题。
修复步骤
- 替换清理逻辑的绑定事件,不再仅依赖
unload/beforeunload事件,改为绑定MS Teams提供的原生标签页可见性变更事件,在标签页切换为不可见时直接销毁OpenTok会话:microsoftTeams.app.initialize().then(() => { microsoftTeams.app.registerOnVisibilityChange((isVisible) => { if (!isVisible && window.currentOTSession) { // 销毁旧会话 window.currentOTSession.disconnect(); window.currentOTSession = null; } }); }); - 初始化OpenTok会话前增加前置校验,每次初始化前先检查是否存在未销毁的全局会话实例,存在则先销毁再创建新实例,避免重复创建:
// 初始化前置校验 if (window.currentOTSession) { window.currentOTSession.disconnect(); window.currentOTSession = null; } // 创建新会话 const newSession = OT.initSession(OPEN_TOK_API_KEY, SESSION_ID); window.currentOTSession = newSession; - 额外适配iOS WebView的往返缓存特性,监听
pageshow事件,当页面从缓存恢复时先执行会话清理逻辑:window.addEventListener('pageshow', (e) => { // e.persisted为true表示页面从往返缓存加载 if (e.persisted && window.currentOTSession) { window.currentOTSession.disconnect(); window.currentOTSession = null; } });
以上方案兼容桌面端逻辑,不会影响桌面端原有正常运行的销毁流程。
内容的提问来源于stack exchange,提问作者Alex Mac
相关产品推荐
相关产品推荐

