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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:06:01