更新时间: 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) | 连接失败的错误码 |
代码示例:
[[RCIM sharedRCIM] 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) | 连接失败的错误码 |
代码示例:
[[RCIM sharedRCIM] 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 不会再进行重连,具体的错误信息请参见文末。
RC_CONN_TOKEN_INCORRECT
的说明:
可能原因 | 排查方案 |
---|---|
token 错误 | 检查客户端初始化使用的 AppKey 和您服务器获取 Token 使用的 AppKey 是否一致。 |
token 过期 | 检查是否在 开发者后台 (opens new window) 设置了 Token 过期时间。过期之后需要请求您的服务器重新获取 Token 并再次用新的 Token 建立连接 |
在
RC_CONN_TOKEN_INCORRECT
的情况下,您需要请求您的服务器重新获取 Token 并建立连接,但是注意避免无限循环,以免影响 App 用户体验。此方法的回调线程并非为原调用线程,需要进行 UI 操作时请注意切换到主线程。
# 接口调用建议
用户初次登录
:
APP 在用户点击登录时连接融云,建议使用带 timeLimit 的接口。这样在初次登录时如果遇到网络问题,SDK 可以及时回调连接超时,由 APP 对用户进行提醒,请用户在网络正常的时候再重新登录。
用户免密登录
:
用户登录过一次之后,很多 APP 都会提供免密登录的功能。用户免密登录时,可以使用不带 timeLimit 的接口。这样即使网络异常,SDK 也会自动重连,并在重连成功之后返回成功回调。
# 设置连接监听
代码示例
//其中 self 最好为单例类(如 AppDelegate),以此保证在整个 APP 生命周期,该类都能够接收到 SDK 连接状态的变更。 [[RCIM sharedRCIM] 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
# 连接错误码
错误码 | 说明 | 处理方案 |
---|---|---|
31004 | Token 无效 | 从 APP 服务器获取新的 token ,再调用 connect 接口进行连接 |
31010 | 用户连接成功后被踢下线 | 退回到登录页面,给用户提示被踢掉线 |
31023 | 用户连接过程中又在其它设备上登录,导致当前设备被踢 | 退回到登录页面,给用户提示其他设备登录了当前账号 |
31011 | 用户被封禁 | 退回到登录页面,给用户提示被封禁 |
34006 | 自动重连超时(发生在 timeLimit 为有效值并且网络极差的情况下) | 重新调用 connect 接口进行连接 |
31008 | Appkey 被封禁 | 请检查您使用的 AppKey 是否被封禁或已删除 |
33001 | SDK 没有初始化 | 在使用 SDK 任何功能之前,必须先 Init |
33003 | 开发者接口调用时传入的参数错误 | 请检查接口调用时传入的参数类型和值 |
33002 | 数据库错误 | 检查用户 userId 是否包含特殊字符,SDK userId 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 64 字节 |