连接状态管理

最近更新时间:2022-09-20 05:17:40

本文介绍 RTM SDK 与 RTM 服务之间的连接状态以及连接状态如何在不同状态之间切换。

概述

网络连接状态指的是 RTM SDK 与 RTM 服务之间的连接状态,分别有:

连接状态说明
ARtmConnectionStateDisconnected用户未连接
ARtmConnectionStateConnecting用户正在连接
ARtmConnectionStateConnected用户已连接
ARtmConnectionStateReconnecting用户正在重连
ARtmConnectionStateAborted用户被踢出

网络连接状态的改变可以调用 API 主动改变,RTM SDK 也会根据网络等条件自动实现部分状态切换。

当连接状态发生改变时,RTM SDK 会通过 onConnectionStateChanged 回调返回最新的连接状态 ARtmConnectionState 的枚举值 和 状态变化的原因 ARtmConnectionChangeReason 的枚举值。

调用 API 改变连接状态

主动调用 API 方法改变网络连接状态的有:loginByToken 和 logoutWithCompletion。

1. 登录 RTM 系统

当调用 loginByToken 登录 RTM 系统时,连接状态会从 ARtmConnectionStateDisconnected 变为 ARtmConnectionStateConnecting,状态改变原因为 ARtmConnectionChangeReasonLogin。

当处于 ARtmConnectionStateConnecting 状态时,你不需要进行任何操作,连接状态会自动转换为下列状态之一:

  • ARtmConnectionStateDisconnected:用户登录失败或登录超时(6 秒内未登录系统)。
  • ARtmConnectionStateConnected:用户登录成功。 当连接状态变为 ARtmConnectionStateDisconnected 后,你需要重新调用 loginByToken 登录。

2. 登出 RTM 系统

当调用 logoutWithCompletion 登出 RTM 系统,连接状态会转换为 ARtmConnectionStateDisconnected。

根据条件自动改变连接状态

1. 断网重连

当连接处于 ARtmConnectionStateConnected 状态时,如果由于网络原因与 RTM 系统的连接中断超过 4 秒,连接状态会转换为 ARtmConnectionStateConnecting,状态改变原因为 ARtmConnectionChangeReasonInterrupted。处于 ARtmConnectionStateConnecting状态时,RTM SDK 会持续自动重新登录 RTM 系统直至登录成功,因此你无需进行任何登录操作。重新登录成功后,连接状态会转换为 ARtmConnectionStateConnected,SDK 不会返回 ARtmLoginBlock 回调。

自动重连成功后,RTM 系统会对断开连接期间的消息进行补发:

  • RTM 系统会补发断开连接期间的全部点对点消息。
  • RTM 系统会补发重连成功之前 30 秒内的频道消息。最多补发 32 条频道消息。

如果一直无法重新登录成功,连接状态会保持在 ARtmConnectionStateConnecting。你可以调用 logoutWithCompletion 先登出系统再根据实际业务情况调用 loginByToken 方法重新登录 RTM 系统。

注意事项:

  • 30 秒内重连成功,连接状态会变更为 ARtmConnectionStateConnected。用户的在线状态不变。
  • 30 秒内仍然未重连成功,RTM 系统会将对应用户从在线用户列表和频道中移除,同一频道的用户会收到 MemberLeft 回调。如果用户在之后重新成功登录系统,连接状态会变更为 ARtmConnectionStateConnected,SDK 会自动帮助对应用户加入之前加入的频道,同一频道的用户会收到 memberJoined 回调。由于此时 RTM 系统已将用户从在线列表中移除, SDK 还会自动同步用户属性到 RTM 系统。
  • SDK 重连时,如果 Token 过期,SDK 会返回 rtmKitTokenDidExpire 回调。但是该回调不会对连接状态产生影响。

2. 被踢出 RTM 系统

RTM 系统不支持多点登录,如果使用相同的用户 ID 登录 RTM 系统,当前登录状态的用户会被 RTM 系统踢出,连接状态变为 ARtmConnectionStateAborted。

你可以调用 logoutWithCompletion 先登出系统再根据实际业务情况调用 loginByToken 方法重新登录 RTM 系统。

在 ARtmConnectionStateAborted 状态下,调用所有需要当前用户登录的 API 都会失败。在实际业务场景中,对于被踢出的用户,建议应用对用户自动进行登出,但需要让用户手动进行再次登录。如果你实现了被踢状态下的自动登出和自动登录,可能会导致两端用户循环互踢。循环互踢一旦发生,需要一端的用户登出或者杀掉进程才会停止。

示例代码

参考以下示例代码监听连接状态:

// 监听连接状态
func rtmKit(_ kit: ARtmKit, connectionStateChanged state: ARtmConnectionState, reason: ARtmConnectionChangeReason) {
}

API 参考