概念介绍
每个用户的状态类型有以下三种:
- 前台运行状态(Online)
- 后台运行状态(PushOnline)
- 未登录状态(Offline)
注意:后台运行状态(PushOnline)只有手机端(Android/iOS)会存在,PC、小程序和 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)会存在,PC、小程序和 Web 端不存在该种状态。
未登录状态(Offline)
未登录状态(Offline),是指用户没有输入帐号和密码登录前的状态,此时无法收到消息的在线推送,也无法收到消息的离线推送。
以下场景用户的状态为未登录状态(Offline):
- 用户主动登出,或下载 App 后还未进行过登录时。
- 用户状态变成后台运行状态(PushOnline)后,7天内没有再登录过,此时状态变为未登录状态(Offline)。
查询用户在线状态
App 后台可以通过 REST API:获取用户在线状态 来查询一批用户的在线状态。
IM SDK 暂时无法获取用户的在线状态。
用户在线状态变更通知
即时通信 IM 可以把用户上下线的事件通知给 App 后台,参见 状态变更回调 文档。
状态变更感知的实时性
Android/iOS/PC
对于绝大多数情况,用户状态的变化都能实时感知,例如:
- 用户主动登录,状态变成前台运行状态(Online)。
- 用户主动登出, 状态变成未登录状态(Offline)。
- 用户主动 kill 客户端进程,或者用户切后台后,客户端进程被手机操作系统 kill 掉,状态变成后台运行状态(PushOnline)。
只有以下一种特殊情况,IM 云服务器需要等待400秒的心跳超时时间才能感知状态变更:
当网络完全不可用时,客户端连 TCP 协议层的 FIN 包或 RST 包都无法发出时,IM 云服务器需要等待400秒的心跳超时时间才能感知到状态变成后台运行状态(PushOnline)。常见的场景有用户主动关闭客户端的网络(例如开启手机的飞行模式),或者进入完全没有网络信号的隧道。
Web
用户主动登录 Web 端时,IM 云服务器可以实时感知到状态变成前台运行状态(Online)。
用户网络不可用,或者直接关闭 Web 页面时,IM 云服务器需要等待400秒的心跳超时时间才能感知到状态变成未登录状态(Offline)。
多端登录
互踢
默认情况,IM SDK 在同时登录多个终端(如同时登录 PC、Android)时,会进行互踢,只有最后一个登录的设备可以在线,之前登录的都会被踢下线,详细互踢逻辑可以参考以下文档:
- Android 用户状态变更
- iOS 用户状态变更
同时在线
即时通信 IM 支持在 控制台 修改同时在线策略,通过配置可以做到 PC 端和手机端同时在线,或者 PC、iOS 和 Android 都可以同时在线。开启同时在线登录不同终端后不会互踢,但是两个相同终端(例如两个 iOS 端登录)仍然会互踢。