0

我们正在使用 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 中重新加载/离开页面时清理对话?

4

1 回答 1

0

您尝试做的问题是 (on)beforeunload 事件不会等待异步方法完成,因此您不能保证 leave() 将执行,也不能保证从会话管理器中删除对话的内部操作。我会建议一种类似于以下问题的方法 - onbeforeunload 确认屏幕自定义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();
    ...
};
于 2016-12-13T21:18:05.353 回答