• Harmony 弹窗 SDK 依赖 Harmony 埋点 SDK,并且需要埋点 SDK 版本 >=0.3.0
  • Harmony 弹窗 SDK 是闭源的
  • Harmony 弹窗 SDK 内部实现了多线程,但是由于 HarmonyOS 本身的多线程机制,请在主线程初始化 SDK 和调用相关接口
  • 需要神策智能运营版本 >=4.4.5

集成

由于弹窗 SDK 依赖埋点 SDK,请先集成神策 Harmony 埋点 SDK,具体集成步骤请参考:神策 Harmony 埋点 SDK 集成 ,将 SensorsFocus.har 拷贝到项目工程目录下,然后安装:

ohpm install SensorsFocus.har
CODE

或者在 oh-package.json5 文件中添加依赖,然后点击同步:

{
  "license": "",
  "devDependencies": {},
  "author": "",
  ...
  "dependencies": {
    "@sensorsdata/sensorsfocus": "file:./src/main/SensorsFocus.har" //SensorsFocus.har 文件的目录
  },
  "dynamicDependencies": {}
}
CODE

初始化 SDK

由于弹窗 SDK 依赖埋点 SDK,所以需要先初始化埋点 SDK 后再初始化弹窗 SDK,考虑到埋点 SDK 初始化是个异步的,需要在埋点 SDK 状态为 ready 时再初始化弹窗 SDK,示例代码如下:

import sensors from '@sensorsdata/analytics';
import { SensorsFocus, SFConfigOptions } from '@sensorsdata/sensorsfocus';


export default class EntryAbility extends UIAbility {
   onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
      //初始化埋点 SDK
      sensors.init({
      show_log: true,
      server_url: '数据上报地址',
      context: context,
      ...
      })
      //初始化弹窗 SDK
      sensors.emitter.on('ready', () => {
         let options: SFConfigOptions = new SFConfigOptions('在线服务地址')
         options.enableLog = true
         options.enableSDHIDM = true
         options.accessToken = 'your accessToken'
         options.orgId = 'your orgId'
         ...
         SensorsFocus.start(options, context)
      })
   }
}
CODE

在线服务地址、orgId 以及 accessToken 可以从项目设置→ 基本设置→ 在线服务地址页面获取:


配置 Scheme

为了能扫码测试弹窗,需要在 module.json5 中配置对应的 uri,示例如下:

{
  "module": {
    "name": "sample",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet",
      "2in1"
    ],
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "description": "$string:EntryAbility_desc",
        "skills": [
          {
            "uris": [
              {
                "scheme": "sa2494a80b", // 从神策分析页面获取
                "host": "popupwindow"  // host 必须设置成 popupwindow
              }
            ]
          }
        ]
      }
    ]
  }
}
CODE

从数据接入引导页面获取对应项目的 Scheme:

注意

host 必须要配置成 popupwindow,否则无法正常扫码测试弹窗

弹窗回调

在弹窗 SDK 初始化的时候,可以通过设置 SFConfigOptions 的 campaignListener 来实现弹窗相关的回调,需要实现 SFCampaignListener 协议:

export interface SFCampaignListener {
  //描述弹窗是否触达,默认为 true,可以不实现,如果实现需谨慎,否则会影响所有的弹窗触达
  shouldStart?(campaign: SFCampaign): boolean

  //弹窗触达后的回调,必须要实现,可以在这个回调中处理一些自定义的操作
  didStart(campaign: SFCampaign): void

  //弹窗结束的回调,可以不实现
  didEnd?(campaign: SFCampaign): void
  
  //预置弹窗窗体元素点击的回调,可以不实现
  didClick?(campaign: SFCampaign): void

  //弹窗触达发生错误的回调,可以不实现
  didFail?(campaign: SFCampaign, error: SFError): void
}
CODE

注意

  • shouldStart 可以不实现,如果需要实现,需谨慎处理,否则会影响所有弹窗的触达
  • 自定义弹窗必须设置 campaignListener,且必须实现 didStart

其中,回调中 SFCampaign 类相关成员变量说明如下:

export class SFCampaign {
  //弹窗资源位的策略 ID
  planId: string | undefined
  //弹窗资源位的策略名称
  name: string | undefined
  //弹窗资源位的预置弹窗的窗体内容或者自定义弹窗的自定义参数
  content: string = ''
  //标识弹窗的 uuid
  uuid: string = ''
  //弹窗资源位的类型,分为预置弹窗和自定义弹窗
  type: SFCampaignType = SFCampaignType.PRESET
  //预置弹窗窗体元素点击的动作
  action: SFCampaignAction | undefined
}
CODE

测试弹窗

要实现测试弹窗,必须先配置 Scheme,并且初始化了弹窗 SDK,并且需要在 EntryAbility 中的 onNewWant 中调用 handle 接口,示例代码如下:

 onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    let uri = want.uri
    if (!uri) {
      return
    }
    SensorsFocus.handle(uri)
  }
CODE

在创建弹窗资源位或者编辑资源位时,物料配置页面的物料元素下有个测试弹窗:

点击按钮,会出现扫码界面,使用手机系统扫码即可: