实现聊天室消息收发
更新时间: 2024/08/22 17:21:31
聊天室是网易云信 IM 即时通讯服务中一种比群组更加开放、更加自由的组织形态,可帮助您实现真正意义上的大型聊天室,参与人数无上限,又可满足消息到达的实时性要求,主要应用于娱乐直播、教育直播等场景。
本文介绍如何通过较少的代码集成 NetEase IM SDK(以下简称 NIM SDK)并调用相关 API,在您的应用中实现聊天室消息收发。
使用前准备
-
已在云信控制台创建应用,获取 App Key。
-
已注册云信 IM 账号,获取云信 IM 账号和 token。
-
已调用服务端接口创建聊天室。
-
开发环境需满足 iOS 9.0 及以上版本,可使用 iPhone/iPad 真机或模拟器。
实现流程
流程概览
实现聊天室消息收发的流程,可分为下图所示的 4 大步骤。
步骤 0:新建项目(可选)
此步骤以新建新项目为例,若集成到已有项目,可忽略此步骤
1. 启动 Xcode,在左上角选择File > New > Project。2. 在出现的工作表中,选择 iOS 平台,并在 Application 下选择 App。
3. 配置新建项目,完成后,单击 Next。
必须填写 Product Name 和 Organization Identifier。
4. 选择项目存储路径,单击 Create 创建项目。
步骤 1:集成 SDK
本文主要介绍在 CocoaPods 中添加远程依赖项的集成方式。手动集成方式请参见 SDK 集成。
-
在更新日志查看 SDK 的最新版本,并查询本地仓库中对应的版本是否为最新版本。
若不是最新版本,建议先更新本地仓库,以确保可以集成最新的 SDK 版本。
pod search NIMSDK_LITE //本地仓库中查询 NIMSDK_LITE 信息 pod repo update //更新本地仓库
-
在项目根目录下的
Podfile
文件中写入以下内容。pod 'NIMSDK_LITE'
-
执行以下命令安装 SDK。
pod install
步骤 2:初始化 SDK
将 SDK 集成到客户端后,需要先完成 SDK 的初始化才能使用其他功能。
-
在项目文件中引入头文件
NIMSDK.h
。#import <NIMSDK/NIMSDK.h>
-
调用
registerWithOptionV2
方法初始化 SDK,推荐在应用程序启动时初始化。初始化成功后,即可使用 V10 所有的 API。objc
NIMSDKOption *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:登录聊天室
-
调用
newInstance
方法创建聊天室实例。调用成功后,返回聊天室实例(instanceId),聊天室实例与聊天室(roomId)形成一一绑定关系。objective-c
V2NIMChatroomClient *chatroomClient = [V2NIMChatroomClient newInstance];
-
调用
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
-
在登录聊天室之前,需要先提前获取聊天室地址。可以通过以下两种方式获取:
-
若当前客户端已登录 IM,那么可以通过
getChatroomLinkAddress
方法获取指定聊天室的地址。objective-c
NSString *roomId = @"36"; [NIMSDK.sharedSDK.v2LoginService getChatroomLinkAddress:roomId success:^(NSArray<NSString *> *links) { // get success } failure:^(V2NIMError *error) { // get failed }];
-
若当前客户端未登录 IM,那么 SDK 无法获取聊天室服务器的地址,需要客户端向开发者应用服务器请求该地址,而应用服务器需要向网易云信服务器请求,然后将请求结果原路返回给客户端。具体请参考获取聊天室地址服务端 API。
-
-
调用
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) { //进入聊天室失败 }];
-
登录聊天室成功后,调用
getChatroomService
方法获取聊天室服务。后续聊天室相关操作(聊天室成员、消息等)均在返回的V2NIMChatroomService
类中实现。objective-c
[[V2NIMChatroomClient getInstance:instanceId] getChatroomService];
步骤 4: 聊天室消息收发
NIM SDK 支持多种消息类型,包括文本消息、图片消息、语音消息、视频消息、文件消息、地理位置消息、提示消息、通知消息以及自定义消息。
本节以发送方与接收方的文本消息交互为例,介绍快速实现聊天室消息收发的流程。其他消息类型的收发,请参见聊天室消息管理。
-
接收方注册聊天室监听器,监听聊天室消息接收回调事件
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
-
发送方调用
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) { // 上传进度 }];
-
接收方通过
onReceiveMessages
回调收到聊天室消息。
后续步骤
为保障通信安全,如果您在调试环境中的使用的是云信控制台生成的测试用 IM 账号 和 token
,请确保在后续的正式生产环境中,将其替换为通过新版 IM 服务端 API生成的正式 IM 账号和 token
。