react-native-quicktracking-analytics-module 1.0.0-beta.1 → 1.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,98 +1,347 @@
1
- # 集成方式
2
- QuickTracking ReactNative SDK
3
- ## 安装React Native模块
4
- ### 1.npm 安装 react-native-quicktracking-analytics-module 模块
5
- ```sh
1
+ # 集成
2
+ QT React Native 埋点SDK是基于Quick Tracking 原生客户端SDK上的扩展,封装了埋点常用的api,如全局属性、页面属性、自定义事件等,需要分别在RN、Android、iOS三端做集成。
3
+
4
+ ## React Native 集成
5
+ ### 下载npm包到项目中
6
+ ```bash
7
+ # npm
6
8
  npm install react-native-quicktracking-analytics-module
9
+
10
+ # yarn
11
+ yarn add react-native-quicktracking-analytics-module
12
+
13
+ # pnpm
14
+ pnpm add react-native-quicktracking-analytics-module
7
15
  ```
8
- ## link 模块
9
- ```sh
10
- react-native link react-native-quicktracking-analytics-module
11
- ```
12
- ## API 文档
13
16
 
14
- ```js
17
+ ### 引入QT类
18
+ ```tsx
15
19
  import { QT } from "react-native-quicktracking-analytics-module";
20
+ ```
16
21
 
