iOS

登录/登出聊天室

更新时间: 2024/03/14 17:08:39

用户在聊天室收发消息前需要先调用 SDK 的聊天室登录接口进入聊天室。登录成功后,用户才能正常在聊天室收发消息并使用其他聊天室相关功能。

本文介绍实现聊天室登录的流程以及相关常见问题。

前提条件

实现登录聊天室前,请确保已:

登录聊天室

步骤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进行鉴权。

  1. 注册云信 IM 账号,获取 IM 账号(accid)和静态token

  2. 基于App Key、App Secret 和accid,通过约定算法在应用服务端生成动态token

  3. 客户端可通过在初始化时实现 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 和聊天室断开

示例代码如下:

objc@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:回调,监听自动重连失败事件。在重连时,如果遇到一些特殊网络错误(如聊天室用户被封禁,聊天室状态异常),会触发此回调,开发者可以在此回调中退出聊天室界面。

示例代码如下:

objc@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 登录
  1. 成功登录 IM

    采用非独立模式&静态登录方式鉴权时,需要确保调用 login:token:authType:loginExt:completion: 方法登录 IM 时传入了静态 token。非独立模式静态登录聊天室时使用已传入的静态 token

  2. 初始化 NIMChatroomEnterRequest,并完成赋值。

    NIMChatroomEnterRequest 部分参数说明如下:

    参数 类型 是否必传 说明
    roomId NSString 聊天室 ID
    mode NIMChatroomIndependentMode 聊天室登录模式,非独立模式下该参数无需设置
    loginAuthType NIMChatroomLoginAuthType 聊天室鉴权方式,采用静态 Token 鉴权方式时传入 NIMChatroomLoginAuthTypeDefault
    loginExt NSString 聊天室登录自定义扩展字段,若在初始化时实现了 dynamicChatRoomLoginExtForAccount: 方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值
  3. 调用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破解难度,降低密码泄露风险。

  1. 初始化时,实现 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];
    
  2. 成功登录 IM

  3. 初始化 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。
  4. 调用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 来实现鉴权登录聊天室。

  1. 前往云信控制台,开通和配置第三方服务

  2. 在初始化时实现 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]];
    
  3. 成功登录 IM

  4. 初始化 NIMChatroomEnterRequest,并完成赋值。

    NIMChatroomEnterRequest 部分参数说明如下:

    参数 类型 是否必传 说明
    roomId NSString 聊天室 ID
    mode NIMChatroomIndependentMode 聊天室登录模式,非独立模式下该参数无需设置
    loginAuthType NIMChatroomLoginAuthType 聊天室鉴权方式,采用第三方回调鉴权方式时传入 NIMChatroomLoginAuthTypeThirdPart
    loginExt NSString 聊天室登录自定义扩展字段,第三方服务器可以使用该字段来鉴权。若在初始化时实现了 dynamicChatRoomLoginExtForAccount: 方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值
  5. 调用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
                                     }];
    
  6. 发起聊天室登录回调的请求,由第三方服务器进行鉴权并判定聊天室登录事件是否放行通过。

    若不通过,云信服务端将返回 302 错误码。

模式2:独立模式

在 IM 处于未登录的情况下,登录聊天室的方式,针对只需要聊天室功能的业务场景。

独立模式由于不依赖 IM 连接,SDK 无法自动获取聊天室服务器的地址,需要客户端向开发者应用服务器请求该地址,而应用服务器需要向网易云信服务器请求,然后将请求结果原路返回给客户端。因此 SDK 需要提前注册获取聊天室地址的回调方法(registerRequestChatroomAddressesHandler)。

独立模式下可通过鉴权方式分为静态 token 登录方式、动态 token 登录方式以及第三方回调登录方式。

  • 当选择以独立模式登录聊天室时,必须设置 NIMChatroomIndependentMode 的各项属性。
  • 可以通过 NIMChatroomIndependentMode - username 字段选择是否匿名登录聊天室。
    • 匿名登录聊天室的用户,只能接收消息,不能发送消息。
    • 匿名登录时必须设置匿名用户在聊天室中的昵称和头像。
