连接状态管理

最近更新时间: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 方法改变网络连接状态的有:loginByTokenlogoutWithCompletion

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 参考