实现单聊/群聊消息收发

更新时间: 2024/07/02 09:42:42

网易云信 IM 即时通讯服务提供一整套即时通讯基础能力,助您快速实现多样化的即时通讯场景。

本文主要介绍通过集成 NetEase IM SDK(NIM SDK)并调用 API,快速实现单聊/群聊消息收发功能。

群聊消息收发需要先进入群组,后续流程与单聊消息收发相同。

使用前准备

  • 已在云信控制台创建应用,获取 App Key。
  • 注册云信 IM 账号,获取 IM 账号和 token。
  • 开发环境请满足:
    • DevEco Studio NEXT Developer Beta1(5.0.3.300) 及以上。
    • HarmonyOS SDK API 11 及以上。
    • 运行环境 HarnomyOS NEXT 2.1.2.5(Canary1)以上。

实现流程

流程概览

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

uml diagram

步骤 1:集成 SDK

  1. 通过 NIMApiDemo/entry/libs 下载 har 形式的 NIM SDK 产物。

  2. 将 SDK 文件拷贝到 Harmony 工程,例如放至 entry 模块下的 libs 目录。

  3. 修改模块目录的 oh-package.json5 文件,在 dependencies 节点增加依赖声明。

    {
        "name": "entry",
        "version": "1.0.0",
        "description": "Please describe the basic information.",
        "main": "",
        "author": "",
        "license": "",
        
        ...
        
        "dependencies": {
            <!-- 业务模版har包, 可以按需添加 -->
            "@nimsdk/conversation": "file:../../libs/conversation.har",
            "@nimsdk/conversationgroup": "file:../../libs/conversationgroup.har",
            "@nimsdk/message": "file:../../libs/message.har",
            "@nimsdk/team": "file:../../libs/team.har",
            "@nimsdk/user": "file:../../libs/user.har",
            "@nimsdk/friend": "file:../../libs/friend.har",
            "@nimsdk/signalling": "file:../../libs/signalling.har",
            "@nimsdk/setting": "file:../../libs/setting.har",
            "@nimsdk/notification": "file:../../libs/notification.har",
            <!-- Harmony IMSDK 基础业务模块,必须添加 -->
            "@nimsdk/nim": "file:./libs/nim.har",
            "@nimsdk/base": "file:./libs/base.har"
        }
    ...
    
    }
    
  4. 单击 File > Sync and Refresh Project 按钮,直到同步完成。

步骤 2:初始化 SDK

将 NIM SDK 集成到客户端后,需要先完成 NIM 实例的初始化才能使用其他功能。

  1. 调用 NIMSdk.registerCustomServices 方法注册使用的服务。

    • 参数说明

      static registerCustomServices(serviceType: V2NIMProvidedServiceType, creator: V2ServiceCreator)
      
      参数 类型 说明
      serviceType V2NIMProvidedServiceType 服务类型
      creator V2ServiceCreator 服务构造器
    • 示例代码

    typescript// 根据业务,选择所需服务进行注册
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_TEAM, (core, serviceName, serviceConfig) => new V2NIMTeamServiceImpl(core, serviceName, serviceConfig))
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_CLIENT_ANTISPAM_UTIL, (core, serviceName, serviceConfig) => new V2NIMClientAntispamUtil(core, serviceName, serviceConfig));
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_NOTIFICATION, (core, serviceName, serviceConfig) => new V2NIMNotificationServiceImpl(core, serviceName, serviceConfig));
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_CONVERSATION, (core, serviceName, serviceConfig) => new V2NIMConversationServiceImpl(core, serviceName, serviceConfig));
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_CONVERSATION_GROUP, (core, serviceName, serviceConfig) => new V2NIMConversationGroupServiceImpl(core, serviceName, serviceConfig));
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_MESSAGE, (core, serviceName, serviceConfig) => new V2NIMMessageServiceImpl(core, serviceName, serviceConfig));
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_USER, (core, serviceName, serviceConfig) => new V2NIMUserServiceImpl(core, serviceName, serviceConfig));
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_FRIEND, (core, serviceName, serviceConfig) => new V2NIMFriendServiceImpl(core, serviceName, serviceConfig));
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_SETTING, (core, serviceName, serviceConfig) => new V2NIMSettingServiceImpl(core, serviceName, serviceConfig));
      NIMSdk.registerCustomServices(V2NIMProvidedServiceType.V2NIM_PROVIDED_SERVICE_SIGNALLING, (core, serviceName, serviceConfig) => new V2NIMSignallingServiceImpl(core, serviceName, serviceConfig))
    
  2. 调用 newInstance 方法创建 NIM 实例,同时配置初始化参数。

    • 参数说明

      static newInstance(context: common.Context, initializeOptions: NIMInitializeOptions, serviceOptions: NIMServiceOptions = {}): NIMInterface
      
      参数 类型 说明
      context common.Context 应用上下文
      initializeOptions NIMInitializeOptions SDK 的配置信息
      serviceOptions NIMServiceOptions 业务服务的配置信息

      NIMInitializeOptions 的配置参数

      参数 类型 必填 说明
      appkey string 应用的 App Key,在云信控制台创建应用后获取
      xhrConnectTimeout number 否,默认为 30000 ms 建立连接时的 xhr 请求的超时时间
      socketConnectTimeout number 否,默认为 30000 ms 建立 websocket 连接的超时时间

      NIMServiceOptions 的配置参数

      参数 类型 必填 说明
      loginServiceConfig NIMLoginServiceConfig LoginService的配置参数

      NIMLoginServiceConfig 的配置参数

      参数 类型 必填 说明
      lbsUrls string[] lbs 地址。SDK 连接时会向 lbs 地址请求得到 socket 连接地址
      linkUrl string socket 备用地址,当 lbs 请求失败时,尝试直接连接 socket 备用地址
      customClientType number 自定义客户端类型
      customTag string 自定义客户端标签
    • 示例代码

      typescriptlet initializeOptions: NIMInitializeOptions = {
        appkey: "your appkey ",
      };
      
      let serviceOptions: NIMServiceOptions = {
        loginServiceConfig: {
          lbsUrls: ['https://lbs.netease.im/lbs/webconf'], 
          linkUrl: 'weblink-harmony-tmp.netease.im:443'
        }
      }
      
      const nim = NIMSdk.newInstance(context, initializeOptions, serviceOptions)
      

