在线状态管理

概念介绍

每个用户的状态类型有以下三种:
前台运行状态(Online)
后台运行状态(PushOnline)
未登录状态(Offline)
注意
后台运行状态(PushOnline)只有手机端(Android、iOS、iPad)会存在,PC、Mac、Linux和 Web 端不存在该种状态。

前台运行状态(Online)

前台运行状态(Online),是指客户端和即时通信 IM 服务端保持有顺畅的 TCP 网络连接,客户端可以发消息给即时通信 IM 服务端,也可以收到来自即时通信 IM 服务端推送的消息。
当用户打开 App 后,状态即为前台运行状态(Online)。
App 启动后,客户端和即时通信 IM 服务端建立 TCP 长连接,即时通信 IM 服务端保存客户端的在线信息,例如客户端的网络链路信息,客户端的平台版本等。App 在运行过程中,IM SDK 会定时发送心跳来确认用户的在线状态。
说明
心跳:IM SDK 每隔2分钟发一个心跳包给服务器,以确认用户的在线状态。

后台运行状态(PushOnline)

后台运行状态(PushOnline),是指客户端和即时通信 IM 服务端的 TCP 长连接断开。此时可收到消息的离线推送。 以下场景用户的状态为后台运行状态(PushOnline):
用户使用完 App ,把 App 切后台后进程被手机操作系统 kill 掉,或者用户主动 kill 掉 App 进程。 如果 App 在手机操作系统的保活白名单中,用户把 App 切后台,进程并不会被手机操作系统 kill 掉。此时状态仍然为前台运行状态(Online)。前台运行状态(Online)和后台运行状态(PushOnline)判断的标准之一是 App 进程是否被 kill ,即客户端和即时通信 IM 服务端的 TCP 长连接是否断开。
用户主动关闭客户端网络(例如打开手机飞行模式),或者客户端网络完全不可用(例如进入完全没有网络信号的隧道)。 在这种特殊情况下,客户端连 TCP 协议的 FIN 包或 RST 包都无法发出,即时通信 IM 服务端需要等待 400 秒后发现心跳包超时,状态才会变成后台运行状态(PushOnline)。
注意
后台运行状态(PushOnline)只有手机端(Android、iOS、iPad)会存在,PC、Mac、Linux、小程序和 Web 端不存在该种状态。

未登录状态(Offline)

未登录状态(Offline),是指用户没有输入帐号和密码登录前的状态,此时无法收到消息的在线推送,也无法收到消息的离线推送。 以下场景用户的状态为未登录状态(Offline):
用户主动登出,或下载 App 后还未进行过登录时。
用户状态变成后台运行状态(PushOnline)后,7天内没有再登录过,此时状态变为未登录状态(Offline)。

查询用户在线状态

App 后台可以通过 REST API:获取用户在线状态 来查询一批用户的在线状态。 IM SDK 暂时无法获取用户的在线状态。

用户在线状态变更通知

即时通信 IM 可以把用户上下线的事件通知给 App 后台,参见 状态变更回调 文档。

状态变更感知的实时性

Android/iOS/iPad/PC/Mac/Linux

对于绝大多数情况,用户状态的变化都能实时感知,例如:
用户主动登录,状态变成前台运行状态(Online)。
用户主动登出, 状态变成未登录状态(Offline)。
用户主动 kill 客户端进程,或者用户切后台后,客户端进程被手机操作系统 kill 掉,状态变成后台运行状态(PushOnline)。
只有以下一种特殊情况,IM 云服务器需要等待400秒的心跳超时时间才能感知状态变更: 当网络完全不可用时,客户端连 TCP 协议层的 FIN 包或 RST 包都无法发出时,IM 云服务器需要等待400秒的心跳超时时间才能感知到状态变成后台运行状态(PushOnline)。常见的场景有用户主动关闭客户端的网络(例如开启手机的飞行模式),或者进入完全没有网络信号的隧道。

Web

用户主动登录 Web 端时,IM 云服务器可以实时感知到状态变成前台运行状态(Online)。
各种场景的退出/断线的状态变更实时性如下:
直接关闭页面,可以实时感知,状态变成未登录状态(Offline)。
页面不关闭时,网络断开,需要 60s 才能感知到,状态变成未登录状态(Offline)。
主动调用 destroy 接口,可以实时感知,变成未登录状态(Offline)。

小程序

用户主动登录小程序端时,IM 云服务器可以实时感知到状态变成前台运行状态(Online)。
各种场景的退出/断线的状态变更实时性如下:
点右上角退出,5s 内感知到状态变成未登录状态(Offline)。
断网(如手机开启飞行模式) ,60s 感知到状态变成未登录状态(Offline)。
主动调用 destroy 接口,可以实时感知,变成未登录状态(Offline)。

多端登录

互踢

默认情况,IM SDK 在同时登录多个终端(如同时登录 PC、Android)时,会进行互踢,只有最后一个登录的设备可以在线,之前登录的都会被踢下线,详细互踢逻辑可以参考以下文档:

同时在线

即时通信 IM 支持在 控制台 修改同时在线策略,目前支持的多平台同时在线策略如下:
单平台登录:Android、iPhone、iPad、Windows、Mac、Web 仅可有1种平台在线。
双平台登录:Android、iPhone、iPad、Windows、Mac 可有1端在线;Web 可同时在线。
三平台登录:Android、iPhone、iPad 可有1种平台在线;Windows、Mac 可有1种平台在线;Web 可同时在线。
多平台登录:Android、iPhone、iPad、Windows、Mac、Web 可全平台同时在线。
默认情况下,每种平台只支持1个终端在线(如 Android 和 Android 会互踢),进阶版用户允许配置 Android、iPhone、iPad、Windows、Mac 同种平台可登录的最大实例数。另外,所有用户均可配置 Web 平台可登录的最大实例数。
同平台多设备在线,提升用户体验必备工具,支持配置同种平台可登录的最大实例数,防止同平台多设备上线后互踢的情况出现,让用户体验更丝滑。
说明
“同平台多设备在线”为 IM 进阶版功能,购买进阶版 后可使用,详见 价格说明