实现聊天室消息收发

更新时间: 2024/03/15 16:12:34

聊天室是网易云信 IM 即时通讯服务中一种比群组更加开放、更加自由的组织形态,可帮助您实现真正意义上的大型聊天室,参与人数无上限,又可满足消息到达的实时性要求,主要应用于娱乐直播、教育直播等场景。

本文介绍如何通过较少的代码集成 NetEase IM SDK(以下简称 NIM SDK)并调用相关 API,在您的应用中实现聊天室消息收发。

使用前准备

实现流程

流程概览

实现聊天室消息收发的流程,可分为下图所示的 4 大步骤。

uml diagram

步骤 0:新建项目(可选)

此步骤以新建新项目为例,若集成到已有项目,可忽略此步骤 1. 启动 Xcode,在左上角选择File > New > Project
2. 在出现的工作表中,选择 iOS 平台,并在 Application 下选择 App
3. 配置新建项目,完成后,单击 Next
必须填写 Product NameOrganization Identifier
4. 选择项目存储路径,单击 Create 创建项目。
新建项目

步骤 1:集成 SDK

本文主要介绍在 CocoaPods 中添加远程依赖项的集成方式。手动集成方式请参见 SDK 集成

  1. 更新日志查看 SDK 的最新版本,并查询本地仓库中对应的版本是否为最新版本。

    若不是最新版本,建议先更新本地仓库,以确保可以集成最新的 SDK 版本。

    pod search NIMSDK_LITE   //本地仓库中查询 NIMSDK_LITE 信息
    pod repo update          //更新本地仓库
    
  2. 在项目根目录下的 Podfile 文件中写入以下内容。

    pod 'NIMSDK_LITE' 
    
  3. 执行以下命令安装 SDK。

    pod install
    

步骤 2:初始化 SDK

将 SDK 集成到客户端后,需要先完成 SDK 的初始化才能使用其他功能。

  1. 在项目文件中引入头文件 NIMSDK.h

    #import <NIMSDK/NIMSDK.h>
    
  2. 调用 registerWithOptionV2 方法初始化 SDK,推荐在应用程序启动时初始化。初始化成功后,即可使用 V10 所有的 API。

    objcNIMSDKOption *option = [NIMSDKOption optionWithAppKey:appKey];
    option.apnsCername = @"your apns certificate";
    option.pkCername = @"your push kit certificate";
    // 配置 useV1Login
    V2NIMSDKOption *v2Option = [[V2NIMSDKOption alloc] init];
    //激活 V10 所有 API,默认使用 V10 的登录接口登录 IM
    v2Option.useV1Login = NO;
    //若仍使用 V9 的登录接口登录 IM
    //v2Option.useV1Login = YES;
    [[NIMSDK sharedSDK] registerWithOptionV2:option v2Option:v2Option];
    

以上提供了一个简化的初始化示例,更多初始化信息请参见初始化 SDK

步骤 3:登录聊天室

  1. 调用 newInstance 方法创建聊天室实例。调用成功后,返回聊天室实例(instanceId),聊天室实例与聊天室(roomId)形成一一绑定关系。

    objective-cV2NIMChatroomClient *chatroomClient = [V2NIMChatroomClient newInstance];
    
  2. 调用 addChatroomClientListener 方法注册聊天室登录相关监听器,包括聊天室连接状态变更、进出聊天室、被踢出聊天室。

    objective-c@interface ClientListener : NSObject <V2NIMChatroomClientListener>
    - (void)addToClient:(NSInteger)clientId;
    @end
    @implementation ClientListener
    - (void)addToClient:(NSInteger)clientId
    {
        V2NIMChatroomClient *instance = [V2NIMChatroomClient getInstance:clientId];
        [instance addChatroomClientListener:self];
    }
    - (void)onChatroomStatus:(V2NIMChatroomStatus)status
                    error:(nullable V2NIMError *)error
    {
    }
    - (void)onChatroomEntered
    {
    }
    - (void)onChatroomExited:(nullable V2NIMError *)error
    {
    }
    - (void)onChatroomKicked:(V2NIMChatroomKickedInfo *)kickedInfo
    {
    }
    @end
    
  3. 在登录聊天室之前,需要先提前获取聊天室地址。可以通过以下两种方式获取:

    • 若当前客户端已登录 IM,那么可以通过 getChatroomLinkAddress 方法获取指定聊天室的地址。

      objective-cNSString *roomId = @"36";
      [NIMSDK.sharedSDK.v2LoginService getChatroomLinkAddress:roomId
                                                      success:^(NSArray<NSString *> *links) {
                                                          // get success
                                                      }
                                                      failure:^(V2NIMError *error) {
                                                          // get failed
                                                      }];
      
    • 若当前客户端未登录 IM,那么 SDK 无法获取聊天室服务器的地址,需要客户端向开发者应用服务器请求该地址,而应用服务器需要向网易云信服务器请求,然后将请求结果原路返回给客户端。具体请参考获取聊天室地址服务端 API。

  4. 调用 enter 方法登录聊天室。

    objective-c// 配置 link 地址回调
    @interface ChatroomLinkProvider : NSObject <V2NIMChatroomLinkProvider>
    @end
    
    @implementation ChatroomLinkProvider
    - (nullable NSArray<NSString *> *)getLinkAddress:(NSString *)roomId accountId:(NSString *)accountId {
        return @[@"link0", @"link1"];
    }
    @end
    // 进入聊天室
    NSString *roomId = @"2024";
    
    V2NIMChatroomLoginOption *loginOption = [[V2NIMChatroomLoginOption alloc] init];
    //默认鉴权方式进入聊天室
    loginOption.authType = V2NIM_LOGIN_AUTH_TYPE_DEFAULT;
    V2NIMChatroomEnterParams *enterParams = [[V2NIMChatroomEnterParams alloc] init];
    // 账号
    enterParams.accountId = @"accountId";
    // token
    enterParams.token = @"token";
    // 动态设置link地址
    enterParams.linkProvider = [[ChatroomLinkProvider alloc] init];
    
    [[V2NIMChatroomClient newInstance] enter:roomId
                                enterParams:enterParams
                                    success:^(V2NIMChatroomEnterResult *result)
                                    {
                                        //进入聊天室成功
                                    }
                                    failure:^(V2NIMError *error)
                                    {
                                        //进入聊天室失败
                                    }];
    
  5. 登录聊天室成功后,调用 getChatroomService方法获取聊天室服务。后续聊天室相关操作(聊天室成员、消息等)均在返回的 V2NIMChatroomService 类中实现。

    objective-c[[V2NIMChatroomClient getInstance:instanceId] getChatroomService];
    