17
- /**
18
- * 页面浏览事件埋点-打开页面
19
- * @param pageName 页面名称
20
- *
21
- **/
22
- QT.onPageStart('test_page');
22
+ ## Android 集成
23
+ ### 进入控制台
24
+ 进入QT后台,点击“管理控制台”
25
+ ![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2022/png/220937/1646903919683-276177f8-42a7-4f6e-87aa-fff88ae87a77.png#clientId=u468f5541-19bf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=790&id=EZloP&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1580&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&size=2103957&status=done&style=none&taskId=ua2f5b36f-3995-47d2-909b-a42abba8f55&title=&width=1439)
23
26
 
24
- /**
25
- * 页面浏览事件埋点-离开页面
26
- * @param pageName 页面名称
27
- *
28
- **/
29
- QT.onPageEnd('test_page');
27
+ ### 集成应用
28
+ 找到需要集成埋点的应用:进入“应用列表”,选择所需组织,点击操作中的“详情或者去集成”
29
+ ![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2022/png/220937/1646904230482-8878cb3e-71d7-4514-a6a8-4e0b6b2322c0.png#clientId=u468f5541-19bf-4&crop=0&crop=0.1396&crop=1&crop=1&from=paste&height=788&id=dcFuI&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1576&originWidth=2880&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1188843&status=done&style=none&taskId=uc344d9e4-34d9-4702-9b3a-fcec5a8a04c&title=&width=1440)
30
30
 
31
- /**
32
- * 自定义事件埋点
33
- * @param eventId 当前统计的事件ID
34
- * @param params 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>”对
35
- */
36
- QT.sendEvent('test_clk', {
37
- param1: 'value1',
38
- param2: 2,
39
- param3: true,
40
- param4: ['value1', 'value2']
41
- });
31
+ ### Maven地址配置
32
+ 在工程 build.gradle 配置脚本中 buildscript 和 allprojects 段中添加 sdk maven 仓库地址
33
+ ```groovy
34
+ buildscript {
35
+ repositories {
36
+ google()
37
+ jcenter()
38
+ maven { url 'https://repo1.maven.org/maven2/' }
39
+ }
40
+ dependencies {
41
+ classpath 'com.android.tools.build:gradle:3.4.0'}
42
+ // NOTE: Do not place your application dependencies here; they belong
43
+ // in the individual module build.gradle files
44
+ }
45
+ }
46
+ allprojects {
47
+ repositories {
48
+ google()
49
+ jcenter()
50
+ maven { url 'https://repo1.maven.org/maven2/' }
51
+ }
52
+ }
53
+ ```
42
54
 
43
- /**
44
- * 桥接事件埋点
45
- * @param data H5转发事件的日志体, 需要H5集成QT Web sdk并转发事件
46
- */
47
- QT.sendEventForH5('xxxx');
55
+ ### 组件引用
56
+ 在工程app对应build.gradle配置脚本dependencies段中,添加集成所需要的依赖
57
+ ```groovy
58
+ dependencies {
59
+ implementation fileTree(include:['*.jar'], dir:'libs')
60
+
61
+ implementation "com.umeng.umsdk:qt-px-common:1.3.8.PX"
62
+ }
63
+ ```
64
+
65
+ ### 埋点验证配置
66
+ 在Android.manifest中,找到MainActivity对应的activity标签,并将以下代码粘贴进去,appkey换成自己的
67
+ ```xml
68
+ //1.唤起码默认为"atm.该app对应的appkey",不可改变
69
+ //2.请使用单独intent-filter,和其他intent-filter并列
70
+ //不要将以下代码填入其他intent-filter里;
71
+
72
+ <intent-filter>
73
+ <action android:name="android.intent.action.VIEW" />
74
+ <category android:name="android.intent.category.DEFAULT" />
75
+ <category android:name="android.intent.category.BROWSABLE" />
76
+ <data android:scheme="atm.appkey" />
77
+ </intent-filter>
78
+ ```
79
+
80
+ ### 配置权限
81
+ 统计SDK需要宿主APP授予如下权限:
82
+
83
+ | 权限 | 用途 |
84
+ | --- | --- |
85
+ | ACCESS_NETWORK_STATE | 检测联网方式,在网络异常状态下避免数据发送,节省流量和电量。 |
86
+ | READ_PHONE_STATE(可选) | 获取用户设备的IMEI,通过IMEI对用户进行唯一标识,以便提供统计分析服务。 |
87
+ | ACCESS_WIFI_STATE | 获取WIFI mac地址,在平板设备或电视盒子上,无法通过IMEI标识设备,我们会将WIFI mac地址作为用户的唯一标识,以便正常提供统计分析服务。 |
88
+ | INTERNET | 允许应用程序联网和发送统计数据的权限,以便提供统计分析服务。 |
89
+
90
+ 下面给出AndroidManifest.xml清单文件示例:
91
+ ```xml
92
+ <manifest ……>
93
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
94
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
95
+ <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
96
+ <uses-permission android:name="android.permission.INTERNET"/>
97
+ <application ……>
98
+ ```
99
+ ###
100
+ 混淆配置
101
+ 如果您的应用使用了代码混淆,请添加如下配置,以避免Quick Tracking SDK被错误混淆导致SDK不可用。
102
+ ```groovy
103
+ -keep class com.umeng.** {*;}
104
+ -keep class org.repackage.** {*;}
105
+
106
+ -keepclassmembers class * {
107
+ public <init> (org.json.JSONObject);
108
+ }
109
+ -keepclassmembers enum * {
110
+ public static **[] values();
111
+ public static ** valueOf(java.lang.String);
112
+ }
113
+ ```
48
114
 
115
+ SDK需要引用导入工程的资源文件,通过了反射机制得到资源引用文件R.java,但是在开发者通过proguard等混淆/ 优化工具处理apk时,proguard可能会将R.java删除,如果遇到这个问题,请添加如下配置:
116
+ ```groovy
117
+ -keep public class [您的应用包名].R$*{
118
+ public static final int *;
119
+ }
120
+ ```
121
+
122
+ ### 初始化SDK
123
+
124
+ 1. 域名设置
125
+
126
+ 务必在初始化之前设置私有化环境收数域名。
127
+ ```java
49
128
  /**
50
- * 注册一个全局事件属性
51
- * @param property 要注册的全局属性
52
- * @description 注册全局属性后,后续触发的所有事件都将自动包含这些属性;
53
- * 且这些属性及属性值存入缓存,APP退出后清除。
54
- * 在分析数据时,可根据此属性进行查看和筛选。
55
- */
129
+ * 设置上传统计日志的主域名和备用域名。SDK会优先将统计数据上报到主域名,失败的情况下会再尝试将数据上报到备用域名。
130
+ * 主域名primaryDomain或不能传入null或者空串,否则会抛出SdkDomainUndefined运行时异常。
131
+ */
132
+
133
+ QtConfigure.setCustomDomain("收数域名", null);
134
+ ```
135
+
136
+ 2. 预初始化
137
+
138
+ 请在宿主App的Application.onCreate函数中调用基础组件库初始化函数。
139
+ ```java
140
+ // SDK预初始化函数不会采集设备信息,也不会向友盟后台上报数据。
141
+ // preInit预初始化函数耗时极少,不会影响App首次冷启动用户体验
142
+
143
+ QtConfigure.preInit(this,"appkey","Channel");
144
+ ```
145
+
146
+ 3. 初始化
147
+ ```java
148
+ // 请务必在用户同意隐私政策后,再初始化SDK。
149
+ // 正式初始化SDK,务必调用
150
+ QtConfigure.init(this,"appkey","unknown",UMConfigure.DEVICE_TYPE_PHONE, "");
151
+ ```
152
+
153
+
154
+ ## iOS集成
155
+ 注意您的ruby版本,MacOS自带的Ruby为2.6.8,不符合RN项目需求。
156
+ 建议在本地终端中执行 ruby --version,并下载ruby包管理器,如rbenv或rvm等,改成ruby版本为RN需要的[版本](https://github.com/facebook/react-native/blob/main/template/_ruby-version)
157
+
158
+
159
+
160
+
161
+ # 埋点
162
+ ## 用户账号上报
163
+ ### 用户登录
164
+ 该值的上传对应产品中“登录用户”:计算“登录用户”数,就是计算下述API上传值的去重数
165
+ ```typescript
166
+ function profileSignIn(ID: string, provider?: string) {}
167
+ ```
168
+ | 参数 | 含义 |
169
+ | --- | --- |
170
+ | ID | 用户账号,长度小于64字节。
171
+ 该值的上传对应产品中“登录用户”:计算“登录用户”数,就是计算该用户账号的去重数 |
172
+ | provider | |
173
+
174
+
175
+ ### 用户登出
176
+ 账号登出时需调用此接口,调用之后不再发送账号相关内容。
177
+ ```typescript
178
+ function profileSignOff(ID: string, provider?: string)
179
+ ```
180
+
181
+ 示例:
182
+ ```typescript
183
+ const profileSignIn = () => {
184
+ QT.profileSignIn('用户ID');
185
+ };
186
+
187
+ const profileSignOff = () => {
188
+ QT.profileSignOff();
189
+ };
190
+ ```
191
+
192
+ ## 用户属性上传
193
+ 使用事件编码固定为"$$_user_profile"的自定义事件上传,该事件所携带的事件属性会被作为用户属性放在用户表中。
194
+ ```typescript
195
+ function sendEvent(eventId: string, params: any)
196
+ ```
197
+ | 参数 | 含义 |
198
+ | --- | --- |
199
+ | eventId | 当前统计的事件ID |
200
+ | params | 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>”对 |
201
+
202
+ 注:用户属性上传一定要在用户账号上报后。
203
+
204
+ 示例:
205
+ ```java
206
+ QT.onProfileSignIn("张三");
207
+
208
+ const user = {
209
+ gender: "male",
210
+ age: "8"
211
+ }
212
+ QT.sendEvent("$$_user_profile", user);
213
+ ```
214
+ 上述上传的业务含义为:张三 男 8岁
215
+ ## 全局属性
216
+ 全局属性为每一个事件都会携带的属性
217
+ ### 注册全局属性
218
+ ```java
219
+ function registerGlobalProperty(globalProperty: any) {}
220
+ ```
221
+ | 参数 | 含义 |
222
+ | --- | --- |
223
+ | globalProperty | 要注册的全局属性,定义为“属性名:属性值”的“<键-值>”对 |
224
+
225
+ **注意:**
226
+
227
+ 1. 属性名、string类型的属性值,只支持大小写字母、数字及下划线。
228
+ 2. 在Android中,不支持JavaScript的boolean类型,需要手动在JS中转为0、1。
229
+ 3. 在Android中,对于全局属性值为null或undefined的场景,底层Android sdk会过滤这个全局属性字段,如需要空值分析场景,需自定义默认空值
230
+ 4. 在iOS中,全局属性值不支持null和undefined,需要手动过滤。
231
+
232
+ 示例:
233
+ ```typescript
56
234
  QT.registerGlobalProperty({
57
- gparam1: 'gvalue1',
58
- gparam2: 'gvalue2' ,
59
- gparam3: 3333
60
- });
235
+ name: 'MyApp',
236
+ description: 'this is a app',
237
+ }
238
+ );
239
+ ```
61
240
 
62
- /**
63
- * 删除一个全局事件属性
64
- * @param propertyName 要删除的全局事件属性名,只支持大小写字母、数字及下划线
65
- */
66
- QT.unregisterGlobalProperty('gparam1');
241
+ ### 删除特定的全局属性
242
+ ```java
243
+ function unRegisterGlobalProperty(propertyName: string) {}
244
+ ```
245
+ | 参数 | 含义 |
246
+ | --- | --- |
247
+ | propertyName | 要删除的全局属性名 |
67
248
 
68
- /**
69
- * 根据Key获取单个全局属性
70
- * @param propertyName 属性名,只支持大小写字母、数字及下划线!
71
- */
72
- QT.getGlobalProperty('gparam1'); //返回 gvalue1
249
+ 示例:
250
+ ```typescript
251
+ QT.unregisterGlobalProperty('name'); // 删除全局属性name
252
+ ```
73
253
 
74
- /**
75
- * 获取所有的全局事件属性, 返回包含所有全局事件属性的JSONObject
76
- */
77
- QT.getGlobalProperties();
254
+ ### 获取特定的全局属性
255
+ ```java
256
+ function getGlobalProperty(propertyName: string) {}
257
+ ```
258
+ | 参数 | 含义 |
259
+ | --- | --- |
260
+ | propertyName | 要获取的全局属性名 |
78
261
 
79
- /**
80
- * 清空全部全局事件属性。
81
- */
82
- QT.clearGlobalProperties();
262
+ 示例:
263
+ ```typescript
264
+ QT.getGlobalProperty('name'); // 获取全局属性name,返回 {name: "MyApp"}
265
+ ```
83
266
 
84
- /**
85
- * 账号登录时调用此接口,用于统计应用自身的账号
86
- * @param ID 用户账号ID,长度小于64字节
87
- * @param provider 账号来源, 可选,非必传!!不能以下划线"_"开头,使用大写字母和数字标识; 如果是上市公司,建议使用股票代码
88
- */
89
- QT.profileSignIn('test_userid', 'aliyun');
267
+ ### 清除所有全局属性
268
+ ```java
269
+ function clearGlobalProperties() {}
270
+ ```
271
+ 示例:
272
+ ```tsx
273
+ QT.clearGlobalProperties(); // 所有全局属性都被清除(慎用)
274
+ ```
90
275
 
91
- /**
92
- * 账号登出时需调用此接口,调用之后不再发送账号相关内容。
93
- */
94
- QT.profileSignOff();
276
+
277
+ ## 页面浏览事件埋点
278
+ 开发者如果希望对页面路径和页面停留时长进行采集和统计。可以通过调用该接口手动埋点
279
+ ```typescript
280
+ function onPageStart(pageName: string) {}
281
+ function onPageEnd(pageName: string) {}
282
+ ```
283
+ | 参数 | 含义 |
284
+ | --- | --- |
285
+ | pageName | 自定义页面的名称 |
286
+
287
+ 示例:
288
+ ```typescript
289
+ const onPageStart = () => {
290
+ QT.onPageStart('MainPage');
291
+ };
292
+ const onPageEnd = () => {
293
+ QT.onPageEnd('MainPage');
294
+ };
295
+ ```
296
+ 注意:
297
+ onPageStart 和 onPageEnd 必须成对调用。
298
+
299
+ ## 自定义事件埋点
300
+ 自定义事件可以用于追踪用户行为,记录行为发生的具体细节。
301
+ 使用 **sendEvent **接口进行事件的统计,接口如下:
302
+ ```typescript
303
+ /**
304
+ * 自定义事件埋点
305
+ * @param eventId 当前统计的事件ID
306
+ * @param params 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>”对
307
+ */
308
+ function sendEvent(eventId: string, params: any) {}
309
+ ```
310
+ | 参数 | 含义 |
311
+ | --- | --- |
312
+ | eventId | 为当前统计的事件ID。 |
313
+ | params | 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>对”。 |
314
+
315
+ **示例:**
316
+ ```typescript
317
+ const sendEvent = () => {
318
+ QT.sendEvent('my_event', {
319
+ name: 'app_name',
320
+ options: 'xxx',
321
+ });
322
+ };
95
323
  ```
324
+ > **_备注:_**
325
+ > - 多参数类型事件能满足原来计算事件/计数事件的分析场景;
326
+ > - 对于计算型事件不同的参数类型对应不同的计算方式,总共可以分为两大类,数值型和字符型
327
+ > - 数字型:支持累加值、最大值、最小值、平均值和去重数计算
328
+ > - 字符型:支持去重数计算
329
+
330
+ 注意:
331
+ 同全局属性,事件属性在Android和iOS不同平台上,也有着类型处理的差异:
332
+
333
+ 1. 在Android中,不支持JavaScript的boolean类型,需要手动在JS中转为0、1。
334
+ 2. 在Android中,对于全局属性值为null或undefined的场景,底层Android sdk会过滤这个全局属性字段,如需要空值分析场景,需自定义默认空值
335
+ 3. 在iOS中,全局属性值不支持null和undefined,需要手动过滤。
336
+
337
+ ## RN App中嵌入h5页面
338
+ 集成:
339
+ 桥接:
340
+
341
+ # FAQ
342
+ ### 控制台提示[APLUS] -- jsbridge Android environment error, Umeng4Aplus = undefined
343
+ Umeng4Plus是桥接的环境变量,若提示undefined,说明在原生端未接入桥接功能,请找负责Android或iOS的同学对接。
344
+
96
345
 
97
346
  ## 详细文档请参考
98
347
  1. [Quicktracking iOS 集成文档](https://help.aliyun.com/document_detail/260230.html)
File without changes
@@ -1,2 +1,2 @@
1
- #Tue Nov 01 14:51:50 CST 2022
2
- gradle.version=7.4.2
1
+ #Mon Nov 14 10:38:54 CST 2022
2
+ gradle.version=7.4
@@ -28,7 +28,7 @@ import com.quick.qt.spm.SpmAgent;
28
28
  @ReactModule(name = QuicktrackingAnalyticsModuleModule.NAME)
29
29
  public class QuicktrackingAnalyticsModuleModule extends ReactContextBaseJavaModule {
30
30
  public static final String NAME = "QuicktrackingAnalyticsModule";
31
- public static final String TAG = "GlobalProperty";
31
+ public static final String TAG = "QuickTracking == ";
32
32
  private ReactApplicationContext context;
33
33
 
34
34
  public QuicktrackingAnalyticsModuleModule(ReactApplicationContext reactContext) {
@@ -77,23 +77,32 @@ public class QuicktrackingAnalyticsModuleModule extends ReactContextBaseJavaModu
77
77
  }
78
78
 
79
79
  @ReactMethod
80
- public void onEventForH5(String params) {
81
- SpmAgent.CALL(params);
80
+ public void onEventForH5(String content) {
81
+ try {
82
+ // android.util.Log.e(TAG, " " + content);
83
+ SpmAgent.CALL(content);
84
+ } catch (Exception e) {
85
+ android.util.Log.e(TAG, "桥接事件发送失败!", e);
86
+ }
82
87
  }
83
88
 
84
89
  @ReactMethod
85
- public void registerGlobalProperties(ReadableMap map) {
86
- ReadableNativeMap map2 = (ReadableNativeMap) map;
87
- Map<String, Object> map3 = map2.toHashMap();
88
- Iterator entries = map3.entrySet().iterator();
89
- Map json = new HashMap();
90
- while (entries.hasNext()) {
91
- Map.Entry entry = (Map.Entry) entries.next();
92
- String key = (String)entry.getKey();
93
- String value = (String)entry.getValue();
94
- json.put(key,value);
90
+ public void registerGlobalProperties(ReadableMap map) throws Exception {
91
+ try {
92
+ ReadableNativeMap map2 = (ReadableNativeMap) map;
93
+ Map<String, Object> map3 = map2.toHashMap();
94
+ Iterator entries = map3.entrySet().iterator();
95
+ Map globalProperties = new HashMap<String, Object>();
96
+ while (entries.hasNext()) {
97
+ Map.Entry entry = (Map.Entry) entries.next();
98
+ String key = (String)entry.getKey();
99
+ Object value = entry.getValue();
100
+ globalProperties.put(key,value);
101
+ }
102
+ QtTrackAgent.registerGlobalProperties(context, globalProperties);
103
+ } catch (Exception e) {
104
+ android.util.Log.e(TAG, "注册全局属性失败!",e);
95
105
  }
96
- QtTrackAgent.registerGlobalProperties(context, json);
97
106
  }
98
107
 
99
108
  @ReactMethod
@@ -58,13 +58,15 @@ class QT {
58
58
  QuicktrackingAnalyticsModule.onEventForH5(JSON.stringify({
59
59
  params: json,
60
60
  methodName: 'sendPV',
61
- sid: `${Date.now()}`
61
+ sid: `${Date.now()}`,
62
+ className: 'Umeng4Aplus'
62
63
  }));
63
64
  } else {
64
65
  QuicktrackingAnalyticsModule.onEventForH5(JSON.stringify({
65
66
  params: json,
66
67
  methodName: 'sendEvent',
67
- sid: `${Date.now()}`
68
+ sid: `${Date.now()}`,
69
+ className: 'Umeng4Aplus'
68
70
  }));
69
71
  }
70
72
  }
@@ -52,13 +52,15 @@ export class QT {
52
52
  QuicktrackingAnalyticsModule.onEventForH5(JSON.stringify({
53
53
  params: json,
54
54
  methodName: 'sendPV',
55
- sid: `${Date.now()}`
55
+ sid: `${Date.now()}`,
56
+ className: 'Umeng4Aplus'
56
57
  }));
57
58
  } else {
58
59
  QuicktrackingAnalyticsModule.onEventForH5(JSON.stringify({
59
60
  params: json,
60
61
  methodName: 'sendEvent',
61
- sid: `${Date.now()}`
62
+ sid: `${Date.now()}`,
63
+ className: 'Umeng4Aplus'
62
64
  }));
63
65
  }
64
66
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-quicktracking-analytics-module",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.3",
4
4
  "description": "QuickTracking ReactNative SDK",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -9,7 +9,9 @@
9
9
  "source": "src/index",
10
10
  "files": [
11
11
  "src",
12
- "lib",
12
+ "lib/commonjs/index.js",
13
+ "lib/module/index.js",
14
+ "lib/typescript/index.d.ts",
13
15
  "android",
14
16
  "ios",
15
17
  "cpp",
@@ -22,7 +24,7 @@
22
24
  "!**/__mocks__"
23
25
  ],
24
26
  "scripts": {
25
- "test": "jest",
27
+ "test": "echo \"Error: no test specified\" && exit 1",
26
28
  "typescript": "tsc --noEmit",
27
29
  "lint": "eslint \"**/*.{js,ts,tsx}\"",
28
30
  "prepare": "bob build",
@@ -34,38 +36,12 @@
34
36
  "ios",
35
37
  "android"
36
38
  ],
37
- "repository": "http://gitlab.alibaba-inc.com/dt-f2e/react-native-quicktracking-analytics-module.git",
38
39
  "author": "yuzhao,zhoujin",
39
40
  "license": "MIT",
40
41
  "homepage": "https://www.aliyun.com/product/man?scm=20140722.S_product%40%40%E4%BA%91%E4%BA%A7%E5%93%81%40%40125428._.ID_product%40%40%E4%BA%91%E4%BA%A7%E5%93%81%40%40125428-RL_quicktracking-LOC_main-OR_ser-V_2-P0_1",
41
42
  "publishConfig": {
42
43
  "registry": "https://registry.npmjs.org/"
43
44
  },
44
- "devDependencies": {
45
- "@arkweid/lefthook": "^0.7.7",
46
- "@babel/eslint-parser": "^7.18.2",
47
- "@commitlint/config-conventional": "^17.0.2",
48
- "@react-native-community/eslint-config": "^3.0.2",
49
- "@release-it/conventional-changelog": "^5.0.0",
50
- "@types/jest": "^28.1.2",
51
- "@types/react": "~17.0.21",
52
- "@types/react-native": "0.68.0",
53
- "commitlint": "^17.0.2",
54
- "eslint": "^8.4.1",
55
- "eslint-config-prettier": "^8.5.0",
56
- "eslint-plugin-prettier": "^4.0.0",
57
- "jest": "^28.1.1",
58
- "pod-install": "^0.1.0",
59
- "prettier": "^2.0.5",
60
- "react": "17.0.2",
61
- "react-native": "0.68.2",
62
- "react-native-builder-bob": "^0.18.3",
63
- "release-it": "^15.0.0",
64
- "typescript": "^4.5.2"
65
- },
66
- "resolutions": {
67
- "@types/react": "17.0.21"
68
- },
69
45
  "peerDependencies": {
70
46
  "react": "*",
71
47
  "react-native": "*"
package/src/index.tsx CHANGED
@@ -54,6 +54,7 @@ export class QT {
54
54
  params: json,
55
55
  methodName: 'sendPV',
56
56
  sid: `${Date.now()}`,
57
+ className: 'Umeng4Aplus',
57
58
  })
58
59
  );
59
60
  } else {
@@ -62,6 +63,7 @@ export class QT {
62
63
  params: json,
63
64
  methodName: 'sendEvent',
64
65
  sid: `${Date.now()}`,
66
+ className: 'Umeng4Aplus',
65
67
  })
66
68
  );
67
69
  }
@@ -1 +0,0 @@
1
- {"version":3,"names":["QuicktrackingAnalyticsModule","NativeModules","QT","onPageStart","pageName","onPageEnd","sendEvent","eventId","params","onEventObject","onEvent","sendEventForH5","data","json","JSON","parse","Platform","OS","sdkArgs","id","ap","cusp","Object","assign","onEventForH5","stringify","methodName","sid","Date","now","e","console","log","registerGlobalProperty","gp","registerGlobalProperties","unregisterGlobalProperty","propertyName","getGlobalProperty","value","getGlobalProperties","clearGlobalProperties","profileSignIn","ID","Provider","profileSignInWithProvider","profileSignOff"],"sources":["index.tsx"],"sourcesContent":["import { NativeModules, Platform } from 'react-native';\nconst QuicktrackingAnalyticsModule = NativeModules.QuicktrackingAnalyticsModule;\n/**\n *引入 QuickTracking SDK\n */\nexport class QT {\n /**\n * 页面浏览事件埋点-打开页面\n * @param pageName 页面名称\n */\n static onPageStart(pageName: string) {\n QuicktrackingAnalyticsModule.onPageStart(pageName);\n }\n\n /**\n * 页面浏览事件埋点-离开页面\n * @param pageName 页面名称\n */\n static onPageEnd(pageName: string) {\n QuicktrackingAnalyticsModule.onPageEnd(pageName);\n }\n\n /**\n * 自定义事件埋点\n * @param eventId 当前统计的事件ID\n * @param params 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>”对\n */\n static sendEvent(eventId: string, params: any) {\n if (params) {\n QuicktrackingAnalyticsModule.onEventObject(eventId, params);\n } else {\n QuicktrackingAnalyticsModule.onEvent(eventId);\n }\n }\n\n /**\n * 桥接事件埋点\n * @param data H5转发事件的日志体\n */\n static sendEventForH5(data: string) {\n try {\n const json = JSON.parse(data);\n if (Platform.OS === 'ios') {\n const eventId = json.sdkArgs && json.sdkArgs.id;\n let params: any = {};\n params.ap = json.ap || {};\n params.cusp = json.cusp || {};\n params = Object.assign(params, json.sdkArgs);\n QuicktrackingAnalyticsModule.onEventForH5(eventId, params);\n } else if (Platform.OS === 'android') {\n if (json.sdkArgs.id === '$$_page_start') {\n QuicktrackingAnalyticsModule.onEventForH5(\n JSON.stringify({\n params: json,\n methodName: 'sendPV',\n sid: `${Date.now()}`,\n })\n );\n } else {\n QuicktrackingAnalyticsModule.onEventForH5(\n JSON.stringify({\n params: json,\n methodName: 'sendEvent',\n sid: `${Date.now()}`,\n })\n );\n }\n }\n } catch (e) {\n console.log(e);\n }\n }\n\n /**\n * 注册一个全局事件属性\n * @param property 要注册的全局属性\n * @description 注册全局属性后,后续触发的所有事件都将自动包含这些属性;\n * 且这些属性及属性值存入缓存,APP退出后清除。\n * 在分析数据时,可根据此属性进行查看和筛选。\n */\n static registerGlobalProperty(gp: any) {\n if (Platform.OS === 'ios') {\n QuicktrackingAnalyticsModule.registerGlobalProperty(gp);\n } else {\n QuicktrackingAnalyticsModule.registerGlobalProperties(gp);\n }\n }\n\n /**\n * 删除一个全局事件属性\n * @param propertyName 要删除的全局事件属性名,只支持大小写字母、数字及下划线\n */\n static unregisterGlobalProperty(propertyName: string) {\n QuicktrackingAnalyticsModule.unregisterGlobalProperty(propertyName);\n }\n\n /**\n * 根据Key获取单个全局属性\n * @param propertyName 属性名,只支持大小写字母、数字及下划线!\n */\n static async getGlobalProperty(propertyName: string) {\n try {\n const value = await QuicktrackingAnalyticsModule.getGlobalProperty(\n propertyName\n );\n return value;\n } catch (e) {\n console.log(e);\n }\n }\n\n /**\n * 获取所有的全局事件属性, 返回包含所有全局事件属性的JSONObject\n */\n static async getGlobalProperties() {\n try {\n const gp = await QuicktrackingAnalyticsModule.getGlobalProperties();\n return gp;\n } catch (e) {\n console.log(e);\n }\n }\n\n /**\n * 清空全部全局事件属性。\n */\n static clearGlobalProperties() {\n QuicktrackingAnalyticsModule.clearGlobalProperties();\n }\n\n /**\n * 账号登录时调用此接口,用于统计应用自身的账号\n * @param ID 用户账号ID,长度小于64字节\n * @param provider\n */\n static profileSignIn(ID: string, Provider?: string) {\n switch (Platform.OS) {\n case 'android': {\n if (Provider) {\n QuicktrackingAnalyticsModule.profileSignInWithProvider(ID, Provider);\n } else {\n QuicktrackingAnalyticsModule.profileSignIn(ID);\n }\n break;\n }\n case 'ios': {\n if (Provider) {\n QuicktrackingAnalyticsModule.profileSignIn(ID);\n } else {\n QuicktrackingAnalyticsModule.profileSignIn(ID, null);\n }\n break;\n }\n }\n }\n\n /**\n * 账号登出时需调用此接口,调用之后不再发送账号相关内容。\n */\n static profileSignOff() {\n QuicktrackingAnalyticsModule.profileSignOff();\n }\n // /**\n // * 自定义事件埋点\n // * @param eventId 当前统计的事件ID\n // * @param eventLabel 分类标签\n // */\n // static sendEventLabel(eventId: string, eventLabel: string) {\n // return QuicktrackingAnalyticsModule.sendEventLabel(eventId, eventLabel);\n // }\n\n // /**\n // * 自定义事件埋点\n // * @param eventId 当前统计的事件ID\n // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:\"Jack\",gender:\"man\"}\n // */\n // static sendEventMap(eventId: string, eventData: Object) {\n // return QuicktrackingAnalyticsModule.sendEventMap(eventId, eventData);\n // }\n\n // /**\n // * 自定义事件埋点\n // * @param eventId 当前统计的事件ID\n // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:\"Jack\",gender:\"man\"}\n // * @param eventNum 用户每次触发的数值的分布情况,如事件持续时间、每次付款金额等\n // */\n // static sendEventMapAndCount(\n // eventId: string,\n // eventData: Object,\n // eventNum: number\n // ) {\n // return QuicktrackingAnalyticsModule.sendEventMapAndCount(\n // eventId,\n // eventData,\n // eventNum\n // );\n // }\n\n // /**\n // * 自定义事件埋点\n // * @param eventId 当前统计的事件ID\n // * @param eventData 为当前事件的属性和取值(键值对),不能为空,值可以是对象\n // */\n // static sendEventObject(eventId: string, eventData: Object) {\n // return QuicktrackingAnalyticsModule.sendEventObject(eventId, eventData);\n // }\n\n // /**\n // * 设置关注事件是否触发\n // * @param eventList 事件list\n // */\n // static setFirstLaunchEvent<T>(eventList: Array<T>) {\n // return QuicktrackingAnalyticsModule.setFirstLaunchEvent(eventList);\n // }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["NativeModules","Platform","QuicktrackingAnalyticsModule","QT","onPageStart","pageName","onPageEnd","sendEvent","eventId","params","onEventObject","onEvent","sendEventForH5","data","json","JSON","parse","OS","sdkArgs","id","ap","cusp","Object","assign","onEventForH5","stringify","methodName","sid","Date","now","e","console","log","registerGlobalProperty","gp","registerGlobalProperties","unregisterGlobalProperty","propertyName","getGlobalProperty","value","getGlobalProperties","clearGlobalProperties","profileSignIn","ID","Provider","profileSignInWithProvider","profileSignOff"],"sources":["index.tsx"],"sourcesContent":["import { NativeModules, Platform } from 'react-native';\nconst QuicktrackingAnalyticsModule = NativeModules.QuicktrackingAnalyticsModule;\n/**\n *引入 QuickTracking SDK\n */\nexport class QT {\n /**\n * 页面浏览事件埋点-打开页面\n * @param pageName 页面名称\n */\n static onPageStart(pageName: string) {\n QuicktrackingAnalyticsModule.onPageStart(pageName);\n }\n\n /**\n * 页面浏览事件埋点-离开页面\n * @param pageName 页面名称\n */\n static onPageEnd(pageName: string) {\n QuicktrackingAnalyticsModule.onPageEnd(pageName);\n }\n\n /**\n * 自定义事件埋点\n * @param eventId 当前统计的事件ID\n * @param params 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>”对\n */\n static sendEvent(eventId: string, params: any) {\n if (params) {\n QuicktrackingAnalyticsModule.onEventObject(eventId, params);\n } else {\n QuicktrackingAnalyticsModule.onEvent(eventId);\n }\n }\n\n /**\n * 桥接事件埋点\n * @param data H5转发事件的日志体\n */\n static sendEventForH5(data: string) {\n try {\n const json = JSON.parse(data);\n if (Platform.OS === 'ios') {\n const eventId = json.sdkArgs && json.sdkArgs.id;\n let params: any = {};\n params.ap = json.ap || {};\n params.cusp = json.cusp || {};\n params = Object.assign(params, json.sdkArgs);\n QuicktrackingAnalyticsModule.onEventForH5(eventId, params);\n } else if (Platform.OS === 'android') {\n if (json.sdkArgs.id === '$$_page_start') {\n QuicktrackingAnalyticsModule.onEventForH5(\n JSON.stringify({\n params: json,\n methodName: 'sendPV',\n sid: `${Date.now()}`,\n })\n );\n } else {\n QuicktrackingAnalyticsModule.onEventForH5(\n JSON.stringify({\n params: json,\n methodName: 'sendEvent',\n sid: `${Date.now()}`,\n })\n );\n }\n }\n } catch (e) {\n console.log(e);\n }\n }\n\n /**\n * 注册一个全局事件属性\n * @param property 要注册的全局属性\n * @description 注册全局属性后,后续触发的所有事件都将自动包含这些属性;\n * 且这些属性及属性值存入缓存,APP退出后清除。\n * 在分析数据时,可根据此属性进行查看和筛选。\n */\n static registerGlobalProperty(gp: any) {\n if (Platform.OS === 'ios') {\n QuicktrackingAnalyticsModule.registerGlobalProperty(gp);\n } else {\n QuicktrackingAnalyticsModule.registerGlobalProperties(gp);\n }\n }\n\n /**\n * 删除一个全局事件属性\n * @param propertyName 要删除的全局事件属性名,只支持大小写字母、数字及下划线\n */\n static unregisterGlobalProperty(propertyName: string) {\n QuicktrackingAnalyticsModule.unregisterGlobalProperty(propertyName);\n }\n\n /**\n * 根据Key获取单个全局属性\n * @param propertyName 属性名,只支持大小写字母、数字及下划线!\n */\n static async getGlobalProperty(propertyName: string) {\n try {\n const value = await QuicktrackingAnalyticsModule.getGlobalProperty(\n propertyName\n );\n return value;\n } catch (e) {\n console.log(e);\n }\n }\n\n /**\n * 获取所有的全局事件属性, 返回包含所有全局事件属性的JSONObject\n */\n static async getGlobalProperties() {\n try {\n const gp = await QuicktrackingAnalyticsModule.getGlobalProperties();\n return gp;\n } catch (e) {\n console.log(e);\n }\n }\n\n /**\n * 清空全部全局事件属性。\n */\n static clearGlobalProperties() {\n QuicktrackingAnalyticsModule.clearGlobalProperties();\n }\n\n /**\n * 账号登录时调用此接口,用于统计应用自身的账号\n * @param ID 用户账号ID,长度小于64字节\n * @param provider\n */\n static profileSignIn(ID: string, Provider?: string) {\n switch (Platform.OS) {\n case 'android': {\n if (Provider) {\n QuicktrackingAnalyticsModule.profileSignInWithProvider(ID, Provider);\n } else {\n QuicktrackingAnalyticsModule.profileSignIn(ID);\n }\n break;\n }\n case 'ios': {\n if (Provider) {\n QuicktrackingAnalyticsModule.profileSignIn(ID);\n } else {\n QuicktrackingAnalyticsModule.profileSignIn(ID, null);\n }\n break;\n }\n }\n }\n\n /**\n * 账号登出时需调用此接口,调用之后不再发送账号相关内容。\n */\n static profileSignOff() {\n QuicktrackingAnalyticsModule.profileSignOff();\n }\n // /**\n // * 自定义事件埋点\n // * @param eventId 当前统计的事件ID\n // * @param eventLabel 分类标签\n // */\n // static sendEventLabel(eventId: string, eventLabel: string) {\n // return QuicktrackingAnalyticsModule.sendEventLabel(eventId, eventLabel);\n // }\n\n // /**\n // * 自定义事件埋点\n // * @param eventId 当前统计的事件ID\n // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:\"Jack\",gender:\"man\"}\n // */\n // static sendEventMap(eventId: string, eventData: Object) {\n // return QuicktrackingAnalyticsModule.sendEventMap(eventId, eventData);\n // }\n\n // /**\n // * 自定义事件埋点\n // * @param eventId 当前统计的事件ID\n // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:\"Jack\",gender:\"man\"}\n // * @param eventNum 用户每次触发的数值的分布情况,如事件持续时间、每次付款金额等\n // */\n // static sendEventMapAndCount(\n // eventId: string,\n // eventData: Object,\n // eventNum: number\n // ) {\n // return QuicktrackingAnalyticsModule.sendEventMapAndCount(\n // eventId,\n // eventData,\n // eventNum\n // );\n // }\n\n // /**\n // * 自定义事件埋点\n // * @param eventId 当前统计的事件ID\n // * @param eventData 为当前事件的属性和取值(键值对),不能为空,值可以是对象\n // */\n // static sendEventObject(eventId: string, eventData: Object) {\n // return QuicktrackingAnalyticsModule.sendEventObject(eventId, eventData);\n // }\n\n // /**\n // * 设置关注事件是否触发\n // * @param eventList 事件list\n // */\n // static setFirstLaunchEvent<T>(eventList: Array<T>) {\n // return QuicktrackingAnalyticsModule.setFirstLaunchEvent(eventList);\n // }\n}\n"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AACtD,MAAMC,4BAA4B,GAAGF,aAAa,CAACE,4BAA4B;AAC/E;AACA;AACA;AACA,OAAO,MAAMC,EAAE,CAAC;EACd;AACF;AACA;AACA;EACE,OAAOC,WAAW,CAACC,QAAgB,EAAE;IACnCH,4BAA4B,CAACE,WAAW,CAACC,QAAQ,CAAC;EACpD;;EAEA;AACF;AACA;AACA;EACE,OAAOC,SAAS,CAACD,QAAgB,EAAE;IACjCH,4BAA4B,CAACI,SAAS,CAACD,QAAQ,CAAC;EAClD;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOE,SAAS,CAACC,OAAe,EAAEC,MAAW,EAAE;IAC7C,IAAIA,MAAM,EAAE;MACVP,4BAA4B,CAACQ,aAAa,CAACF,OAAO,EAAEC,MAAM,CAAC;IAC7D,CAAC,MAAM;MACLP,4BAA4B,CAACS,OAAO,CAACH,OAAO,CAAC;IAC/C;EACF;;EAEA;AACF;AACA;AACA;EACE,OAAOI,cAAc,CAACC,IAAY,EAAE;IAClC,IAAI;MACF,MAAMC,IAAI,GAAGC,IAAI,CAACC,KAAK,CAACH,IAAI,CAAC;MAC7B,IAAIZ,QAAQ,CAACgB,EAAE,KAAK,KAAK,EAAE;QACzB,MAAMT,OAAO,GAAGM,IAAI,CAACI,OAAO,IAAIJ,IAAI,CAACI,OAAO,CAACC,EAAE;QAC/C,IAAIV,MAAW,GAAG,CAAC,CAAC;QACpBA,MAAM,CAACW,EAAE,GAAGN,IAAI,CAACM,EAAE,IAAI,CAAC,CAAC;QACzBX,MAAM,CAACY,IAAI,GAAGP,IAAI,CAACO,IAAI,IAAI,CAAC,CAAC;QAC7BZ,MAAM,GAAGa,MAAM,CAACC,MAAM,CAACd,MAAM,EAAEK,IAAI,CAACI,OAAO,CAAC;QAC5ChB,4BAA4B,CAACsB,YAAY,CAAChB,OAAO,EAAEC,MAAM,CAAC;MAC5D,CAAC,MAAM,IAAIR,QAAQ,CAACgB,EAAE,KAAK,SAAS,EAAE;QACpC,IAAIH,IAAI,CAACI,OAAO,CAACC,EAAE,KAAK,eAAe,EAAE;UACvCjB,4BAA4B,CAACsB,YAAY,CACvCT,IAAI,CAACU,SAAS,CAAC;YACbhB,MAAM,EAAEK,IAAI;YACZY,UAAU,EAAE,QAAQ;YACpBC,GAAG,EAAG,GAAEC,IAAI,CAACC,GAAG,EAAG;UACrB,CAAC,CAAC,CACH;QACH,CAAC,MAAM;UACL3B,4BAA4B,CAACsB,YAAY,CACvCT,IAAI,CAACU,SAAS,CAAC;YACbhB,MAAM,EAAEK,IAAI;YACZY,UAAU,EAAE,WAAW;YACvBC,GAAG,EAAG,GAAEC,IAAI,CAACC,GAAG,EAAG;UACrB,CAAC,CAAC,CACH;QACH;MACF;IACF,CAAC,CAAC,OAAOC,CAAC,EAAE;MACVC,OAAO,CAACC,GAAG,CAACF,CAAC,CAAC;IAChB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAOG,sBAAsB,CAACC,EAAO,EAAE;IACrC,IAAIjC,QAAQ,CAACgB,EAAE,KAAK,KAAK,EAAE;MACzBf,4BAA4B,CAAC+B,sBAAsB,CAACC,EAAE,CAAC;IACzD,CAAC,MAAM;MACLhC,4BAA4B,CAACiC,wBAAwB,CAACD,EAAE,CAAC;IAC3D;EACF;;EAEA;AACF;AACA;AACA;EACE,OAAOE,wBAAwB,CAACC,YAAoB,EAAE;IACpDnC,4BAA4B,CAACkC,wBAAwB,CAACC,YAAY,CAAC;EACrE;;EAEA;AACF;AACA;AACA;EACE,aAAaC,iBAAiB,CAACD,YAAoB,EAAE;IACnD,IAAI;MACF,MAAME,KAAK,GAAG,MAAMrC,4BAA4B,CAACoC,iBAAiB,CAChED,YAAY,CACb;MACD,OAAOE,KAAK;IACd,CAAC,CAAC,OAAOT,CAAC,EAAE;MACVC,OAAO,CAACC,GAAG,CAACF,CAAC,CAAC;IAChB;EACF;;EAEA;AACF;AACA;EACE,aAAaU,mBAAmB,GAAG;IACjC,IAAI;MACF,MAAMN,EAAE,GAAG,MAAMhC,4BAA4B,CAACsC,mBAAmB,EAAE;MACnE,OAAON,EAAE;IACX,CAAC,CAAC,OAAOJ,CAAC,EAAE;MACVC,OAAO,CAACC,GAAG,CAACF,CAAC,CAAC;IAChB;EACF;;EAEA;AACF;AACA;EACE,OAAOW,qBAAqB,GAAG;IAC7BvC,4BAA4B,CAACuC,qBAAqB,EAAE;EACtD;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOC,aAAa,CAACC,EAAU,EAAEC,QAAiB,EAAE;IAClD,QAAQ3C,QAAQ,CAACgB,EAAE;MACjB,KAAK,SAAS;QAAE;UACd,IAAI2B,QAAQ,EAAE;YACZ1C,4BAA4B,CAAC2C,yBAAyB,CAACF,EAAE,EAAEC,QAAQ,CAAC;UACtE,CAAC,MAAM;YACL1C,4BAA4B,CAACwC,aAAa,CAACC,EAAE,CAAC;UAChD;UACA;QACF;MACA,KAAK,KAAK;QAAE;UACV,IAAIC,QAAQ,EAAE;YACZ1C,4BAA4B,CAACwC,aAAa,CAACC,EAAE,CAAC;UAChD,CAAC,MAAM;YACLzC,4BAA4B,CAACwC,aAAa,CAACC,EAAE,EAAE,IAAI,CAAC;UACtD;UACA;QACF;IAAC;EAEL;;EAEA;AACF;AACA;EACE,OAAOG,cAAc,GAAG;IACtB5C,4BAA4B,CAAC4C,cAAc,EAAE;EAC/C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;AACF"}