实现圈组消息收发

更新时间: 2024/04/16 15:00:45

圈组是网易云信 IM 即时通讯服务的全新能力,可用来帮助您快速构建 “类 Discord 即时通讯社群”。本文介绍如何通过较少的代码集成 NetEase IM SDK (以下简称 NIM SDK)并调用 API,在您的应用中实现圈组消息收发。

使用前准备

实现流程

流程概览

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

@enduml

uml diagram

圈组服务端圈组服务器是两个不同概念,前者指云信服务端提供圈组功能的部分,后者为圈组的特殊概念,对应 Discord 的 Server, 为社群本身,具体参见圈组主要概念

步骤1: 集成 NIM SDK

SDK 以 npm 包的形式提供,请前往 nim-web-sdk-ng 获取 npm 包。

  1. 执行以下命令安装 npm 包。
npm install nim-web-sdk-ng@">=10"
  1. 通过 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 环境,使用下面方式初始化:

    typescriptconst nim = NIM.getInstance({
        appkey: "YOUR_APPKEY",
        debugLevel: "debug"
        apiVersion: "v2"
    })
    
  • 小程序环境,及运行在小程序的 uni-app 环境,使用下面方式初始化。之所以小程序需要和非小程序区分,是因为小程序需要设置域名白名单,因此需要返回固定域名的 lbs 请求地址

    typescriptconst 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 快速实现圈组文本消息收发的流程。

  1. 发送方调用 createServer 方法创建圈组服务器。为更加快速实现消息收发,创建时可将 InviteMode 设置为 1(发送邀请后,不需要被邀请方同意,被邀请方立即加入服务器)。

    示例代码如下:

    typescriptconst qchat = new QChat(options);
    qchat.qchatServer.createServer({
        "name": "Jason的健身天地", // 传入服务器名称
        ...
    })
    

    创建成功后,需记录服务器的 ID(serverId),后续步骤将需要传入serverId

  2. 发送方调用 createChannel 方法,调用时传入上一步中创建的圈组服务器的 serverId,且将 viewModeType 分别设置为 0message,从而在圈组服务器中创建一个消息类型的公开频道。

    示例代码如下:

    typescriptconst qchat = new QChat(options);
    qchat.qchatChannel.createChannel({
    "serverId": "12345",
    "name": "1"
    })
    
    

    创建成功后,需记录频道的 ID(channelId),后续步骤将需要传入channelId

  3. 发送方调用 inviteServerMembers 方法,邀请接收方加入服务器。

    示例代码如下:

    typescriptconst qchat = new QChat(options);
    await qchat.qchatServer.inviteServerMembers({
        "serverId": '123456',
        "accids":["123"]
    })
    
  4. 发送方调用 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"]
    })
    
    
  5. SDK 触发消息接收(message)事件回调,接收方通过该回调接收消息体(QChatMessage)。

后续步骤

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

相关参考

此文档是否对你有帮助?
有帮助
去反馈
  • 使用前准备
  • 实现流程
  • 流程概览
  • 步骤1: 集成 NIM SDK
  • 步骤 2:初始化 SDK
  • 步骤 3:登录 IM
  • 步骤 4:圈组消息收发
  • 后续步骤
  • 相关参考