登录/登出聊天室
更新时间: 2023/09/01 10:22:52
用户在聊天室收发消息前需要先调用 SDK 的聊天室登录接口进入聊天室。登录成功后,用户才能正常在聊天室收发消息并使用其他聊天室相关功能。
本文介绍实现聊天室登录的流程以及相关常见问题。
前提条件
实现登录聊天室前,请确保已:
- 已开通聊天室功能。
- 已完成初始化。
- 已创建聊天室,目前只能通过服务端 API 创建聊天室。
- 在云信控制台配置应用的聊天室登录策略。如未配置相应的登录策略,可能导致后续调用登录接口时因无登录权限而报错。
登录聊天室
步骤1:准备 Token
登录聊天室需要通过token
进行鉴权。云信提供静态和动态这两种 token
类型,您可根据业务需求进行选择。
-
静态
token
:默认为永久有效。如有需要,可通过云信服务端 API 主动刷新 Token。 -
动态
token
:具备时效性,可在生成时设置token
的有效期。
获取静态Token
-
方式1:在控制台获取静态 Token
如果您只需要进行简单的体验或者快速测试,那么可以在云信控制台创建测试用的 IM 账号,并获取与该 IM 账号相应的静态
token
。具体参见注册调试用的 IM 账号。获取的静态token可用于下文提及的静态 Token 登录的鉴权。 -
方式2:调用服务端 API 获取静态 Token
如果您有正式的生产环境,且您的业务仅需保障基础的用户信息安全,那么需要通过云信 IM 服务端 API 注册 IM 账号,并获取与之相对应的静态
token
。具体参见注册云信 IM 账号。获取的静态token
可用于静态 Token 登录的鉴权。
获取动态Token
如果您有正式的生产环境,且您的业务对用户信息安全有较高的要求,可使用动态token
进行鉴权。
-
注册云信 IM 账号,获取 IM 账号(
accid
)和静态token
。 -
基于App Key、App Secret 和
accid
,通过约定算法在应用服务端生成动态token
。 -
客户端可通过在初始化时实现
dynamicChatRoomTokenForAccount:room:appKey:
方法,从回调中获取聊天室动态token
。
获取动态LoginExt
NIM SDK 也支持获取动态的登录自定义扩展字段 loginExt
。动态 loginExt
适用于所有登录模式,其中,在第三方回调登录模式中使用动态 loginExt
时,第三方服务器可以使用该字段来进行鉴权。
客户端可通过在初始化时实现 dynamicChatRoomLoginExtForAccount:
方法,从回调中获取聊天室动态 loginExt
。
动态获取 Token 和 LoginExt 示例代码
实现方法:
@interface NTESSDKConfigDelegateImpl : NSObject<NIMSDKConfigDelegate>
@end
@implementation NTESSDKConfigDelegateImpl
- (nullable NSString *)dynamicChatRoomTokenForAccount:(NSString *)account room:(NSString *)roomId appKey:(NSString *)appKey
{
// Your Code
}
- (nullable NSString *)dynamicChatRoomLoginExtForAccount:(NSString *)account room:(NSString *)roomId appKey:(NSString *)appKey
{
// Your Code
}
@end
注册 delegate:
// In your XXXAppDelegate.m
// construct & config
[[NIMSDKConfig sharedConfig] setDelegate:[[NTESSDKConfigDelegateImpl alloc] init]];
步骤2:注册相关监听
调用初始化接口前,需要先监听聊天室连接状态变化和自动登录失败事件。
监听聊天室连接状态
注册chatroom:connectionStateChanged:
回调,监听登录状态(NIMChatroomConnectionState
)。该回调主要用于客户端 UI 刷新。
点击查看 NIMChatroomConnectionState 枚举列表
NIMChatroomConnectionState 枚举列表枚举值 | 对应值 | 说明 |
---|---|---|
NIMChatroomConnectionStateEntering |
0 | 正在登录聊天室 |
NIMChatroomConnectionStateEnterOK |
1 | 登录聊天室成功 |
NIMChatroomConnectionStateEnterFailed |
2 | 登录聊天室失败 |
NIMChatroomConnectionStateLoseConnection |
3 | 和聊天室断开 |
示例代码如下:
@interface NTESLiveViewController ()<NIMChatroomManagerDelegate>
@end
@implementation NTESLiveViewController
- (void)viewDidLoad {
[[NIMSDK sharedSDK].chatroomManager addDelegate:self];
}
- (void)dealloc{
[[NIMSDK sharedSDK].chatroomManager removeDelegate:self];
}
- (void)chatroom:(NSString *)roomId connectionStateChanged:(NIMChatroomConnectionState)state
{
// Your Code
}
@end
监听自动重连失败事件
当成功登录聊天室后,若因为网络状态差或其他问题导致网络超时时,SDK 会持续有策略地进行自动重连,此时上层应用无需处理。
注册chatroom:autoLoginFailed:
回调,监听自动重连失败事件。在重连时,如果遇到一些特殊网络错误(如聊天室用户被封禁,聊天室状态异常),会触发此回调,开发者可以在此回调中退出聊天室界面。
示例代码如下:
@interface NTESLiveViewController ()<NIMChatroomManagerDelegate>
@end
@implementation NTESLiveViewController
- (void)viewDidLoad {
[[NIMSDK sharedSDK].chatroomManager addDelegate:self];
}
- (void)dealloc{
[[NIMSDK sharedSDK].chatroomManager removeDelegate:self];
}
- (void)chatroom:(NSString *)roomId autoLoginFailed:(NSError *)error
{
// Your Code
}
@end
步骤3:登录
NIM SDK 聊天室只能手动调用登录接口(enterChatroom:completion:
)登录聊天室,对应用户手动输入登录账号密码的场景。
支持同时进入 10 个聊天室。
登录方式概览
聊天室登录方式分为两大类,以独立模式登录聊天室和非独立模式登录聊天室。两种模式下又分别支持静态 token 鉴权、动态 token 鉴权和通过第三方回调鉴权。
-
非独立模式:先完成 IM 登录,再登录聊天室的方式,针对需要 IM 和聊天室功能的业务场景。
-
独立模式:在 IM 处于未登录的情况下,登录聊天室的方式,针对只需要聊天室功能的业务场景。
独立模式下可通过
NIMChatroomIndependentMode - username
字段选择是否匿名登录聊天室。匿名登录聊天室的用户,只能接收消息,不能发送消息。
模式1:非独立模式
静态 Token 登录
-
成功登录 IM。
采用非独立模式&静态登录方式鉴权时,需要确保调用
login:token:authType:loginExt:completion:
方法登录 IM 时传入了静态 token。非独立模式静态登录聊天室时使用已传入的静态token
。 -
初始化
NIMChatroomEnterRequest
,并完成赋值。NIMChatroomEnterRequest
部分参数说明如下:参数 类型 是否必传 说明 roomId
NSString 是 聊天室 ID mode
NIMChatroomIndependentMode
否 聊天室登录模式,非独立模式下该参数无需设置 loginAuthType
NIMChatroomLoginAuthType
否 聊天室鉴权方式,采用静态 Token 鉴权方式时传入 NIMChatroomLoginAuthTypeDefault loginExt
NSString 否 聊天室登录自定义扩展字段,若在初始化时实现了 dynamicChatRoomLoginExtForAccount:
方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值 -
调用
enterChatroom:completion:
方法登录聊天室。示例代码如下:
NIMChatroomEnterRequest *request = [[NIMChatroomEnterRequest alloc] init]; request.roomId = roomId;//要进入的聊天室ID request.roomNickname = @"MyChatroomNickName";// 我的聊天室昵称 request.roomAvatar = url;// 头像的链接 request.retryCount = 3;//重试次数 request.roomExt = @"{\"key\": \"value\"}"; [[[NIMSDK sharedSDK] chatroomManager] enterChatroom:request completion:^(NSError *error,NIMChatroom *chatroom,NIMChatroomMember *me) { // Your Code }];
动态 Token 登录
NIM SDK 支持聊天室动态token
登录这一登录方式。该登录方式的token
具备时效性,可有效提升token
破解难度,降低密码泄露风险。
-
初始化时,实现
NIMSDKConfigDelegate
中的dynamicChatRoomTokenForAccount:room:appKey:
方法获取聊天室动态 token。实现方式:
@interface NTESSDKConfigDelegate0() <NIMSDKConfigDelegate> @end @implementation NTESSDKConfigDelegate0 - (nullable NSString *)dynamicChatRoomTokenForAccount:(NSString *)account room:(NSString *)roomId appKey:(NSString *)appKey { // Your Code } @end
注册delegate:
NTESSDKConfigDelegate0 *delegate = [[NTESSDKConfigDelegate0 alloc] init]; [[NIMSDKConfig sharedConfig] setDelegate:delegate];
-
成功登录 IM。
-
初始化
NIMChatroomEnterRequest
,并完成赋值。NIMChatroomEnterRequest
部分参数说明如下:参数 类型 是否必传 说明 roomId
NSString 是 聊天室 ID mode
NIMChatroomIndependentMode
否 聊天室登录模式,非独立模式下该参数无需设置 loginAuthType
NIMChatroomLoginAuthType
是 聊天室鉴权方式,采用动态 Token 鉴权方式时传入 NIMChatroomLoginAuthTypeDynamicToken loginExt
NSString 否 聊天室登录自定义扩展字段,若在初始化时实现了 dynamicChatRoomLoginExtForAccount:
方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值为兼容历史接口,聊天室动态 Token 取值的优先级如下:
- 若在初始化时实现
dynamicChatRoomTokenForAccount:room:appKey:
方法并且回调中返回了非空的 token 值,则优先取该返回值; - 若未实现
dynamicChatRoomTokenForAccount:room:appKey:
方法或者实现了但是回调中返回空值,则取dynamicTokenHandler
中返回的动态 token。
- 若在初始化时实现
-
调用
enterChatroom:completion:
方法登录聊天室。示例代码:
NIMChatroomEnterRequest *request = [[NIMChatroomEnterRequest alloc] init]; request.roomId = "your roomId"; request.roomNickname = @"your roomNickname"; request.roomAvatar = @"your roomAvatar"; request.retryCount = 3; request.loginAuthType = NIMChatroomLoginAuthTypeDynamicToken; request.roomExt = @"ext"; [[[NIMSDK sharedSDK] chatroomManager] enterChatroom:request completion:^(NSError *error,NIMChatroom *chatroom,NIMChatroomMember *me) { // Your Code }];
第三方回调登录
如采用第三方鉴权登录方式,云信服务端不做聊天室登录鉴权,鉴权工作需由指定的第三方服务器(可以是应用服务器)进行。
第三方服务器可通过回调获取的动态 token 和动态 loginExt 来实现鉴权登录聊天室。
-
前往云信控制台,开通和配置第三方服务。
-
在初始化时实现
NIMSDKConfigDelegate
中的dynamicChatRoomTokenForAccount:room:appKey:
和dynamicChatRoomLoginExtForAccount:room:appKey:
方法,SDK 会在登录过程时动态通过 Delegate 方法获取第三方回调的动态 Token 和动态扩展字段(loginExt)。示例代码如下:
@interface NTESSDKConfigDelegateImpl : NSObject<NIMSDKConfigDelegate> @end @implementation NTESSDKConfigDelegateImpl - (nullable NSString *)dynamicChatRoomTokenForAccount:(NSString *)account room:(NSString *)roomId appKey:(NSString *)appKey { // Your Code } - (nullable NSString *)dynamicChatRoomLoginExtForAccount:(NSString *)account room:(NSString *)roomId appKey:(NSString *)appKey { // Your Code } @end
注册 delegate:
// In your XXXAppDelegate.m // construct & config [[NIMSDKConfig sharedConfig] setDelegate:[[NTESSDKConfigDelegateImpl alloc] init]];
-
成功登录 IM。
-
初始化
NIMChatroomEnterRequest
,并完成赋值。NIMChatroomEnterRequest
部分参数说明如下:参数 类型 是否必传 说明 roomId
NSString 是 聊天室 ID mode
NIMChatroomIndependentMode
否 聊天室登录模式,非独立模式下该参数无需设置 loginAuthType
NIMChatroomLoginAuthType
是 聊天室鉴权方式,采用第三方回调鉴权方式时传入 NIMChatroomLoginAuthTypeThirdPart loginExt
NSString 否 聊天室登录自定义扩展字段,第三方服务器可以使用该字段来鉴权。若在初始化时实现了 dynamicChatRoomLoginExtForAccount:
方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值 -
调用
enterChatroom:completion:
方法登录聊天室。示例代码:
NIMChatroomEnterRequest *request = [[NIMChatroomEnterRequest alloc] init]; request.roomId = "your roomId"; request.roomNickname = @"your roomNickname"; request.roomAvatar = @"your roomAvatar"; request.retryCount = 3; request.loginAuthType = NIMChatroomLoginAuthTypeThirdPart; request.roomExt = @"ext"; [[[NIMSDK sharedSDK] chatroomManager] enterChatroom:request completion:^(NSError *error,NIMChatroom *chatroom,NIMChatroomMember *me) { // Your Code }];
-
发起聊天室登录回调的请求,由第三方服务器进行鉴权并判定聊天室登录事件是否放行通过。
若不通过,云信服务端将返回 302 错误码。
模式2:独立模式
在 IM 处于未登录的情况下,登录聊天室的方式,针对只需要聊天室功能的业务场景。
独立模式由于不依赖 IM 连接,SDK 无法自动获取聊天室服务器的地址,需要客户端向开发者应用服务器请求该地址,而应用服务器需要向网易云信服务器请求,然后将请求结果原路返回给客户端。因此 SDK 需要提前注册获取聊天室地址的回调方法(registerRequestChatroomAddressesHandler
)。
独立模式下可通过鉴权方式分为静态 token 登录方式、动态 token 登录方式以及第三方回调登录方式。
- 当选择以独立模式登录聊天室时,必须设置
NIMChatroomIndependentMode
的各项属性。 - 可以通过
NIMChatroomIndependentMode - username
字段选择是否匿名登录聊天室。- 匿名登录聊天室的用户,只能接收消息,不能发送消息。
- 匿名登录时必须设置匿名用户在聊天室中的昵称和头像。
静态 Token 登录
-
设置
NIMChatroomIndependentMode
的各项属性,并注册获取聊天室地址的回调方法(registerRequestChatroomAddressesHandler
)。NIMChatroomIndependentMode
参数说明:参数类型说明 username NSString 用户名称,若设置为 nil,则使用匿名账号登录聊天室(匿名模式下必须设置用户昵称( roomNickname
)和头像信息(roomAvatar
)anonName NSString 匿名账号的名称,只有 username
为 nil 时,该字段才有效。若将anonName
设置为 nil,SDK 将自动生成该匿名账号的名称token NSString 静态 token,静态 Token 鉴权方式下必填。当 username
为 null 时,token 无效chatroomAppKey NSString 聊天室 AppKey,如果不填则使用云信 IM AppKey -
初始化
NIMChatroomEnterRequest
,并完成赋值。NIMChatroomEnterRequest
部分参数说明如下:参数 类型 是否必传 说明 roomId
NSString 是 聊天室 ID loginAuthType
NIMChatroomLoginAuthType
否 聊天室鉴权方式,采用静态 Token 鉴权方式时传入 NIMChatroomLoginAuthTypeDefault mode
NIMChatroomIndependentMode
是 聊天室登录模式,独立模式下该参数必须设置,具体请参考步骤 1 loginExt
NSString 否 聊天室登录自定义扩展字段,若在初始化时实现了 dynamicChatRoomLoginExtForAccount:
方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值roomNickname
NSString 否 聊天室中的用户昵称,匿名模式下( username
设置为 nil)该字段必填roomAvatar
NSString 否 聊天室中用户头像,匿名模式下( username
设置为 nil)该字段必填 -
调用
enterChatroom:completion:
方法登录聊天室。示例代码:
NIMChatroomIndependentMode *mode = [[NIMChatroomIndependentMode alloc] init]; mode.username = @"username"; mode.anonName = @"anonName"; mode.token = [password toMD5String]; // set password. mode.chatroomAppKey = @"your chatroom app key"; [NIMChatroomIndependentMode registerRequestChatroomAddressesHandler:^(NSString * _Nonnull roomId, NIMRequestChatroomAddressesCallback _Nonnull callback) { [YourHTTPService request:roomId completion:^(NSError *error,NSArray *addresses) { //无论请求是否成功,都需要进行回调 if(callback) { callback(error,addresses); } }]; }]; NIMChatroomEnterRequest *request = [[NIMChatroomEnterRequest alloc] init]; request.roomId = "your roomId"; request.mode = mode; request.roomNickname = @"your roomNickname"; request.roomAvatar = @"your roomAvatar"; request.retryCount = 3; request.loginAuthType = NIMChatroomLoginAuthTypeDefault; request.roomExt = @"ext"; [[[NIMSDK sharedSDK] chatroomManager] enterChatroom:request completion:^(NSError *error,NIMChatroom *chatroom,NIMChatroomMember *me) { // Your Code }];
动态 Token 登录
NIM SDK 支持聊天室动态 token
登录这一登录方式。该登录方式的 token
具备时效性,可有效提升 token
破解难度,降低密码泄露风险。
-
初始化时,实现
NIMSDKConfigDelegate
中的dynamicChatRoomTokenForAccount:room:appKey:
获取聊天室动态 token。示例代码如下:实现方式:
@interface NTESSDKConfigDelegate0() <NIMSDKConfigDelegate> @end @implementation NTESSDKConfigDelegate0 - (nullable NSString *)dynamicChatRoomTokenForAccount:(NSString *)account room:(NSString *)roomId appKey:(NSString *)appKey { // Your Code } @end
注册delegate:
NTESSDKConfigDelegate0 *delegate = [[NTESSDKConfigDelegate0 alloc] init]; [[NIMSDKConfig sharedConfig] setDelegate:delegate];
-
设置
NIMChatroomIndependentMode
的各项属性,并注册获取聊天室地址的回调方法(registerRequestChatroomAddressesHandler
)。NIMChatroomIndependentMode
参数说明如下:参数类型说明 username NSString 用户名称,若设置为 nil,则使用匿名账号登录聊天室(匿名模式下必须设置用户昵称( roomNickname
)和头像信息(roomAvatar
)anonName NSString 匿名账号的名称,只有 username
为 nil 时,改字段才有效。若将anonName
设置为 nil,SDK 将自动生成该匿名账号的名称token NSString 静态 token。动态 Token 鉴权方式下该字段可不填 chatroomAppKey NSString 聊天室 AppKey,如果不填则使用云信 IM AppKey -
初始化
NIMChatroomEnterRequest
,并完成赋值。NIMChatroomEnterRequest
部分参数说明如下:参数 类型 是否必传 说明 roomId
NSString 是 聊天室 ID loginAuthType
NIMChatroomLoginAuthType
是 聊天室鉴权方式,采用动态 Token 鉴权方式时传入 NIMChatroomLoginAuthTypeDynamicToken mode
NIMChatroomIndependentMode
是 聊天室登录模式,独立模式下该参数必须设置,具体请参考步骤 2 loginExt
NSString 否 聊天室登录自定义扩展字段,若在初始化时实现了 dynamicChatRoomLoginExtForAccount:
方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值roomNickname
NSString 否 聊天室中的用户昵称,匿名模式下( username
设置为 nil)该字段必填roomAvatar
NSString 否 聊天室中用户头像,匿名模式下( username
设置为 nil)该字段必填 -
调用
enterChatroom:completion:
方法登录聊天室。示例代码如下:
NIMChatroomIndependentMode *mode = [[NIMChatroomIndependentMode alloc] init]; mode.username = @"username"; mode.anonName = @"anonName"; mode.chatroomAppKey = @"your chatroom app key"; [NIMChatroomIndependentMode registerRequestChatroomAddressesHandler:^(NSString * _Nonnull roomId, NIMRequestChatroomAddressesCallback _Nonnull callback) { [YourHTTPService request:roomId completion:^(NSError *error,NSArray *addresses) { //无论请求是否成功,都需要进行回调 if(callback) { callback(error,addresses); } }]; }]; NIMChatroomEnterRequest *request = [[NIMChatroomEnterRequest alloc] init]; request.roomId = "your roomId"; request.mode = mode; request.roomNickname = @"your roomNickname"; request.roomAvatar = @"your roomAvatar"; request.retryCount = 3; request.loginAuthType = NIMChatroomLoginAuthTypeDynamicToken; request.roomExt = @"ext"; [[[NIMSDK sharedSDK] chatroomManager] enterChatroom:request completion:^(NSError *error,NIMChatroom *chatroom,NIMChatroomMember *me) { // Your Code }];
第三方回调登录
如采用第三方鉴权登录方式,云信服务端不做聊天室登录鉴权,鉴权工作需由指定的第三方服务器(可以是应用服务器)进行。
第三方服务器可通过回调获取的动态 token 和动态 loginExt 来实现鉴权登录聊天室。
-
前往云信控制台,开通和配置第三方服务。
-
在初始化时实现
NIMSDKConfigDelegate
中的dynamicChatRoomTokenForAccount:room:appKey:
和dynamicChatRoomLoginExtForAccount:
方法,SDK 会在登录过程时动态通过 Delegate 方法获取第三方回调的动态 Token 和动态扩展字段(loginExt)。示例代码如下:
@interface NTESSDKConfigDelegateImpl : NSObject<NIMSDKConfigDelegate> @end @implementation NTESSDKConfigDelegateImpl - (nullable NSString *)dynamicChatRoomTokenForAccount:(NSString *)account room:(NSString *)roomId appKey:(NSString *)appKey { // Your Code } - (nullable NSString *)dynamicChatRoomLoginExtForAccount:(NSString *)account room:(NSString *)roomId appKey:(NSString *)appKey { // Your Code } @end
注册 delegate:
// In your XXXAppDelegate.m // construct & config [[NIMSDKConfig sharedConfig] setDelegate:[[NTESSDKConfigDelegateImpl alloc] init]];
-
设置
NIMChatroomIndependentMode
的各项属性,并注册获取聊天室地址的回调方法(registerRequestChatroomAddressesHandler
)。NIMChatroomIndependentMode
参数说明:参数类型说明 username NSString 用户名称,若设置为 nil,则使用匿名账号登录聊天室(匿名模式下必须设置用户昵称( roomNickname
)和头像信息(roomAvatar
)anonName NSString 匿名账号的名称,只有 username
为 nil 时,改字段才有效。若将anonName
设置为 nil,SDK 将自动生成该匿名账号的名称token NSString 静态 token,第三方回调鉴权方式下该字段可不填 chatroomAppKey NSString 聊天室 AppKey,如果不填则使用云信 IM AppKey -
初始化
NIMChatroomEnterRequest
,并完成赋值。NIMChatroomEnterRequest
部分参数说明如下:参数 类型 是否必传 说明 roomId
NSString 是 聊天室 ID loginAuthType
NIMChatroomLoginAuthType
是 聊天室鉴权方式,采用第三方回调鉴权方式时传入 NIMChatroomLoginAuthTypeThirdPart mode
NIMChatroomIndependentMode
是 聊天室登录模式,独立模式下该参数必须设置,具体请参考步骤 3 loginExt
NSString 否 聊天室登录自定义扩展字段,第三方服务器可以使用该字段来鉴权。若在初始化时实现了 dynamicChatRoomLoginExtForAccount:
方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值roomNickname
NSString 否 聊天室中的用户昵称,匿名模式下( username
设置为 nil)该字段必填roomAvatar
NSString 否 聊天室中用户头像,匿名模式下( username
设置为 nil)该字段必填 -
调用
enterChatroom:completion:
方法登录聊天室。示例代码如下:
NIMChatroomIndependentMode *mode = [[NIMChatroomIndependentMode alloc] init]; mode.username = @"username"; mode.anonName = @"anonName"; mode.chatroomAppKey = @"your chatroom app key"; [NIMChatroomIndependentMode registerRequestChatroomAddressesHandler:^(NSString * _Nonnull roomId, NIMRequestChatroomAddressesCallback _Nonnull callback) { [YourHTTPService request:roomId completion:^(NSError *error,NSArray *addresses) { //无论请求是否成功,都需要进行回调 if(callback) { callback(error,addresses); } }]; }]; NIMChatroomEnterRequest *request = [[NIMChatroomEnterRequest alloc] init]; request.roomId = "your roomId"; request.mode = mode; request.roomNickname = @"your roomNickname"; request.roomAvatar = @"your roomAvatar"; request.retryCount = 3; request.loginAuthType = NIMChatroomLoginAuthTypeThirdPart; request.roomExt = @"ext"; [[[NIMSDK sharedSDK] chatroomManager] enterChatroom:request completion:^(NSError *error,NIMChatroom *chatroom,NIMChatroomMember *me) { // Your Code }];
登出聊天室
注销聊天室登录(即退出聊天室)后,会断开聊天室对应的连接,不再接收关于此聊天室的任何消息。如果应用退出时聊天室仍处于登录状态,请手动调用 exitChatroom:completion:
接口退出聊天室。
示例代码如下:
/// 设置离开的聊天室 roomId
NSString *roomId = @"3021";
/// 进入聊天室完成的回调
NIMChatroomHandler block = ^(NSError * __nullable error)
{
if (error == nil){
/// 离开聊天室 成功
NSLog(@"[Exit chatroom: %@ succeeded.]", roomId);
}else{
/// 离开聊天室 失败
NSLog(@"[NSError with: %@] ", error);
}
};
/// 执行离开聊天室
[[[NIMSDK sharedSDK] chatroomManager] exitChatroom:roomId
completion:block];
相关信息
断网重连
SDK 提供了自动重连机制(自动重新建立与网易云信服务器的连接并重新登录)。
当成功登录聊天室后,若因为网络状态差或其他问题导致网络超时时,SDK 会持续有策略地进行自动重连,此时不需要上层开发者去做额外的重登逻辑。
注册 chatroom:autoLoginFailed:
回调,监听自动重连失败事件。监听后,若重连时遇到一些特殊网络错误(如聊天室用户被封禁,聊天室状态异常),会触发回调,可以在回调中退出聊天室界面。
重试次数超过预定上限时,SDK 不会继续重连。重试次数(retryCount
)在 NIMChatroomEnterRequest
中定义,默认重连 3 次,需在登录聊天室时配置。
多端登录与互踢
当前 NIM SDK 支持配置两种不同的聊天室多端登录与互踢策略,具体参见多端登录与互踢。
相关辅助方法
方法 | 说明 |
---|---|
chatroomAuthMode |
登录聊天室后,通过该方法获取登录该聊天室时所使用的鉴权模式 |
NIMChatroomHandler |
聊天室网络请求回调 |
NIMChatroomEnterHandler |
登录聊天室请求回调 |
NIMProvideChatroomDynamicTokenHandler |
聊天室动态 token 回调 |
NIMChatroomEnterRequest 详细说明
单击查看 NIMChatroomEnterRequest 的参数说明
参数 | 类型 | 说明 |
---|---|---|
roomId |
NSString | 聊天室 ID |
roomNickname |
NSString | 聊天室中的用户昵称,匿名模式下(username 设置为 nil)该字段必填 |
roomAvatar |
NSString | 聊天室中用户头像,匿名模式下(username 设置为 nil)该字段必填 |
roomExt |
NSString | 用户在聊天室中的自定义扩展信息,如权限、头衔等 当本用户在聊天室发消息或者进行聊天室操作触发聊天室通知时,该字段会写入消息体的 messageExt 中(messageExt 需要转换成 NIMMessageChatroomExtension ,对应其中的 roomExt ) |
roomNotifyExt |
NSString | 通知事件扩展字段,其他聊天室在线成员会收到该用户进入聊天室的通知消息,该扩展信息会写入聊天室通知消息(NIMChatroomNotificationContent )的notifyExt 中 |
tags |
NSString | 聊天室登录标签,可以设置多个标签 |
notifyTargetTags |
NSString | 登录登出通知的目标标签,是一个标签表达式 |
retryCount |
NSString | 自动重连次数,默认为 3 次 |
mode |
NIMChatroomIndependentMode |
聊天室登录模式,该字段用于区分独立模式和非独立模式,还可通过 username 设置是否匿名登录 |
loginAuthType |
NIMChatroomLoginAuthType |
聊天室鉴权方式,分为静态 Token、动态 token 和第三方回调 |
loginExt |
NSString | 聊天室登录自定义扩展字段,若在初始化时实现了 dynamicChatRoomLoginExtForAccount: 方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值 |
dynamicTokenHandler |
NIMProvideChatroomDynamicTokenHandler |
动态获取聊天室 Token,该方法为历史接口,优先使用新的获取接口(dynamicChatRoomTokenForAccount:room:appKey: ) |
locationX |
NSDecimalNumber | 本用户所在的地理位置空间坐标 X |
locationY |
NSDecimalNumber | 本用户所在的地理位置坐标 Y |
locationZ |
NSDecimalNumber | 本用户所在的地理位置坐标 Z |
distance |
NSDecimalNumber | 与本用户所在的地理位置的最大距离 |
antispamBusinessId |
NSString | 反垃圾的业务 ID,若不填则使用原来的反垃圾配置 |
常见问题
如何处理登录请求被拒绝问题?
若您开启了应用标识安全验证,需要在将列表中写入允许的客户端应用标识。当请求登录的客户端应用标识不在列表中时,登录请求将被拒绝。
在控制台首页应用管理选择应用进入应用配置页面,顶部选择标识管理页签,添加对应的客户端应用标识。
独立登录模式日活计算
- 独立模式的非匿名模式,同一个账号同一天无论进入多少个聊天室,进入多少次,都只计算一个日活。
- 独立模式的匿名模式,每进入一次聊天室,就计算一个日活。