步骤 3:登录 IM

客户端用户在使用云信即时通讯功能前需要先登录云信 IM 服务器。

调用 login 方法进行登录。以静态 Token 登录为例,示例代码如下:

typescript// 1. default and fixed token
try {
  await nim.loginService.login("ACCOUNT_ID", "TOKEN", {
    "forceMode": false
  })
} catch (err) {
  // TODO failed, check code
  // console.log(err.code)
}

// 2. or dynamic token
try {
  await nim.loginService.login("ACCOUNT_ID", "", {
    "forceMode": false,
    "authType": 1, // V2NIMLoginAuthType.V2NIM_LOGIN_AUTH_TYPE_DYNAMIC_TOKEN
    "tokenProvider": function(accountId) {
      return Promise.resolve('YOUR_DYNAMIC_TOKEN')
    }
  })
} catch (err) {
  // TODO failed, check code
  // console.log(err.code)
}

// 3. or authentication with third-party
try {
  await nim.loginService.login("ACCOUNT_ID", "", {
    "forceMode": false,
    "authType": 2, // V2NIMLoginAuthType.V2NIM_LOGIN_AUTH_TYPE_THIRD_PARTY
    "loginExtensionProvider": function(accountId) {
      return Promise.resolve('YOUR_LOGIN_EXTENSION')
    }
  })
} catch (err) {
  // TODO failed, check code
  // console.log(err.code)
}

其他登录方式请参见登录及登出 IM

步骤 4:消息收发

本节以用户 A 和用户 B 的消息交互为例,介绍快速实现单聊消息收发的流程。更多消息类型的收发,请参见消息收发

创建或加入群组后,用户发送和接收消息的接口与单聊消息收发相同,区别在于会话类型(V2NIMConversationType)的参数配置,V2NIM_CONVERSATION_TYPE_TEAM(2) 为高级群,V2NIM_CONVERSATION_TYPE_SUPER_TEAM(3) 为超大群。

  1. 用户 B 注册消息监听器,监听消息接收回调事件 onReceiveMessages。示例代码如下:

    typescriptnim.messageService.on("onReceiveMessages", function (messages: V2NIMMessage[]) {})
    

    如需移除登录相关监听器,可调用 off("EventName")

    typescriptnim.messageService.off("onReceiveMessages", function (messages: V2NIMMessage[]) {})
    
  2. 用户 A 调用 createTextMessage 方法构建文本消息,然后调用 sendMessage 方法向用户 B 发送文本消息。示例代码如下:

    typescripttry {
    // 创建一条文本消息
    const message: V2NIMMessage = nim.messageCreator.createTextMessage("hello")
    // 发送消息
    const res: V2NIMSendMessageResult = await nim.messageService.sendMessage(message, 'test1|1|test2')
    // todo Success
    } catch (err) {
    // todo error
    } 
    

    目前 NIM SDK 支持多种消息类型,包括文本消息、图片消息、语音消息、视频消息、文件消息、地理位置消息、提示消息、通知消息以及自定义消息。具体请参见消息收发

  3. 用户 B 通过 onReceiveMessages 回调收到文本消息。

后续步骤

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

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