在 app 断网或进程被杀时,SDK 会自动启用断线重连机制。本文展示声网 SDK 在这两个情况下连接状态的处理逻辑。
声网 SDK 在 v2.3.2 新增了 onConnectionStateChanged 或 connectionStateChangedToState 回调,用以报告当前的网络连接状态,及引起连接状态改变的原因。因此本文内容会分 v2.3.2 之前及 v2.3.3 之后两个版本来介绍。
下图展示从用户 UID 1 加入频道,到连接中断,再到重新加入频道过程中,本地及远端用户 UID 2 的应用层会收到的回调:
其中:
joinChannel 或 joinChannelByToken 请求joinChannel 或 joinChannelByToken 200 毫秒后,应用层可以加入频道。加入频道后 UID 1 的应用层收到 onJoinChannelSuccess 或 didJoinChannel 回调onUserJoined 或 didJoinedOfUid 回调onConnectionInterrupted 或 rtcEngineConnectionDidInterrupted 回调;同时 SDK 继续尝试重新加入频道onConnectionLost 或 rtcEngineConnectionDidLost 回调;同时 SDK 继续尝试重新加入频道onUserOffline 或 didOfflineOfUid 回调onRejoinChannelSuccess 或 didRejoinChannel 回调onUserJoined 或 didJoinOfUid 回调,表示远端用户重新上线下图展示从用户 UID 1 加入频道,到连接中断,再到连接完全失败过程中,本地及远端用户 UID 2 的应用层会收到的回调:
其中:
joinChannel 或 joinChannelByToken 请求joinChannel 或 joinChannelByToken 200 毫秒后,应用层可以加入频道。加入频道过程中,UID 1 的应用层会收到 onConnectionStateChanged(CONNECTION_STATE_CONNECTING, CONNECTION_CHANGED_CONNECTING) 或 connectionChangedToState(AgoraConnectionStateConnecting, AgoraConnectionChangedConnecting);加入后收到 onConnectionStateChanged(CONNECTION_STATE_CONNECTED, CONNECTION_CHANGED_JOIN_SUCCESS) 或 connectionChangedToState(AgoraConnectionStateConnected, AgoraConnectionChangedJoinSuccess) 和 onJoinChannelSuccess 或 didJoinChannel 回调onUserJoined 或 didJoinedOfUid 回调,onConnectionStateChanged(CONNECTION_STATE_RECONNECTING, CONNECTION_CHANGED_INTERRUPTED) 或 connectionChangedToState(AgoraConnectionStateReconnecting, AgoraConnectionChangedInterrupted) 回调;同时 SDK 继续尝试重新加入频道onConnectionStateChanged(CONNECTION_STATE_RECONNECTING, CONNECTION_CHANGED_INTERRUPTED) 或 connectionChangedToState(AgoraConnectionStateReconnecting, AgoraConnectionChangedInterrupted) 后连续 10 秒没有收到服务器发送的任何数据,应用层会收到 onConnectionLost 或 rtcEngineConnectionDidLost 回调;同时 SDK 继续尝试重新加入频道onUserOffline 或 didOfflineOfUid 回调onConnectionStateChanged(CONNECTION_STATE_RECONNECTING, CONNECTION_CHANGED_INTERRUPTED) 或 connectionChangedToState(AgoraConnectionStateReconnecting, AgoraConnectionChangedInterrupted) 后连续 20 分钟无法重新加入频道,SDK 不再继续尝试。UID 1 的应用层收到 onConnectionStateChanged(CONNECTION_STATE_FAILED, CONNECTION_CHANGED_JOIN_FAILED) 或 connectionChangedToState(AgoraConnectionStateFailed, AgoraConnectionChangedJoinFailed) 回调;用户需要退出当前频道,然后重新加入频道如果 UID 2 是 Web 客户端,则 Web 端在 UID 1 加入和重新接入频道时,会收到
client.on("stream-added")回调;如果 UID 2 在 10 秒内未收到 UID 1 的任何数据,会收到client.on("stream-removed")回调;如果服务器在 3 分钟内未收到 UID 1 的任何数据,会收到client.on("peer-leave")回调。
进程被杀包括以下各种情况:
假设有 UID 1, UID 2 两个用户处于同一个频道内进行音视频直播或通话。
当 UID 1 的进程被杀:
如果 UID 1 是 iOS 或 macOS 平台:UID 1 自动触发 leaveChannel,UID 2 有回调:
onUserOfflinedidOfflineOfUidclient.on("peer-leave")如果 UID 1 是 Android, Windows,或 Linux 平台,且 UID 2 使用的是 Native SDK:
onUserOfflinedidOfflineOfUid如果 UID 1 是 Android 或 Windows 台,且 UID 2 使用的是 Web SDK:
client.on("stream-removed")如果 UID 1 使用的是 Web SDK,进程被杀与掉线的行为是一样的。
如果 UID 1 是频道内最后一个用户,服务端会在 10s 后销毁频道。