实现单聊消息收发(不含 UI)
更新时间: 2023/03/14 11:34:00
网易云信 IM 即时通讯服务提供一整套即时通讯基础能力,助您快速实现多样化的即时通讯场景。
本文主要介绍通过集成 NetEase IM SDK(NIM SDK)并调用 API,快速实现单聊消息收发功能。
SDK 说明
NIM Web 增强版 SDK (以下简称为“增强版”)为 NIM Web SDK (以下简称为“原版”)的重构版本。增强版继承了原版的特性,提供完善的即时通讯功能开发框架和简洁的 API 接口,方便您快速将即时通讯功能集成到您的 PC/移动 Web 应用及 NodeJS、微信小程序等跨平台应用。
相较于原版,增强版做了如下改进:
- 使用 TypeScript 重构,API 出入参数定义更加完善。
- 使用 Promise API 替代回调地狱(callback hell)。
- 支持更多开发环境:现支持 IE v11.0.0 及以上版本和 chrome v4.0.0 及以上版本等浏览器,以及微信小程序、支付宝小程序和 uniapp 等跨平台开发环境。
- 结构更精简。包体积降至原版 SDK 的 40%。
使用前准备
-
登录云信控制台完成以下操作。
创建应用并获取 App Key 和 App Secret
1. 在左侧导航栏中找到“应用”,并单击“创建”。
2. 填写应用的基本信息后,单击“创建”。
3. 创建应用后,可以在左侧导航栏中查看该应用,并单击 “App Key 管理”,并获取 App Key 和 App Secret。注册云信 IM 账号,获取 accid 和 token
注册云信 IM 账号,获取 accid 和 token。accid 和 token 将用于登录云信服务端。
1. 在左侧导航栏中单击指定应用名称,进入该应用的详情页面。
2. 在“功能管理”中单击“账号管理”。
3. 在测试页面,单击“新建账号”,并填写账号(即accid)、昵称(即 name)、密码(即 Token)后,单击“确定”。
实现流程
流程概览
实现单聊消息收发的流程,可分为下图所示的 4 大步骤。
下图可能因为网络问题无法正常展示。如遇到该问题,一般刷新页面即可正常展示。
步骤 1:集成 SDK
SDK 以 npm 包的形式提供,请前往 nim-web-sdk-ng 获取 npm 包。
- 执行以下命令安装 npm 包。
npm install nim-web-sdk-ng@latest
- 引入 IM 功能模块 SDK。
开发需求 |
环境 |
引入 SDK |
---|---|---|
IM 功能 | 浏览器 | import NIMSDK from 'nim-web-sdk-ng/dist/NIM_BROWSER_SDK' |
IM 功能 | uniapp | import NIMSDK from 'nim-web-sdk-ng/dist/NIM_UNIAPP_SDK' |
IM 功能 | 微信/支付宝小程序 | import NIMSDK from 'nim-web-sdk-ng/dist/NIM_MINIAPP_SDK' |
uniapp 和各种小程序不支持 TypeScript,目前仅支持在浏览器环境中导出 TS 声明。
- (可选)通过 ESM 形式引入 SDK。
单独引入上述 SDK,代码总体积会比较大,如果开发者对体积大小有特别的需求,可以选用 ESM 形式引入。
- SDK 的版本需要 0.6.1 及以上。
- ESM 模式的 SDK,导出 IM、聊天室、圈组三个 SDK。
- 需要开发者自行注册模块和适配器。参见
node_modules
中关于esm
模块的 TS 定义来获取模块和适配器种类。 - 对于不需要的模块,建议开发者最后在工程中进行打包(tree-shaking)。
使用 ESM 形式引入的示例代码如下:
import { NIM, browserAdapters, MsgService, SessionService } from 'nim-web-sdk-ng/dist/esm'
// ESM 模式,IM 依赖的能力需要自行注册,以便于不用的模块最后能被 tree-shaking 掉。
NIM.setAdapters(browserAppAdapters)
NIM.registerService(MsgService, 'msg')
NIM.registerService(SessionService, 'session')
步骤 2:初始化 SDK
将 SDK 集成到客户端后,需要先完成 SDK 的初始化才能使用其他功能。
本文主要介绍 NIM_BROWSER_SDK
的初始化。示例代码如下:
const nim = new NIMSDK({
appkey: 'YOUR_APPKEY',
account: 'YOUR_ACCID',
token: 'YOUR_TOKEN',
debugLevel: 'debug',
});
account
即 IM 账号中的accid
,token
即 IM 账号中的token
。- NIM 的初始化参数请参见
NIMInitializeOptions
和NIMOtherOptions
。
步骤 3:登录 SDK
登录前,需要监听 msg
事件。同时,您也可以监听其他事件,具体事件类型,请参见IMEventInterface。示例代码如下:
// 事件声明
const eventList = [
'msg',//接收消息事件
]
nim.on('msg', function(msg) { console.log('Receive msg: ', msg) })
SDK 相关事件必须在 connect(登录)前声明才会生效,声明方式可以参考初始化中 eventList 中的内容。
监听完成后,登录 SDK。示例代码如下:
await nim.connect();
登录完成后,SDK 会发起同步操作,比如向服务端同步漫游消息,离线消息,好友关系等。同步的过程中会触发 syncdone
事件。您可以通过初始化的 NIMOtherOptions
中的 SyncOptions
来控制同步的内容。
步骤 4:单聊消息收发
本节以用户 A 和用户 B 的消息交互为例,介绍快速实现单聊消息收发的流程。
- 用户 A 向用户 B 发送消息。
目前 IM Web Elite SDK 支持多种消息类型,包括文本消息、图片消息、语音消息、视频消息、文件消息、地理位置消息、提示消息、通知消息以及自定义消息。具体请参见消息收发。 这里主要以发送文本消息为例,示例代码如下:
await nim.msg.sendTextMsg({
"scene": "p2p",
"to": "ACCOUNT_ID",//消息接收者账户ID
"body": "this is a text",
"onSendBefore": function(msg) {
console.log('Get msg before send', msg)
}
})
SDK 通过调用 sendTextMsg
方法实现消息发送功能。
-
监听接口根据实际情况触发接收消息事件,用户 B 收到文本消息。
-
(可选)用户登出/销毁实例。
// 断开
await nim.disconnect()
setTimeout(function() {
// 断开后仍旧可以 connect 成功
await nim.connect()
// 销毁后就无法再次 connect 建立长连接,需要再次 new 一个实例。
await nim.destroy()
}, 5000)
后续步骤
为保障通信安全,如果您在调试环境中的使用的是云信控制台生成的测试用 IM 账号 和 token
,请确保在后续的正式生产环境中,将其替换为通过 IM 服务端 API 生成的正式 IM 账号(accid
)和 token
。
常见问题
- 执行 npm 命令安装 SDK 失败,出现以下报错信息。
出现该问题是由用户侧环境导致,请按照提示执行 npm fund
和npm audit fix
即可。