用户在线状态管理
用户在线状态管理
用户在线状态(即 Presence)包含用户的在线、离线和自定义状态。
用户在线状态类型
在线
用户启动 app 后,客户端和即时通信 IM 服务端成功建立了网络连接。客户端可以发消息给即时通信 IM 服务端,也可以收到来自即时通信 IM 服务端推送的消息。即时通信 IM 服务端保存客户端的在线信息,例如,客户端的网络链路信息,客户端的平台版本等。App 在运行过程中,IM SDK 每隔 5 分钟发一个心跳包给服务器,以确认用户的在线状态。
离线
离线指用户成功登出环信即时通讯 IM 系统或与即时通讯 IM 系统断开连接后的状态。用户登出即时通讯 IM 系统之后,无法发送和接收消息,在下次登录后可以接收到离线消息。
在以下场景下,用户为离线状态:
- 杀掉 App 进程:用户将 App 切后台后进程后被设备的操作系统杀掉,或用户主动杀掉 App 进程。
- 网络连接断开:用户主动关闭客户端网络,状态立即会变成离线。或者,客户端网络完全不可用时,例如,进入没有网络信号的隧道或打开移动设备的飞行模式,环信即时通信 IM 服务端等待 5 分钟后发现心跳包超时,状态会变成离线。
自定义状态
用户可以设置自定义状态,例如忙碌、马上回来、离开、接听电话、外出就餐等。
查询用户在线状态
环信即时通讯 IM 支持调用 REST API 或客户端接口批量查询用户的在线状态。
用户状态变更
用户在线状态变更通知
用户的状态从“在线”变为“离线”时,客户端收到连接断开通知(例如,Android 为
OnDisconnected
),从“离线”变为“在线”时,客户端收到已连接通知(例如,Android 为OnConnected
)。用户发布自定义在线状态后,发布者和订阅者均会收到自定义在线状态变更的回调,例如,Android 为
EMPresenceListener#onPresenceUpdated
回调。当 SDK 监测到当前账号从“自定义状态”变更为“离线”状态后,会自动清除自定义状态,并且触发状态变更通知,例如,Android 为
OnConnected
。
用户状态回调事件
用户成功登入时,状态为在线,成功登出或被踢下线时,用户状态为离线。
用户登入、登出或被踢时,环信服务器会向你设置的发送后回调地址发送相关事件时携带用户状态,详见用户登入和登出事件。
状态变更感知的实时性
Android/iOS/HarmonyOS/Flutter/React Native
用户可实时感知用户状态变化:
- 用户登录成功,状态变成在线;
- 用户登出成功,状态变成离线。若调用登出接口时,设置了解绑推送 token(device token),则用户无法收到离线推送通知;若不解绑,则用户可以收到离线推送通知。
- 用户主动杀掉客户端进程或用户将 App 切后台后进程被设备的操作系统杀掉,状态变成离线。
- 当网络不可用,例如,用户打开移动设备飞行模式或进入无网络的隧道,环信即时通信 IM 服务端等待 5 分钟后发现心跳包超时,用户状态会变成离线。
Web
用户成功登录 Web 端时,环信服务器可以实时感知到状态变成在线:
- 直接关闭页面,可以实时感知,状态变成离线。
- 页面不关闭时,网络断开,需要 5 分钟左右才能感知到,状态变成离线。
- 主动调用
close
接口,可以实时感知,变成离线。 - 当网络不可用,例如,用户打开移动设备飞行模式或进入无网络的隧道,环信即时通信 IM 服务端等待 5 分钟后发现心跳包超时,用户状态会变成离线。
小程序
用户成功登录小程序端时,环信服务器可以实时感知到状态变成在线:
- 点右上角退出,5s 内感知到状态变成离线。
- 断网(如手机开启飞行模式) ,需要 5 分钟左右 感知到状态变成离线。
- 微信切后台,30s 左右状态变成离线。
- 杀掉微信进程,可以实时感知,变成离线。
- 主动调用
close
接口,可以实时感知,变成离线。 - 当网络不可用,例如,用户打开移动设备飞行模式或进入无网络的隧道,环信即时通信 IM 服务端等待 5 分钟后发现心跳包超时,用户状态会变成离线。
Unity/Windows
用户可实时感知用户状态变化:
- 用户登录成功,状态变成在线;
- 用户登出成功,状态变成离线。
- 用户主动杀掉客户端进程或用户将 App 切后台后进程被设备的操作系统杀掉,状态变成离线。
- 当网络不可用,例如,用户打开移动设备飞行模式或进入无网络的隧道,环信即时通信 IM 服务端等待 5 分钟后发现心跳包超时,用户状态会变成离线。
多端登录
- 多设备同时在线:多端登录时,即时通讯 IM 每端默认最多支持 4 个设备同时在线。如需增加支持的设备数量,可以联系环信即时通讯 IM 的商务经理。
单设备登录场景下,后登录的设备会将之前登录的设备踢下线。被踢下线的设备处于未登录状态,不会收到离线推送。
- 踢下线:多设备登录时,若达到登录设备数量的上限,新登录的设备会将之前登录的设备踢下线。被踢下线的设备处于未登录状态,不会收到离线推送。
关于多端登录,详见相关文档。