在页面重新加载时与 Skype Web SDK 进行对话

Posted

技术标签:

【中文标题】在页面重新加载时与 Skype Web SDK 进行对话【英文标题】:Leave a conversation with Skype Web SDK on page reload 【发布时间】:2016-12-12 10:08:30 【问题描述】:

我们正在使用 Skype Web SDK (https://msdn.microsoft.com/en-us/skype/websdk/docs/skypewebsdk) 构建一个 Web 应用程序。我们同时使用音频和 IM 功能与其他方建立联系。

目前我们面临以下问题:如果我们的应用程序正在与另一方进行对话(例如,使用 Skype for Business 桌面客户端)并且用户离开或重新加载页面,另一方不会收到有关的通知左边的用户。

对于音频对话,结果如下:对方仍在通话中,离开的唯一指示是对方听不到任何声音。

对于 IM 对话,结果如下:如果对方在此对话中发送 IM,则会收到无法传递消息的通知。

我们尝试使用 onbeforeunload 事件在页面卸载之前离开对话。回调在 IE 11 和 Chrome 中都执行,但只有在 Chrome 中用户才真正离开对话(使用 IM 对话测试,因为 Chrome 不支持音频/视频)。

window.onbeforeunload = function() 
    // conversation is the conversation we're currently in
    conversation.leave().then(function () 
        client.conversationsManager.conversations.remove(conversation);
    );
;

由于我们依赖音频功能,我们不能简单地仅切换到 Chrome。有什么方法可以确保在 Internet Explorer 中重新加载/离开页面时清理对话?

【问题讨论】:

【参考方案1】:

您尝试做的问题是 (on)beforeunload 事件不会等待异步方法完成,因此您不能保证 leave() 将执行,也不能保证内部操作从对话管理器。我建议采用类似于以下问题的方法 - onbeforeunload confirmation screen customization 或 beforeunload

您想要做的是将用户置于需要与对话进行交互的状态,这可能(但也不能保证)提供足够的周期来离开对话。在您的情况下,它可能类似于以下内容:

window.onbeforeunload = function(e) 
    // track if a conversation is live
    if (_inActiveConversation) 
        // conversation is the conversation we're currently in
        conversation.leave().then(function () 
            client.conversationsManager.conversations.remove(conversation);
        );

        var msg = 'Cleaning up active conversations...';
        e.returnValue = msg;
        return msg;
    
;

您还应该了解的是,最终服务器端将从对话中删除该用户,因为应用程序不再处理传入事件。因此,以上是清理最终将被回收的资源的尽力

您也可以尝试在signInManager 上发出signOut 请求,因为这应该允许服务器在服务器端清理与该应用程序相关的资源。

window.onbeforeunload = function() 
     ...
    _client.signInManager.signOut();
    ...
;

【讨论】:

感谢您的回答!即使使用您的解决方法,IE 似乎也没有在 onbeforeunload 中执行异步回调(与 Chrome 相比,我已经在 onbeforeunload 中使用 ajax 调用对此进行了测试)。我认为因为 Skype Web SDK 依赖于这个异步回调来停止/离开对话,所以不可能以随意的方式停止对话。你知道有什么方法可以强制 SDK 停止对话而不需要内部等待吗?遗憾的是,服务器端花了很长时间才意识到客户端已经消失(你是对的,它会检查这个)。 我添加了一个更强大的 onbeforeunload 选项,因为它似乎只返回一个字符串消息并不适用于所有情况。我还在 signInManager 上添加了调用 signOut 的选项,因为这也会触发清理。如果在 onbeforeunload 中没有某种形式的延迟,您就会被卡住,希望调用在卸载之前完成。 在我的测试中,IE 没有执行任何操作,而 Leave-Or-Stay-Box 已显示。我还测试了执行 AJAX 请求。事实证明,发送了一个请求(也没有离开或停留框),但回调永远不会被执行。您认为可以向 UCWA 发出简单的 AJAX 请求以删除对话吗? 这是可能的,但问题是您很可能无法访问从 Skype Web SDK 执行 DELETE 所需的 URL。 是的,可能是一个跨域请求...所以它必须在从该服务器加载的 Skype Web SDK 的 sdk.js 中,对吧?

以上是关于在页面重新加载时与 Skype Web SDK 进行对话的主要内容,如果未能解决你的问题,请参考以下文章

页面加载时与 _next/webpack-hmr 的连接中断

Skype Web SDK - 找不到此配置的包定义

在 Node.js 中使用 Skype-sdk 构建的 Skype 机器人运行不正确?

Skype Web 的 Chrome 扩展按键

克隆存储库时与谷歌应用引擎一起使用啥凭据?

HTML和Javascript高手进,图片总重复加载的问题