实现圈组消息收发
更新时间: 2024/04/16 15:00:45
圈组是网易云信 IM 即时通讯服务的全新能力,可用来帮助您快速构建 “类 Discord 即时通讯社群”。本文介绍如何通过较少的代码集成 NetEase IM SDK (以下简称 NIM SDK)并调用 API,在您的应用中实现圈组消息收发。
使用前准备
- 已在云信控制台创建应用,获取 App Key。
- 已注册云信 IM 账号,获取 IM 账号和 token。
- 已在云信控制台开通和配置圈组功能。
实现流程
流程概览
实现单聊消息收发的流程,可分为下图所示的 4 大步骤。
@enduml
圈组服务端与圈组服务器是两个不同概念,前者指云信服务端提供圈组功能的部分,后者为圈组的特殊概念,对应 Discord 的 Server, 为社群本身,具体参见圈组主要概念。
步骤1: 集成 NIM SDK
SDK 以 npm 包的形式提供,请前往 nim-web-sdk-ng 获取 npm 包。
- 执行以下命令安装 npm 包。
npm install nim-web-sdk-ng@">=10"
-
通过
import
或者require
引入入口模块。业务场景 需引入的模块 初始化方法 IM 浏览器 NIM_BROWSER_SDK NIM.getInstance IM UniApp NIM_UNIAPP_SDK NIM.getInstance IM 小程序 NIM_MINIAPP_SDK NIM.getInstance Chatroom 浏览器 CHATROOM_BROWSER_SDK CHATROOM.newInstance Chatroom UniApp CHATROOM_UNIAPP_SDK CHATROOM.newInstance Chatroom 小程序 CHATROOM_MINIAPP_SDK CHATROOM.newInstance
步骤 2:初始化 SDK
将 NIM SDK 集成到客户端后,需要先完成 NIM 实例的初始化才能使用其他功能。
本文主要介绍 NIM_BROWSER_SDK
的初始化。示例代码如下:
-
浏览器环境,及运行在非小程序的 uni-app 环境,使用下面方式初始化:
typescript
const nim = NIM.getInstance({ appkey: "YOUR_APPKEY", debugLevel: "debug" apiVersion: "v2" })
-
小程序环境,及运行在小程序的 uni-app 环境,使用下面方式初始化。之所以小程序需要和非小程序区分,是因为小程序需要设置域名白名单,因此需要返回固定域名的 lbs 请求地址
typescript
const nim = NIM.getInstance({ appkey: "YOUR_APPKEY", debugLevel: "debug" apiVersion: "v2" }, { V2NIMLoginServiceConfig: { "lbsUrls": [ "https://lbs.netease.im/lbs/wxwebconf.jsp" ], "linkUrl": "wlnimsc0.netease.im" } })
以上提供了一个简化的初始化示例,更多 NIM 实例的初始化说明,参见初始化 SDK。
步骤 3:登录 IM
V10 已采用融合登录方案,用户只需要调用 V2NIMLoginService#login
方法登录一次,则可以同时使用 IM 与圈组,无需再单独登录圈组服务器。
调用 V2NIMLoginService#login
后调用 QChatInterface.login
方法将会报错。
以静态 Token 登录为例,示例代码如下:
typescripttry {
await nim.V2NIMLoginService.login("ACCOUNT_ID", "TOKEN", {
"forceMode": false
})
} catch (err) {
// TODO failed, check code
// console.log(err.code)
}
其他登录方式请参见登录及登出 IM。
步骤 4:圈组消息收发
本节以发送方与接收方的消息交互为例,介绍在不考虑用户权限控制的情况下,使用 SDK API 快速实现圈组文本消息收发的流程。
-
发送方调用
createServer
方法创建圈组服务器。为更加快速实现消息收发,创建时可将InviteMode
设置为1
(发送邀请后,不需要被邀请方同意,被邀请方立即加入服务器)。示例代码如下:
typescript
const qchat = new QChat(options); qchat.qchatServer.createServer({ "name": "Jason的健身天地", // 传入服务器名称 ... })
创建成功后,需记录服务器的 ID(
serverId
),后续步骤将需要传入serverId
。 -
发送方调用
createChannel
方法,调用时传入上一步中创建的圈组服务器的serverId
,且将viewMode
和Type
分别设置为0
和message
,从而在圈组服务器中创建一个消息类型的公开频道。示例代码如下:
typescript
const qchat = new QChat(options); qchat.qchatChannel.createChannel({ "serverId": "12345", "name": "1" })
创建成功后,需记录频道的 ID(
channelId
),后续步骤将需要传入channelId
。 -
发送方调用
inviteServerMembers
方法,邀请接收方加入服务器。示例代码如下:
typescript
const qchat = new QChat(options); await qchat.qchatServer.inviteServerMembers({ "serverId": '123456', "accids":["123"] })
-
发送方调用
sendMessage
方法,调用时传入服务器与公开频道的 ID,从而在公开频道中发送一条消息。示例代码如下:
typescript
// text and @everyone message const msg = await qchat.qchatMsg.sendMessage({ "serverId": "{{YOUR_SERVERID}}", "channelId": "{{YOUR_CHANNELID}}", "type": "text", "body": "This is a test message", "mentionAll": true }) console.log(msg.msgIdServer) // text and @somebody message const msg1 = await qchat.qchatMsg.sendMessage({ "serverId": "{{YOUR_SERVERID}}", "channelId": "{{YOUR_CHANNELID}}", "type": "text", "body": "This is a test message", "mentionAccids": ["accountId1", "accountId2"] })
-
SDK 触发消息接收(
message
)事件回调,接收方通过该回调接收消息体(QChatMessage
)。
后续步骤
为保障通信安全,如果您在调试环境中的使用的是云信控制台生成的测试用 IM 账号 和 token
,请确保在后续的正式生产环境中,将其替换为通过 IM 新版服务端 API 生成的正式 IM 账号和 token
。