IM 即时通讯
iOS
开发指南

实现聊天室消息收发

更新时间: 2023/08/16 17:29:39

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

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

使用前准备

实现流程

流程概览

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

NIM SDK 提供两种方式登录聊天室:

  • 非独立模式:先登录 IM,再登录聊天室的方式,适用于同时需要 IM 和聊天室功能的业务场景。
  • 独立模式:不依赖 IM 的连接,直接登录聊天室的方式,适用于只需要聊天室功能的业务场景。
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 的最新版本,并查询本地仓库中对应的版本是否为最新版本。

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

    pod search NIMSDK_LITE   //本地仓库中查询 NIMSDK_LITE 信息
    pod repo update          //更新本地仓库
  1. 在项目根目录下的 Podfile 文件中写入以下内容。
    pod 'NIMSDK_LITE' 
  1. 执行以下命令安装 SDK。
    pod install

步骤 2:初始化 SDK

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

  1. 在项目文件中引入头文件 NIMSDK.h
#import <NIMSDK/NIMSDK.h>
  1. 调用 registerWithOption: 方法初始化 SDK。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        ...
        //推荐在程序启动的时候初始化 NIMSDK    
        NSString *appKey        = @"your app key";//云信分配的 appKey
        NIMSDKOption *option    = [NIMSDKOption optionWithAppKey:appKey];
        option.apnsCername      = @"your APNs cer name";//APNs 推送证书名
        option.pkCername        = @"your pushkit cer name";//PushKit  推送证书名
        [[NIMSDK sharedSDK] registerWithOption:option];
        ...
    }
    

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

(可选)步骤 3:登录云信 IM

若您选择非独立模式登录聊天室,那么在登录聊天室之前需要先登录 IM。若您采用独立模式,则跳过改步骤。

请使用已注册的云信账号进行登录。

调用 NIMLoginManagerlogin方法进行登录。示例代码如下:

    NSString *account = @"your account";
    NSString *token   = @"your token";
    [[[NIMSDK sharedSDK] loginManager] login:account
                                    token:token
                                completion:^(NSError *error) {}];

NIM SDK 支持自动重连机制。用户也可以注册监听来实时关注 IM 的登录状态,具体请参见登录章节。

步骤 4:登录聊天室

若您选择非独立模式登录聊天室,那么登录 IM 后,直接调用 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
                                     }];

若您选择独立模式登录聊天室。独立模式由于不依赖 IM 连接,SDK 无法自动获取聊天室服务器的地址,需要客户端向开发者应用服务器请求该地址,而应用服务器需要向网易云信服务器请求,然后将请求结果原路返回给客户端。因此 SDK 需要提前注册获取聊天室地址的回调方法(registerRequestChatroomAddressesHandler),然后再调用 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
                                 }];

步骤5: 聊天室消息收发

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

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

  1. 接收方调用 NIMChatManagerDelegateonRecvMessages: 方法监听聊天室消息接收。

    示例代码如下:

    - (void)onRecvMessages:(NSArray<NIMMessage *> *)messages
    {
    //收到消息
    }
    
  2. 发送方调用 sendMessage:toSession:error:方法在聊天室中发送一条文本消息。

    聊天室消息收发接口与 IM 的消息收发接口统一,在发送消息时指定会话类型(NIMSessionTypeChatroom)为聊天室即可。会话 id(sessionId)即为聊天室 id(roomId)。

    示例代码如下:

    // 这里主要以发送文本消息为例 
    NIMSession *session = [NIMSession session:@"roomId" type:NIMSessionTypeChatroom];// 构造出具体会话:Chatroom 聊天室,会话 id 为 roomId
    NIMMessage *message = [[NIMMessage alloc] init];// 构造出具体消息
    message.text        = @"hello";
    NSError *error = nil;// 错误反馈对象
    [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:&error];// 发送消息
    
  3. onRecvMessages: 触发回调,接收方通过该回调收到聊天室消息。

后续步骤

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

相关文档

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