实现聊天室消息收发
更新时间: 2024/03/15 16:12:33
聊天室是网易云信 IM 即时通讯服务中一种比群组更加开放、更加自由的组织形态,可帮助您实现真正意义上的大型聊天室,参与人数无上限,又可满足消息到达的实时性要求,主要应用于娱乐直播、教育直播等场景。
本文介绍如何通过较少的代码集成 NetEase IM SDK(以下简称 NIM SDK)并调用相关 API,在您的应用中实现聊天室消息收发。
使用前准备
- 已在云信控制台创建应用,获取 App Key。
- 已注册云信 IM 账号,获取 accid 和 token。
- 已开通和配置聊天室功能。
- 已调用服务端接口创建聊天室。
- 开发环境满足 iOS 8.0 及以上版本。
实现流程
流程概览
实现聊天室消息收发的流程,可分为下图所示的 5 大步骤。
NIM SDK 提供两种方式登录聊天室:
- 非独立模式:先登录 IM,再登录聊天室的方式,适用于同时需要 IM 和聊天室功能的业务场景。
- 独立模式:不依赖 IM 的连接,直接登录聊天室的方式,适用于只需要聊天室功能的业务场景。
步骤 0:新建项目(可选)
此步骤以新建新项目为例,若集成到已有项目,可忽略此步骤
1. 启动 Xcode,在左上角选择File > New > Project。2. 在出现的工作表中,选择 iOS 平台,并在 Application 下选择 App。
3. 配置新建项目,完成后,单击 Next。
必须填写 Product Name 和 Organization Identifier。
4. 选择项目存储路径,单击 Create 创建项目。
步骤 1:集成 SDK
本文主要介绍在 CocoaPods 中添加远程依赖项的集成方式。手动集成方式请参见 SDK 集成。
-
在 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>
-
调用
registerWithOption:
方法初始化 SDK。objc
- (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。若您采用独立模式,则跳过改步骤。
请使用已注册的云信账号进行登录。
调用 NIMLoginManager
的login
方法进行登录。示例代码如下:
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 支持多种消息类型,包括文本消息、图片消息、语音消息、视频消息、文件消息、地理位置消息、提示消息、通知消息以及自定义消息。
本节以发送方与接收方的文本消息交互为例,介绍快速实现聊天室消息收发的流程。其他消息类型的收发,请参见消息收发。
-
接收方调用
NIMChatManagerDelegate
的onRecvMessages:
方法监听聊天室消息接收。示例代码如下:
- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages { //收到消息 }
-
发送方调用
sendMessage:toSession:error:
方法在聊天室中发送一条文本消息。聊天室消息收发接口与 IM 的消息收发接口统一,在发送消息时指定会话类型(NIMSessionTypeChatroom)为聊天室即可。会话 id(sessionId)即为聊天室 id(roomId)。
示例代码如下:
js
// 这里主要以发送文本消息为例 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];// 发送消息
-
onRecvMessages:
触发回调,接收方通过该回调收到聊天室消息。
后续步骤
为保障通信安全,如果您在调试环境中的使用的是云信控制台生成的测试用 IM 账号 和 token
,请确保在后续的正式生产环境中,将其替换为通过 IM 服务端 API 生成的正式 IM 账号(accid
)和 token
。