hiappevent-guidelines.md 9.5 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6 7 8 9 10
# 应用事件开发指导

## 场景介绍

应用事件打点的主要工作是在应用运行过程中,帮助应用记录在运行过程中发生的各种信息。

## 接口说明

应用事件JS打点接口由hiAppEvent模块提供。

11 12
以下仅提供简单的接口介绍,API接口的具体使用说明(参数使用限制、具体取值范围等),请参考[应用事件打点API文档](../reference/apis/js-apis-hiappevent.md)

Z
zengyawen 已提交
13 14
**打点接口功能介绍:**

L
lyj_love_code 已提交
15 16 17 18 19 20
| 接口名                                                       | 描述                                                         |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| write(string eventName, EventType type, object keyValues, AsyncCallback\<void> callback): void | 应用事件异步打点方法,使用callback方式作为异步回调。         |
| write(string eventName, EventType type, object keyValues): Promise\<void> | 应用事件异步打点方法,使用Promise方式作为异步回调。          |
| write(AppEventInfo info, AsyncCallback\<void> callback): void | 支持domain参数的应用事件异步打点方法,使用callback方式作为异步回调。 |
| write(AppEventInfo info): Promise\<void>                     | 支持domain参数的应用事件异步打点方法,使用Promise方式作为异步回调。 |
Z
zengyawen 已提交
21

L
lyj_love_code 已提交
22
当采用callback作为异步回调时,可以在callback中进行下一步处理。
23

L
lyj_love_code 已提交
24 25 26
当采用Promise对象返回时,也可以在Promise对象中类似地处理接口返回值。

