目录

HarmonyOS 访客端SDK集成

SDK介绍

前提条件

准备开发环境

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

1. 创建 HarmonyOS 项目

参考以下步骤创建一个 HarmonyOS 项目。

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

2. 集成 SDK

{
  "app": {
    "products": [
      {
         "buildOption": {
           "strictMode": {
             "useNormalizedOHMUrl": true
           }
         }
      }
    ]
  }
}
{
  "name": "entry",
  "version": "1.0.0",
  "description": "Please describe the basic information.",
  "main": "",
  "author": "",
  "license": "",
  "dependencies": {
    "VisitorSdk": "file:libs/visitorsdk-v1.0.0.har"
  }
}

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",
        ...
      },
    ],
  },
}

实现消息发送

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

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 有如下

输出信息到日志文件

  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

离线推送

开通推送服务与配置 Client ID

上传推送证书

推送证书参数:

初始化配置推送 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)