tencent cloud

文档反馈

状态变更回调

最后更新时间:2024-02-19 10:48:46

    功能说明

    App 后台可以通过该回调实时查看用户上、下线的行为,包括:
    用户上线(TCP 连接建立)
    用户注销下线或者用户网络断开(TCP 连接断开)
    App 心跳超时(App 异常被 kill 或者 Crash)

    注意事项

    要启用回调,必须配置回调 URL,并打开本回调对应的开关,配置方法详见 第三方回调配置 文档。
    回调的方向是即时通信 IM 后台向 App 后台发起 HTTP POST 请求。
    App 后台在收到回调请求之后,务必校验请求 URL 中的参数 SDKAppID 是否是自己的 SDKAppID。
    其他安全相关事宜请参考 第三方回调简介:安全考虑 文档。
    使用终端 SDK 增强版5.6.1200之后的版本,或使用 Web SDK 2.14.0之后的版本时,因多终端登录或多实例登录被踢之后,只会触发一个 Login(Register)回调。而使用其他 SDK 版本的,当多终端登录或多实例登录被踢之后,会同时触发 Login(Register)回调和 Logout(Unregister)回调。

    可能触发该回调的场景

    用户通过客户端发起登录的上线请求。
    用户通过客户端发起登出的下线请求。
    用户的客户端发生断网重连。
    用户主动 kill 客户端进程,或者切后台后进程被手机操作系统 kill 掉,或者 crash 导致进程异常退出,云服务器检测到客户端网络断开后触发网络断开回调。
    客户端心跳超时,如关闭网络,或网络完全不可用,云服务器检测到客户端的心跳超时触发连接断开回调。心跳超时时间为 400 秒。

    回调的实时性

    Android/iOS/PC

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

    Web

    用户主动登录 Web 端时,IM 云服务器可以实时触发 Login(Register)回调。
    各种场景的退出/断线的状态变更回调实时性如下:
    直接关闭页面,可以实时触发 Disconnect(LinkClose)回调。
    页面不关闭时,网络断开,需要 60s 才能触发 Disconnect(LinkClose)回调。
    主动调用 destroy 接口,可以实时触发 Logout(Unregister)回调。

    小程序

    用户主动登录小程序端时,IM 云服务器可以实时触发 Login(Register)回调。
    各种场景的退出/断线的状态变更实时性如下:
    点右上角退出,5s 内触发 Disconnect(LinkClose)回调。
    断网(如手机开启飞行模式) ,60s 左右触发 Disconnect(LinkClose)回调。
    微信切后台,30s 左右触发 Disconnect(LinkClose)回调。
    杀掉微信进程,可以实时触发 Disconnect(LinkClose)回调。
    主动调用 destroy 接口,可以实时触发 Logout(Unregister)回调。

    接口说明

    请求 URL 示例

    以下示例中 App 配置的回调 URL 为 https://www.example.com示例:
    https://www.example.com?SdkAppid=$SDKAppID&CallbackCommand=$CallbackCommand&contenttype=json&ClientIP=$ClientIP&OptPlatform=$OptPlatform

    请求参数说明

    参数
    说明
    https
    请求协议为 HTTPS,请求方式为 POST
    www.example.com
    回调 URL
    SdkAppid
    创建应用时在即时通信 IM 控制台分配的 SDKAppID
    CallbackCommand
    固定为:State.StateChange
    contenttype
    固定值为 JSON
    ClientIP
    客户端 IP,格式如:127.0.0.1
    OptPlatform
    客户端平台,取值参见 第三方回调简介:回调协议 中 OptPlatform 的参数含义

    请求包示例

    {
    "CallbackCommand": "State.StateChange",
    "EventTime": 1629883332497,
    "Info": {
    "Action": "Login",
    "To_Account": "testuser316",
    "Reason": "Register"
    },
    "KickedDevice": [
    {
    "Platform": "Windows"
    },
    {
    "Platform": "Android"
    }
    ]
    }

    请求包字段说明

    字段
    类型
    说明
    CallbackCommand
    String
    回调命令
    Info
    Object
    用户上下线的信息
    Action
    String
    用户上线或者下线的动作,Login 表示上线(TCP 建立),Logout 表示下线(TCP 断开),Disconnect 表示网络断开(TCP 断开)
    To_Account
    String
    用户 UserID
    Reason
    String
    用户上下线触发的原因:
    Login 的原因有 Register:App TCP 连接建立或断网重连
    Logout 的原因有 Unregister:App 用户注销账号导致 TCP 断开
    Disconnect 的原因有 LinkClose:即时通信 IM 检测到 App TCP 连接断开(例如 kill App,客户端发出 TCP 的 FIN 包或 RST 包);TimeOut:即时通信 IM 检测到 App 心跳包超时,认为 TCP 已断开(例如客户端网络异常断开,未发出 TCP 的 FIN 包或 RST 包,也无法发送心跳包)。心跳超时时间为400秒
    各种具体场景触发的回调 Reason 请参考 可能触发该回调的场景
    KickedDevice
    Array
    如果本次状态变更为 Login(Register),而且有其他设备被踢下线,才会有此字段。此字段表示其他被踢下线的设备的信息。
    KickedDevice.Platform
    String
    被踢下线的设备的平台类型,可能的取值有"iOS", "Android", "Web", "Windows", "iPad", "Mac", "Linux"。
    EventTime
    Integer
    触发本次回调的时间戳,单位为毫秒。

    应答包示例

    {
    "ActionStatus": "OK",
    "ErrorCode": 0,
    "ErrorInfo": ""
    }

    应答包字段说明

    字段
    类型
    属性
    说明
    ActionStatus
    String
    必填
    请求处理的结果,OK 表示处理成功,FAIL 表示失败
    ErrorCode
    Integer
    必填
    错误码,0表示 App 后台处理成功,1表示 App 后台处理失败
    ErrorInfo
    String
    必填
    错误信息

    参考

    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持