步骤 4: 聊天室消息收发

NIM SDK 支持多种消息类型,包括文本消息、图片消息、语音消息、视频消息、文件消息、地理位置消息、提示消息、通知消息以及自定义消息。

本节以发送方与接收方的文本消息交互为例,介绍快速实现聊天室消息收发的流程。其他消息类型的收发,请参见聊天室消息管理

  1. 接收方注册聊天室监听器,监听聊天室消息接收回调事件 onReceiveMessages

    示例代码如下:

    objective-c@interface Listener: NSObject<V2NIMChatroomListener>
    - (void)addToService;
    @end
    
    @implementation Listener
    
    - (void)addToService
    {
        id <V2NIMChatroomService> service = [[V2NIMChatroomClient getInstance:1] getChatroomService];
        [service addChatroomListener:self];
    }
    
    - (void)onReceiveMessages:(NSArray *)messages
    {
    
    }
    @end
    
  2. 发送方调用 createTextMessage 方法,构建一条文本消息。并调用 sendMessage 方法,发送已构建的文本消息。

    示例代码如下:

    // 通过实例 ID 获取聊天室服务
    id <V2NIMChatroomService> service = [[V2NIMChatroomClient getInstance:instanceId] getChatroomService];
    // 创建一条文本消息
    V2NIMChatroomMessage *message = [V2NIMChatroomMessageCreator createTextMessage:@"xxx"];
    V2NIMChatroomMessageConfig *messageConfig = [V2NIMChatroomMessageConfig new];
    // 根据实际情况配置
    // 设置是否需要在服务端保存历史消息,默认 true
    // messageConfig.historyEnabled = YES;
    // 设置是否是高优先级消息,默认 false
    // messageConfig.highPriority = NO;
    V2NIMMessageRouteConfig *routeConfig = [V2NIMMessageRouteConfig new];
    // 根据实际情况配置
    // routeConfig.routeEnabled
    // routeConfig.routeEnvironment
    V2NIMMessageAntispamConfig *antispamConfig = [V2NIMMessageAntispamConfig new];
    // 根据实际情况配置
    // antispamConfig.antispamBusinessId
    // antispamConfig.antispamCheating
    // antispamConfig.antispamCustomMessage
    // antispamConfig.antispamEnabled
    // antispamConfig.antispamExtension
    
    V2NIMSendChatroomMessageParams *params = [V2NIMSendChatroomMessageParams new];
    // 设置消息相关配置
    // params.messageConfig = messageConfig;
    // 设置路由抄送相关配置
    // params.routeConfig = routeConfig;
    // 设置反垃圾相关配置
    // params.antispamConfig = antispamConfig;
    // 是否开启本地反垃圾,默认false
    // params.clientAntispamEnabled = false;
    // 本地反垃圾的替换文本
    // params.clientAntispamReplace = @"xxx";
    // 设置聊天室定向消息接收者账号ID列表
    // params.receiverIds = receiverIds;
    // 设置消息的目标标签表达式
    // params.notifyTargetTags = @"xxx";
    // 设置位置信息
    // params.locationInfo = locationInfo;
    [service sendMessage:message
                params:params
                success:^(V2NIMSendChatroomMessageResult *result)
                {
                    // 发送成功
                }
                failure:^(V2NIMError *error)
                {
                    // 发送失败
                }
                progress:^(NSUInteger progress)
                {
                    // 上传进度
                }];        
    
  3. 接收方通过 onReceiveMessages 回调收到聊天室消息。

后续步骤

为保障通信安全,如果您在调试环境中的使用的是云信控制台生成的测试用 IM 账号 和 token,请确保在后续的正式生产环境中,将其替换为通过新版 IM 服务端 API生成的正式 IM 账号和 token

此文档是否对你有帮助?
有帮助
去反馈
  • 使用前准备
  • 实现流程
  • 流程概览
  • 步骤 0:新建项目(可选)
  • 步骤 1:集成 SDK
  • 步骤 2:初始化 SDK
  • 步骤 3:登录聊天室
  • 步骤 4: 聊天室消息收发
  • 后续步骤