具体结果码说明见[事件校验结果码](#事件校验结果码)
Z
zengyawen 已提交
27 28 29

**打点配置接口功能介绍:**

L
lyj_love_code 已提交
30 31 32 33 34 35 36 37 38 39
| 接口名                                  | 描述                                                 |
| --------------------------------------- | ---------------------------------------------------- |
| configure(ConfigOption config): boolean | 应用事件打点配置方法,可以对打点功能进行自定义配置。 |

**订阅接口功能介绍:**

| 接口名                                             | 描述                 |
| -------------------------------------------------- | -------------------- |
| addWatcher(Watcher watcher): AppEventPackageHolder | 新增应用事件订阅者。 |
| removeWatcher(Watcher watcher): void               | 移除应用事件订阅者。 |
Z
zengyawen 已提交
40

L
lyj_love_code 已提交
41 42 43 44 45
**清理接口功能介绍:**

| 接口名            | 描述                 |
| ----------------- | -------------------- |
| clearData(): void | 清除本地的打点数据。 |
46 47 48

### 事件校验结果码

L
lyj_love_code 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| 错误码 | 原因                          | 校验规则                                                     | 处理结果                                                   |
| ------ | ----------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------- |
| 0      | 无                            | 事件校验成功                                                 | 事件正常打点。                                             |
| -1     | 无效的事件名称                | 非空且长度在48个字符以内(含)。<br>只由以下字符组成:0-9、a-z、_。<br/>非数字以及下划线开头。 | 忽略该事件,不执行打点。                                   |
| -2     | 无效的事件基本参数类型        | 事件名称参数必须为string。<br/>事件类型参数必须为number类型。<br/>事件参数必须为object类型。 | 忽略该事件,不执行打点。                                   |
| -4     | 无效的事件领域名称            | 非空且长度在32个字符以内(含)。<br/>只由以下字符组成:0-9、a-z、_。<br/>非数字以及下划线开头。 | 忽略该事件,不执行打点。                                   |
| -99    | 应用打点功能被关闭            | 应用打点功能被关闭。                                         | 忽略该事件,不执行打点。                                   |
| -100   | 未知错误                      | 无。                                                         | 忽略该事件,不执行打点。                                   |
| 1      | 无效的key参数名称             | 非空且长度在16个字符以内(含)。<br/>只由以下字符组成:0-9、a-z、_。<br/>非数字以及下划线开头。<br/>非下划线结尾。 | 忽略该键值对参数后,继续执行打点。                         |
| 2      | 无效的key参数类型             | Key参数必须为字符串类型。                                    | 忽略该键值对参数后,继续执行打点。                         |
| 3      | 无效的value参数类型           | value参数只支持以下类型:<br/>boolean、number、string、Array[基本类型]。 | 忽略该键值对参数后,继续执行打点。                         |
| 4      | 非法长度的string类型value参数 | 参数值长度必须在8*1024个字符以内(含)。                     | 对字符串进行截断(只保留前8*1024个字符)后,继续执行打点。 |
| 5      | key-value参数对数过多         | key-value参数对数必须在32对以内(含)。                      | 忽略后面多余的键值对参数后,继续执行打点。                 |
| 6      | 非法容量的Array类型value参数  | Array类型的value参数容量必须在100个以内(含)。              | 对数组进行截断(只保留前100个元素)后,继续执行打点。      |
| 7      | 非法类型的Array类型value参数  | Array内的参数必须为同一类型,且只能为boolean、number、string类型。 | 忽略该键值对参数后,继续执行打点。                         |
64

Z
zengyawen 已提交
65 66
## 开发步骤

L
lyj_love_code 已提交
67
以一次应用事件打点订阅流程为例,说明开发步骤。
Z
zengyawen 已提交
68

L
lyj_love_code 已提交
69
1. 新建一个ets应用工程,编辑工程中的“entry > src > main > ets  > pages > index.ets” 文件,依次添加三个按钮,以对应用事件打点订阅流程进行模拟。其中,按钮1模拟了应用事件打点的调用,按钮2模拟了新增自动触发回调的事件订阅者的调用,按钮3模拟了移除事件订阅者的调用,完整示例代码如下:
Z
zengyawen 已提交
70

L
lyj_love_code 已提交
71 72
   ```ts
   import hiAppEvent from '@ohos.hiAppEvent';
Z
zengyawen 已提交
73
   
L
lyj_love_code 已提交
74 75 76 77
   @Entry
   @Component
   struct Index {
     @State message: string = 'Hello World'
Z
zengyawen 已提交
78
   
L
lyj_love_code 已提交
79 80 81 82 83 84
     build() {
       Row() {
         Column() {
           Text(this.message)
             .fontSize(50)
             .fontWeight(FontWeight.Bold)
Z
zengyawen 已提交
85
   
L
lyj_love_code 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
           Button("1 writeTest").onClick(()=>{
             hiAppEvent.write({
               domain: "test_domain",
               name: "test_event",
               eventType: hiAppEvent.EventType.FAULT,
               params: {
                 int_data: 100,
                 str_data: "strValue"
               }
             }).then((value) => {
               console.log(`HiAppEvent success to write event: ${value}`);
             }).catch((err) => {
               console.error(`HiAppEvent failed to write event because ${err.code}`);
             });
           })
Z
zengyawen 已提交
101
   
L
lyj_love_code 已提交
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
           Button("2 addWatcherTest").onClick(()=>{
             hiAppEvent.addWatcher({
               name: "watcher1",
               appEventFilters: [{ domain: "test_domain" }],
               triggerCondition: {
                 row: 2,
                 size: 1000,
                 timeOut: 2
               },
               onTrigger: function (curRow, curSize, holder) {
                 if (holder == null) {
                   console.error("HiAppEvent holder is null");
                   return;
                 }
                 let eventPkg = null;
                 while ((eventPkg = holder.takeNext()) != null) {
                   console.info("HiAppEvent eventPkg.packageId=" + eventPkg.packageId);
                   console.info("HiAppEvent eventPkg.row=" + eventPkg.row);
                   console.info("HiAppEvent eventPkg.size=" + eventPkg.size);
                   for (const eventInfo of eventPkg.data) {
                     console.info("HiAppEvent eventPkg.data=" + eventInfo);
                   }
                 }
               }
             });
           })
Z
zengyawen 已提交
128
   
L
lyj_love_code 已提交
129 130 131 132 133 134 135
           Button("3 removeWatcherTest").onClick(()=>{
             hiAppEvent.removeWatcher({
               name: "watcher1"
             })
           })
         }
         .width('100%')
Z
zengyawen 已提交
136
       }
L
lyj_love_code 已提交
137 138
       .height('100%')
     }
Z
zengyawen 已提交
139 140 141
   }
   ```

L
lyj_love_code 已提交
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
2. 点击IDE界面中的运行按钮,运行应用工程。

3. 在应用界面点击按钮1进行一次事件打点,可以在Log窗口看到打点成功的日志:

   ```
   success to write event: 0
   ```

4. 在应用界面点击按钮2进行新增事件订阅者,再多次点击按钮1进行多次打点。在满足回调任一触发条件(事件数量、事件数据大小、定时时长)后,可以在Log窗口看到回调函数触发后获取到的订阅事件包的日志:

   ```
   HiAppEvent eventPkg.packageId=0
   HiAppEvent eventPkg.row=2
   HiAppEvent eventPkg.size=308
   HiAppEvent eventPkg.data={"domain_":"test_domain","name_":"test_event","type_":1,"time_":1502096107556,"tz_":"+0000","pid_":4204,"tid_":4223,"int_data":100,"str_data":"strValue"}
   ```

5. 在应用界面点击按钮3进行移除事件订阅者,再多次点击按钮1进行多次打点,此时在Log窗口不再能看到订阅触发的日志。
Z
zengyawen 已提交
160 161

## 相关实例
162 163 164

针对应用事件开发,有以下相关实例可供参考:

165
- [`JsDotTest`:测试打点(JS)(API8)](https://gitee.com/openharmony/applications_app_samples/tree/master/DFX/JsDotTest)