静态 Token 登录
  1. 设置 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
  2. 初始化 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)该字段必填
  3. 调用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 破解难度,降低密码泄露风险。

  1. 初始化时,实现 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];
    
  2. 设置 NIMChatroomIndependentMode 的各项属性,并注册获取聊天室地址的回调方法(registerRequestChatroomAddressesHandler)。

    NIMChatroomIndependentMode 参数说明如下:

    参数
    类型
    说明
    username NSString 用户名称,若设置为 nil,则使用匿名账号登录聊天室(匿名模式下必须设置用户昵称(roomNickname)和头像信息(roomAvatar
    anonName NSString 匿名账号的名称,只有 username 为 nil 时,改字段才有效。若将 anonName 设置为 nil,SDK 将自动生成该匿名账号的名称
    token NSString 静态 token。动态 Token 鉴权方式下该字段可不填
    chatroomAppKey NSString 聊天室 AppKey,如果不填则使用云信 IM AppKey
  3. 初始化 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)该字段必填
  4. 调用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 来实现鉴权登录聊天室。

  1. 前往云信控制台,开通和配置第三方服务

  2. 在初始化时实现 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]];
    
  3. 设置 NIMChatroomIndependentMode 的各项属性,并注册获取聊天室地址的回调方法(registerRequestChatroomAddressesHandler)。

    NIMChatroomIndependentMode 参数说明:

    参数
    类型
    说明
    username NSString 用户名称,若设置为 nil,则使用匿名账号登录聊天室(匿名模式下必须设置用户昵称(roomNickname)和头像信息(roomAvatar
    anonName NSString 匿名账号的名称,只有 username 为 nil 时,改字段才有效。若将 anonName 设置为 nil,SDK 将自动生成该匿名账号的名称
    token NSString 静态 token,第三方回调鉴权方式下该字段可不填
    chatroomAppKey NSString 聊天室 AppKey,如果不填则使用云信 IM AppKey
  4. 初始化 NIMChatroomEnterRequest,并完成赋值。

    NIMChatroomEnterRequest 部分参数说明如下:

    参数 类型 是否必传 说明
    roomId NSString 聊天室 ID
    loginAuthType NIMChatroomLoginAuthType 聊天室鉴权方式,采用第三方回调鉴权方式时传入 NIMChatroomLoginAuthTypeThirdPart
    mode NIMChatroomIndependentMode 聊天室登录模式,独立模式下该参数必须设置,具体请参考步骤 3
    loginExt NSString 聊天室登录自定义扩展字段,第三方服务器可以使用该字段来鉴权。若在初始化时实现了 dynamicChatRoomLoginExtForAccount: 方法,并且回调该方法时返回了非空的 loginExt 值,则优先取返回值,忽略此处输入的 loginExt 值
    roomNickname NSString 聊天室中的用户昵称,匿名模式下(username 设置为 nil)该字段必填
    roomAvatar NSString 聊天室中用户头像,匿名模式下(username 设置为 nil)该字段必填
  5. 调用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,若不填则使用原来的反垃圾配置

常见问题

如何处理登录请求被拒绝问题?

若您开启了应用标识安全验证,需要在将列表中写入允许的客户端应用标识。当请求登录的客户端应用标识不在列表中时,登录请求将被拒绝。

在控制台首页应用管理选择应用进入应用配置页面,顶部选择标识管理页签,添加对应的客户端应用标识。

应用标识管理.png

独立登录模式日活计算

  • 独立模式的非匿名模式,同一个账号同一天无论进入多少个聊天室,进入多少次,都只计算一个日活。
  • 独立模式的匿名模式,每进入一次聊天室,就计算一个日活。
此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 登录聊天室
  • 步骤1:准备 Token
  • 获取静态Token
  • 获取动态Token
  • 获取动态LoginExt
  • 动态获取 Token 和 LoginExt 示例代码
  • 步骤2:注册相关监听
  • 监听聊天室连接状态
  • 监听自动重连失败事件
  • 步骤3:登录
  • 登录方式概览
  • 模式1:非独立模式
  • 静态 Token 登录
  • 动态 Token 登录
  • 第三方回调登录
  • 模式2:独立模式
  • 静态 Token 登录
  • 动态 Token 登录
  • 第三方回调登录
  • 登出聊天室
  • 相关信息
  • 断网重连
  • 多端登录与互踢
  • 相关辅助方法
  • NIMChatroomEnterRequest 详细说明
  • 常见问题
  • 如何处理登录请求被拒绝问题?
  • 独立登录模式日活计算