如何恢复会话 - ejabberd
Posted
技术标签:
【中文标题】如何恢复会话 - ejabberd【英文标题】:How to resume session - ejabberd 【发布时间】:2017-03-16 13:03:44 【问题描述】:对于会话恢复,我正在关注 xep-0198(XMPP 框架中的流管理)。它只能工作 300 秒。如果用户超过 300 秒没有打开聊天应用程序,即使我增加了超时间隔,连接也会自动丢失。
我对 yml 文件做了以下操作:
listen:
-
port: 5222
module: ejabberd_c2s
resend_on_timeout: if_offline
stream_management: true
resume_timeout: 10000
max_resume_timeout: 10000
在代码中:(Swift) 登录应用程序时
xmppStreamManagement = XMPPStreamManagement(storage: XMPPStreamManagementMemoryStorage(), dispatchQueue: DispatchQueue.main)
xmppStreamManagement?.autoResume = true
xmppStreamManagement?.addDelegate(self, delegateQueue: DispatchQueue.main)
xmppStreamManagement?.activate(stream)
认证后:
xmppStreamManagement?.enable(withResumption: true, maxTimeout: 10000)
func canResumeStream() -> Bool
return true
func xmppStreamManagement(_ sender: XMPPStreamManagement!, wasEnabled enabled: DDXMLElement!)
print("enabled")
func xmppStreamManagement(_ sender: XMPPStreamManagement!, wasNotEnabled failed: DDXMLElement!)
print("not enabled")
func supportsStreamManagement() -> Bool
return true
我从服务器得到以下结果:
<enabled xmlns="urn:xmpp:sm:3" resume="true" max="10000" id="g2gCbQAAABY1NzQ5MzQwOTgwNjk2OTY4NTcxMjE4aANiAAAF0WIACjagYRg="/>
但如果我让用户闲置超过 5 分钟,会话就会过期。谁能帮我解决这个问题?
【问题讨论】:
您必须在服务器端启用 mod_ping 或每隔一段时间 ping 到服务器,否则 TCP/IP 连接将关闭。 【参考方案1】:您可以使用 XMPPPingModule (XEP-0199: XMPP Ping) 来保持会话处于活动状态。
例子:
let xmppPing = XMPPPing()
xmppPing?.respondsToQueries = true
xmppPing?.activate(stream)
let xmppAutoPing = XMPPAutoPing()
xmppAutoPing?.pingInterval = (yourTimeInterval) * 60
xmppAutoPing?.pingTimeout = pingTimeOutTime
xmppAutoPing?.activate(stream)
【讨论】:
以上是关于如何恢复会话 - ejabberd的主要内容,如果未能解决你的问题,请参考以下文章