HarmonyOS 访客端SDK集成

  • 环信客服云(Customer Engagement Cloud, CEC)现已推出专属 HarmonyOS SDK!您只需在客服云创建 APP 关联,并按照本文档的步骤集成 HarmonyOS SDK,即可轻松实现 HarmonyOS 版 APP 接入。
  • 您在集成过程中有遇到任何问题,请联系我们为您提供技术支持服务!

SDK介绍

前提条件

  • DevEco Studio 5.0.0 Release(5.0.3.906)及以上;
  • HarmonyOS SDK API 12 及以上;
  • 有效的环信客服云账号和坐席接入App关联信息。

准备开发环境

本节介绍如何创建项目,将环信客服云访客端 HarmonyOS SDK 集成到你的项目中,并添加相应的设备权限。

1. 创建 HarmonyOS 项目

参考以下步骤创建一个 HarmonyOS 项目。
  • 打开 DevEco Studio,点击 Create Project。
  • 在 Choose Your Ability Template 界面,选择 Application > Empty Ability,然后点击 Next。
  • 在 Configure Your Project 界面,依次填入以下内容:
  • Project name:你的 HarmonyOS 项目名称,如 HelloWorld。
  • Bundle name:你的项目包的名称,如 com.helpdesk.helloworld。
  • Save location:项目的存储路径。
  • Compatible SDK:项目的支持的最低 API 等级,选择 5.0.0(12) 及以上。
  • Module name:module的名称,默认为 entry。
  • 点击 Finish。根据屏幕提示,安装所需插件。

上述步骤使用 DevEco Studio 5.0.0 Release(5.0.3.906) 示例

2. 集成 SDK

  • 打开 SDK 下载链接,获取最新版的环信客服云访客端 HarmonyOS SDK,得到 har 形式的 SDK 文件。
  • 将 SDK 文件,拷贝到 Harmony 工程,例如放至 HelloWorld 工程下 entry 模块下的 libs 目录。
  • 在工程 build-profile.json5 中设置支持字节码 HAR 包
{
  "app": {
    "products": [
      {
         "buildOption": {
           "strictMode": {
             "useNormalizedOHMUrl": true
           }
         }
      }
    ]
  }
}
  • 修改模块目录的 oh-package.json5 文件,在 dependencies 节点增加依赖声明。
{
  "name": "entry",
  "version": "1.0.0",
  "description": "Please describe the basic information.",
  "main": "",
  "author": "",
  "license": "",
  "dependencies": {
    "VisitorSdk": "file:libs/VisitorSdk-v1.0.2.har"
  }
}
  • 最后单击 File > Sync and Refresh Project 按钮,直到同步完成。

3. 添加项目权限

在模块的 module.json5 ,例如:HelloWorld 中 entry 模块的 module.json5 中,配置示例如下:

{
  "module": {
    "requestPermissions":[
      {
        "name" : "ohos.permission.INTERNET",
        "reason": "$string:Internet_reason",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when":"always"
        }
      },
      {
       "name": "ohos.permission.GET_NETWORK_INFO",
        ...
      },
    ],
  },
}

  • SDK所需权限为ohos.permission.INTERNET和ohos.permission.GET_NETWORK_INFO

实现消息发送

本节介绍如何实现消息发送:

1. SDK 初始化

避免重复初始化,如果进行多次初始化,仅第一次生效

//初始化sdk
let mVisitorOptions = new VisitorOptions();
mVisitorOptions
      .setKefuRestServer('${客服系统地址}')//选填,默认为:https://kefu.sh.absoloop.com
      .setAppkey('${AppKey}')//必填,坐席管理员模式下-接入-在线客服-App-关联信息-Appkey
      .setTenantId('${租户ID}')//必填,坐席管理员模式下-账户-账户信息-租户ID
      .setAppVersion('${app版本号}')//选填,建议填写,便于查问题
VisitorClient.getInstance().init(mContext, visitorOptions)

2. 创建账号

根据业务需求,如需在访客端创建账号,可以使用如下代码注册访客账号:

VisitorClient.getInstance()
      .getVisitorManager()
      .register(username, password)
      .then((value: string)=>{//注册成功})

3. 登录账号

使用如下代码实现用户登录:

VisitorClient.getInstance()
      .getVisitorManager()
      .login(username, password)
      .then((value: string) => {
        //登录成功
      })

*除了注册监听器,其他的 SDK 操作均需在登录之后进行。

4. 绑定/解绑IM服务号

在发送消息前调用绑定,在退出聊天时调用解绑

//绑定`toChatUsername` 为IM服务号。
VisitorClient.getInstance().getVisitorManager().bindChat(toChatUsername)
//解绑
VisitorClient.getInstance().getVisitorManager().bindChat(toChatUsername)

5. 发送消息

以发送文本消息为例:

// `content` 为要发送的文本内容,`toChatUsername` 为IM服务号。
let message = Message.createTxtSendMessage(content, toChatUsername);
if(message){
     VisitorClient.getInstance().getVisitorManager().sendMessage(message)
}

监听消息接收

let messageListener: MessageListener = {
      onMessage(msgs: ArrayList<Message>) {
        //收到上屏消息
      },
      onCmdMessage(msgs: ArrayList<Message>) {
        //收到cmd消息
      },
      onMessageStatusUpdate() {
        //消息状态改变
      },
      onMessageSent() {
        //消息已发送
      }
}
//添加消息监听
VisitorClient.getInstance().getVisitorManager().addMessageListener(messageListener);
//移除消息监听
VisitorClient.getInstance().getVisitorManager().removeMessageListener(messageListener);

退出登录

VisitorClient.getInstance()
      .getVisitorManager()
      .logout()
      .then(() => {
        //退出成功
      })

监听连接状态

你可以通过注册连接监听确认IM连接状态。

let connectListener: IMConnectListener = {
      onConnected: (): void => {
        // 长连接建立
      },
      onDisconnected: (errorCode: number): void => {
        // 长连接断开
        switch (errorCode) {
          case VisitorError.USER_NOT_FOUND:
          case VisitorError.USER_LOGIN_ANOTHER_DEVICE:
          case VisitorError.USER_AUTHENTICATION_FAILED:
          case VisitorError.USER_REMOVED:
            VisitorClient.getInstance().getVisitorManager().logout()
            //TODO 跳转到登录页面
            break;
        }
    }
  }
VisitorClient.getInstance().addConnectionListener(connectListener)

VisitorClient.getInstance().removeConnectionListener(connectListener)

断网自动重连

如果由于网络信号弱、切换网络等引起的连接终端,SDK 会自动尝试重连。重连成功或者失败的结果分别会收到通知 onConnected 和 onDisconnected。

被动退出登录

你可以通过监听回调 ConnectionListener#onDisconnected 后,调用 #logout 进行退出并返回登录界面。

ConnectionListener#onDisconnected(number) 返回的 errorCode 有如下

  • VisitorError.USER_NOT_FOUND: 账号不存在
  • VisitorError.USER_LOGIN_ANOTHER_DEVICE: 账号在其他设备登录
  • VisitorError.USER_AUTHENTICATION_FAILED: 账号校验失败
  • VisitorError.USER_REMOVED: 账号被移除

输出信息到日志文件

  1. 默认情况下,SDK 最多可生成和保存三个文件,easemob.log 和两个 easemob_YYYY-MM-DD_HH-MM-SS.log 文件。这些文件为 UTF-8 编码,每个不超过 2 MB。SDK 会将最新的日志写入 easemob.log 文件,写满时则会将其重命名为对应时间点的 easemob_YYYY-MM-DD_HH-MM-SS.log 文件,若日志文件超过三个,则会删除最早的文件。
  2. 例如,SDK 在 2024 年 1 月 1 日上午 8:00:00 记录日志时会生成 easemob.log 文件,若在 8:30:00 将 easemob.log 文件写满则会将其重命名为 easemob_2024-01-01_08-30-00.log 文件,随后在 9:30:30 和 10:30:30 分别生成了 easemob_2024-01-01_09-30-30.log 和 easemob_2024-01-01_10-30-30.log 文件,则此时 easemob_2024-01-01_08-30-00.log 文件会被移除。
  3. SDK 默认输出调试信息(所有日志,包括调试信息、警告和错误),如果只需输出错误日志,需要关闭日志输出。

关闭日志输出

//初始化时调用
let mVisitorOptions = new VisitorOptions();
mVisitorOptions.setConsoleLog(false)
VisitorClient.getInstance().init(mContext, visitorOptions)

获取本地日志

  • 打开以下目录,获取本地日志。
hdc file recv /data/app/el2/100/base/{应用包名}/{AppKey}/core_log
  • 获取本地日志,需要将 {应用包名} 替换为应用的包名,例如 com.easemob.helpdesk;{AppKey} 需要替换为APP关联中的 AppKey。

离线推送

开通推送服务与配置 Client ID

上传推送证书

  • 在IM Console后台上传推送证书,选择你的应用 > 即时通讯 > 功能配置 > 消息推送 > 证书管理。点击 添加推送证书,在 添加推送证书 窗口选择 鸿蒙 页签,然后设置推送证书相关参数。

推送证书参数:

初始化配置推送 Client ID

let mVisitorOptions = new VisitorOptions();
mVisitorOptions.setPushAppId('${Harmony Client ID}')
VisitorClient.getInstance().init(context, mVisitorOptions)

监听 Push Token 上传结果

let pushListener: VisitorPushListener = {
      onError: (error: VisitorError): void => {
        console.info(`pushListener onError: ${JSON.stringify(error)}`)
      },
      onBindTokenSuccess: (token: string): void => {
        console.info(`pushListener onSuccess: ${token}`)
      }
}
VisitorClient.getInstance().addPushListener(pushListener)