更新时间: 2021-03-08
# 功能描述
在应用的整个生命周期,此方法只需要调用一次,之后无论是网络异常或者 App 有前后台的切换,SDK 都会自动重连,直到开发者主动断开连接。
# 调用连接接口
# 接口示例 1
输入参数:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
token | NSString | 是 | 需要您的 Server 调用 融云服务获取 Token |
dbOpenedBlock | Block | - | 本地消息数据库打开的回调 |
successBlock | Block | - | 连接建立成功的回调 |
errorBlock | Block | - | 连接建立失败的回调 |
回调参数:
dbOpenedBlock 说明:
回调参数 | 回调类型 | 说明 |
---|---|---|
code | RCDBErrorCode | 数据库是否已打开 |
successBlock 说明:
回调参数 | 回调类型 | 说明 |
---|---|---|
userId | NSString | 当前连接成功的用户 ID |
errorBlock 说明:
回调参数 | 回调类型 | 说明 |
---|---|---|
status | RCConnectErrorCode (opens new window) | 连接失败的错误码 |
代码示例:
[[RCIMClient sharedRCIMClient] connectWithToken:@"开发者的 server 通过请求 server api 获取到的 token 值" dbOpened:^(RCDBErrorCode code) { //消息数据库打开,可以进入到主页面 } success:^(NSString *userId) { //连接成功 } error:^(RCConnectErrorCode status) { if (status == RC_CONN_TOKEN_INCORRECT) { //从 APP 服务获取新 token,并重连 } else { //无法连接到 IM 服务器,请根据相应的错误码作出对应处理 } }]
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 接口示例 2
输入参数:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
token | NSString | 是 | 需要您的 Server 调用 融云服务获取 Token |
timeLimit | int | 是 | SDK 连接超时时间,单位:秒 |
dbOpenedBlock | Block | - | 本地消息数据库打开的回调 |
successBlock | Block | - | 连接建立成功的回调 |
errorBlock | Block | - | 连接建立失败的回调 |
timeLimit 说明:
参数 | 取值范围 | 说明 |
---|---|---|
timeLimit | <=0 | SDK 会一直连接,直到连接成功或者出现 SDK 无法处理的错误(如 token 非法),等效于上面的连接接口。 |
timeLimit | >0 | SDK 最多连接 timeLimit 秒,超时则返回 RC_CONNECT_TIMEOUT 错误,并不再重连。 |
回调参数:
dbOpenedBlock 说明:
回调参数 | 回调类型 | 说明 |
---|---|---|
code | RCDBErrorCode | 数据库是否已打开 |
successBlock 说明:
回调参数 | 回调类型 | 说明 |
---|---|---|
userId | NSString | 当前连接成功的用户 ID |
errorBlock 说明:
回调参数 | 回调类型 | 说明 |
---|---|---|
status | RCConnectErrorCode (opens new window) | 连接失败的错误码 |
代码示例:
[[RCIMClient sharedRCIMClient] connectWithToken:@"开发者的 server 通过请求 server api 获取到的 token 值" timeLimit:5 dbOpened:^(RCDBErrorCode code) { //消息数据库打开,可以进入到主页面 } success:^(NSString *userId) { //连接成功 } error:^(RCConnectErrorCode status) { if (status == RC_CONN_TOKEN_INCORRECT) { //从 APP 服务获取新 token,并重连 } else if(status == RC_CONNECT_TIMEOUT) { //连接超时,弹出提示,可以引导用户等待网络正常的时候再次点击进行连接 } else { //无法连接 IM 服务器,请根据相应的错误码作出对应处理 } }]
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
特殊说明:
当回调 errorBlock 时 SDK 不会再进行重连,不可重连的错误见文末 可重连的错误(如 31006 等),SDK 内部会进行重连,不回调 errorBlock;等遇到无法重连的错误,才会回调 errorBlock
已复制
1
2
3
2
3
常见的不可重连错误码 RC_CONN_TOKEN_INCORRECT
token 非法的说明
原因 | 排查方案 |
---|---|
token 错误 | 检查客户端初始化使用的 AppKey 和您服务器获取 Token 使用的 AppKey 是否一致 |
token 过期 | 检查开发者是否在 开发者后台 (opens new window) 设置了 Token 过期时间,过期之后需要请求您的服务器重新获取 Token 并再次用新的 Token 建立连接 |
- 在
31004
的情况下,您需要请求您的服务器重新获取 Token 并建立连接,但是注意避免无限循环,以免影响 App 用户体验。 - 此方法的回调并非为原调用线程,需要进行 UI 操作,请注意切换到主线程。
- 如果开发者是含 UI 集成,请使用 RCIM 中的同名方法建立与融云服务器的连接,而不要使用此方法。
# 设置连接监听
代码示例
//其中 self 最好为单例类(如 AppDelegate),以此保证在整个 APP 生命周期,该类都能够检测到 SDK 连接状态的变更 [[RCIMClient sharedRCIMClient] setConnectionStatusDelegate:self]; - (void)onRCIMConnectionStatusChanged:(RCConnectionStatus)status { if (status == ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT) { //当前用户账号在其他端登录,请提示用户并做出对应处理 } else if (status == ConnectionStatus_DISCONN_EXCEPTION) { //用户被封禁,请提示用户并做出对应处理 } }
已复制
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
接口调用建议
用户初次登录
:建议调用带 timeLimit 的接口,并为其设置有效值,保证初次登录如遇到异常情况(如网络较差等)SDK 可以及时回调连接超时,由 APP 自行处理重连
用户后续免密登录
:后续登录说明 token 已经是合法可用的,那么 APP 直接调用没有 timeLimit 的接口,IM 的连接完全由 IM SDK 接口,APP 不需要额外处理
无法连接的错误码及其描述 |
31004:Token 无效。 处理方案:从 APP 服务器获取新的 token ,再调用 connect 接口进行连接。 31010:用户连接成功后被踢下线。 处理法案:退回到登录页面,给用户提示被踢掉线。 31023:用户连接过程中又在其它设备上登录,导致当前设备被踢。 处理方案:退回到登录页面,给用户提示其他设备登录了当前账号。 31011:用户被封禁。 处理方案:退回到登录页面,给用户提示被封禁。 34006:自动重连超时(发生在 timeLimit 为有效值并且网络极差的情况下)。 处理方案:重新调用 connect 接口进行连接。 31008:Appkey 被封禁。 处理方案:请检查您使用的 AppKey 是否被封禁或已删除。 33001:SDK 没有初始化。 处理方案:在使用 SDK 任何功能之前,必须先 Init。 33003:开发者接口调用时传入的参数错误。 处理方案:请检查接口调用时传入的参数类型和值。 33002:数据库错误。 处理方案:检查用户 userId 是否包含特殊字符,SDK userId 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 64 字节。
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26