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

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,8 +1,8 @@
1
- # 集成
2
- QT React Native 埋点SDK是基于Quick Tracking 原生客户端SDK上的扩展,封装了埋点常用的api,如全局属性、页面属性、自定义事件等,需要分别在RN、Android、iOS三端做集成。
1
+ # 集成说明
2
+ > QuickTracking React Native SDK是基于QuickTracking 原生客户端埋点SDK上的扩展,封装了QT埋点常用的api,如全局属性、页面属性、自定义事件等,需要分别在RN、Android、iOS三端做集成。
3
3
 
4
- ## React Native 集成
5
- ### 下载npm包到项目中
4
+ # React Native SDK集成
5
+ ## 下载npm包到项目中
6
6
  ```bash
7
7
  # npm
8
8
  npm install react-native-quicktracking-analytics-module
@@ -13,20 +13,18 @@ yarn add react-native-quicktracking-analytics-module
13
13
  # pnpm
14
14
  pnpm add react-native-quicktracking-analytics-module
15
15
  ```
16
-
17
- ### 引入QT类
16
+ ## 引入SDK环境变量
18
17
  ```tsx
19
18
  import { QT } from "react-native-quicktracking-analytics-module";
20
19
  ```
21
-
22
- ## Android 集成
20
+ ## Android 基座集成
23
21
  ### 进入控制台
24
22
  进入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
+ ![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=VqtE7&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)
26
24
 
27
25
  ### 集成应用
28
26
  找到需要集成埋点的应用:进入“应用列表”,选择所需组织,点击操作中的“详情或者去集成”
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)
27
+ ![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2022/png/64356327/1668567046473-aab9b13d-38fe-4e33-bd03-e5bedc69b0e4.png#clientId=uf7b76841-8b1b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=602&id=ub77f00bf&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1204&originWidth=2562&originalType=binary&ratio=1&rotation=0&showTitle=false&size=646074&status=done&style=none&taskId=ube368388-293d-4ce2-a7ad-9aca1566a87&title=&width=1281)
30
28
 
31
29
  ### Maven地址配置
32
30
  在工程 build.gradle 配置脚本中 buildscript 和 allprojects 段中添加 sdk maven 仓库地址
@@ -151,19 +149,122 @@ QtConfigure.init(this,"appkey","unknown",UMConfigure.DEVICE_TYPE_PHONE, "");
151
149
  ```
152
150
 
153
151
 
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)
152
+ ## iOS 基座集成
153
+ ### 使用CocoaPods集成
154
+ 进入iOS工程目录
155
+ ```shell
156
+ cd ios && pod install && cd ..
157
+ ```
158
+ ### SDK初始化并集成appKey
159
+ 为保证您的App在集成统计SDK之后,能够满足工信部相关合规要求,您应确保App首次冷启动时,在用户阅读您的《隐私政策》并取得用户授权之后,才调用正式初始化函数初始化统计SDK,此时SDK才会真正采集设备信息并上报数据。反之,如果用户不同意《隐私政策》授权,则不能调用初始化函数
160
+ ```objectivec
161
+ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
162
+ {
163
+ ...
164
+ /** 初始化所有组件产品
165
+ @param appKey 开发者在QT申请的appkey.
166
+ @param channel 渠道标识,可设置nil表示"App Store".
167
+ */
168
+ [QTConfigure initWithAppkey:@"应用的appKey" channel:@"安装渠道"];
169
+ ...
170
+ return YES;
171
+ }
172
+ ```
173
+ 一旦App获取到《隐私政策》的用户授权,后续的App冷启动,开发者应该保证调用到初始化函数。
174
+ ### 配置收数域名
175
+ ```objectivec
176
+ #import <QTCommon/UMConfigure.h>
177
+
178
+ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
179
+ {
180
+ ...
181
+ /** 设置上报统计日志的主域名和备用域名。此函数必须在SDK初始化函数调用之前调用。
182
+ @param primaryDomain 传日志的主域名收数地址,参数不能为null或者空串。例如:https://www.umeng.com
183
+ @param standbyDomain 上传日志备用域名收数地址,参数可以为null或者空串,若此参数为空,SDK内部会自动将主域名设置为备用域名。
184
+ */
185
+
186
+ [QTConfigure setCustomDomain:@"主收数域名" standbyDomain:@"备用收数域名"];
187
+ ...
188
+ return YES;
189
+ }
190
+ ```
191
+ ### 按需引入日志组件
192
+ 引入统计所需组件库(在更新SDK时,您可以直接使用 pod update 命令进行直接更新)
193
+ ```objectivec
194
+ pod 'UMCCommonLog'
195
+ ```
196
+ Podfile示例
197
+ ![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2022/png/281773/1668518339815-d4ccb536-a399-4341-ba2c-902dcf24b1da.png#clientId=uf686b11a-7b20-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=564&id=u6a3e4c24&margin=%5Bobject%20Object%5D&name=image.png&originHeight=571&originWidth=751&originalType=binary&ratio=1&rotation=0&showTitle=false&size=80695&status=done&style=none&taskId=ub00bc826-f430-4519-9921-c4040b208a7&title=&width=741.5)
198
+ 开启日志打印
199
+ ```objectivec
200
+ #import <QTCommon/UMConfigure.h>
201
+ #import <UMCommonLog/UMCommonLogHeaders.h>
202
+
203
+ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
204
+ {
205
+ ...
206
+ [UMCommonLogManager setUpUMCommonLogManager];
207
+ [QTConfigure setLogEnabled:YES];
208
+ ...
209
+ return YES;
210
+ }
211
+ ```
212
+ ### 埋点验证配置
213
+ 添加您的 URL Scheme 到项目中,URL Scheme 位于项目设置 target -> 选项卡 Info - > URL Types。
214
+ 填入的scheme:atm.yourappkey。
215
+ ![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2022/png/281773/1668518096477-d9471acb-e7d0-4bba-8590-15891559b6b6.png#clientId=uf686b11a-7b20-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=412&id=ub7bbb0cc&margin=%5Bobject%20Object%5D&name=image.png&originHeight=823&originWidth=1366&originalType=binary&ratio=1&rotation=0&showTitle=false&size=127257&status=done&style=none&taskId=u9c88f1a5-85f6-4db1-a079-1dbef87724e&title=&width=683)
216
+ 在AppDelegate中调用函数[QTMobClick handleUrl:url]来接收 URL
217
+ ```objectivec
218
+ - (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
219
+ {
220
+ if ([QTMobClick handleUrl:url]) {
221
+ return YES;
222
+ }
223
+ return YES;
224
+ }
157
225
 
226
+ ```
227
+ # 埋点API
228
+ ## SDK初始化
229
+ ### 预初始化
230
+ SDK预初始化函数不会采集设备信息,也不会向QT后台上报数据。
158
231
 
232
+ preInit预初始化函数耗时极少,不会影响App首次冷启动用户体验。
233
+
234
+ 注意:该函数仅在Android环境调用,需要手动判断 Platform.OS === 'android'
235
+ ```typescript
236
+ function preInit(appKey: string): void
237
+ ```
238
+ | 参数 | 含义 |
239
+ | --- | --- |
240
+ | appKey | QT后台提供的唯一应用key值 |
241
+
242
+ ### 正式初始化
243
+ 务必调用,请务必在用户同意隐私政策后,再初始化SDK。
244
+ ```typescript
245
+ function init(appKey: string): void
246
+ ```
247
+ | 参数 | 含义 |
248
+ | --- | --- |
249
+ | appKey | QT后台提供的唯一应用key值 |
250
+
251
+
252
+ ### 示例
253
+ ```typescript
254
+ const initSDK = () => {
255
+ if (Platform.OS === 'android') {
256
+ QT.preInit('appkey', 'quicktracking');
257
+ }
258
+ QT.init('appkey', 'quicktracking');
259
+ };
260
+ ```
159
261
 
160
262
 
161
- # 埋点
162
263
  ## 用户账号上报
163
264
  ### 用户登录
164
265
  该值的上传对应产品中“登录用户”:计算“登录用户”数,就是计算下述API上传值的去重数
165
266
  ```typescript
166
- function profileSignIn(ID: string, provider?: string) {}
267
+ function profileSignIn(ID: string, provider?: string): void
167
268
  ```
168
269
  | 参数 | 含义 |
169
270
  | --- | --- |
@@ -175,24 +276,19 @@ function profileSignIn(ID: string, provider?: string) {}
175
276
  ### 用户登出
176
277
  账号登出时需调用此接口,调用之后不再发送账号相关内容。
177
278
  ```typescript
178
- function profileSignOff(ID: string, provider?: string)
279
+ function profileSignOff(): void
179
280
  ```
180
281
 
181
282
  示例:
182
283
  ```typescript
183
- const profileSignIn = () => {
184
- QT.profileSignIn('用户ID');
185
- };
186
-
187
- const profileSignOff = () => {
188
- QT.profileSignOff();
189
- };
284
+ QT.profileSignIn('用户ID');
285
+ QT.profileSignOff();
190
286
  ```
191
287
 
192
288
  ## 用户属性上传
193
289
  使用事件编码固定为"$$_user_profile"的自定义事件上传,该事件所携带的事件属性会被作为用户属性放在用户表中。
194
290
  ```typescript
195
- function sendEvent(eventId: string, params: any)
291
+ function sendEvent(eventId: string, params: any): void
196
292
  ```
197
293
  | 参数 | 含义 |
198
294
  | --- | --- |
@@ -216,31 +312,34 @@ QT.sendEvent("$$_user_profile", user);
216
312
  全局属性为每一个事件都会携带的属性
217
313
  ### 注册全局属性
218
314
  ```java
219
- function registerGlobalProperty(globalProperty: any) {}
315
+ function registerGlobalProperty(globalProperty: any): void
220
316
  ```
221
317
  | 参数 | 含义 |
222
318
  | --- | --- |
223
- | globalProperty | 要注册的全局属性,定义为“属性名:属性值”的“<键-值>”对 |
319
+ | globalProperty | 要注册的全局属性,定义为“属性名:属性值”的“<键-值>”对。为单层对象结构,不支持多层嵌套。 |
224
320
 
225
321
  **注意:**
226
322
 
227
323
  1. 属性名、string类型的属性值,只支持大小写字母、数字及下划线。
228
- 2. 在Android中,不支持JavaScript的boolean类型,需要手动在JS中转为0、1。
324
+ 2. 在Android中,属性值不支持JavaScript的boolean类型,需要手动在JS中转为0、1。
229
325
  3. 在Android中,对于全局属性值为null或undefined的场景,底层Android sdk会过滤这个全局属性字段,如需要空值分析场景,需自定义默认空值
230
326
  4. 在iOS中,全局属性值不支持null和undefined,需要手动过滤。
231
327
 
232
328
  示例:
233
329
  ```typescript
234
330
  QT.registerGlobalProperty({
235
- name: 'MyApp',
236
- description: 'this is a app',
237
- }
238
- );
331
+ name: 'MyApp',
332
+ description: 'this is a app',
333
+ aBoolean: 1, //boolean类型需传为0或1,
334
+ aNull: '', //null或undefined类型需传空字符串
335
+ //默认为number类型,对于返回值为null或undefined场景,需业务自定义数值型默认空值
336
+ aNumber: 66,
337
+ });
239
338
  ```
240
339
 
241
340
  ### 删除特定的全局属性
242
341
  ```java
243
- function unRegisterGlobalProperty(propertyName: string) {}
342
+ function unregisterGlobalProperty(propertyName: string): void
244
343
  ```
245
344
  | 参数 | 含义 |
246
345
  | --- | --- |
@@ -253,7 +352,7 @@ function unRegisterGlobalProperty(propertyName: string) {}
253
352
 
254
353
  ### 获取特定的全局属性
255
354
  ```java
256
- function getGlobalProperty(propertyName: string) {}
355
+ async function getGlobalProperty(propertyName: string): Promise<any>
257
356
  ```
258
357
  | 参数 | 含义 |
259
358
  | --- | --- |
@@ -261,12 +360,23 @@ function getGlobalProperty(propertyName: string) {}
261
360
 
262
361
  示例:
263
362
  ```typescript
264
- QT.getGlobalProperty('name'); // 获取全局属性name,返回 {name: "MyApp"}
363
+ await QT.getGlobalProperty('name'); // 获取全局属性name,返回 {name: "MyApp"}
265
364
  ```
266
365
 
366
+ ### 获取所有全局属性
367
+ ```java
368
+ async function getGlobalProperties(propertyName: string): Promise<any>
369
+ ```
370
+
371
+ 示例:
372
+ ```typescript
373
+ await QT.getGlobalProperties(); // 获取所有全局属性
374
+ ```
375
+
376
+
267
377
  ### 清除所有全局属性
268
378
  ```java
269
- function clearGlobalProperties() {}
379
+ function clearGlobalProperties(): void
270
380
  ```
271
381
  示例:
272
382
  ```tsx
@@ -277,8 +387,8 @@ QT.clearGlobalProperties(); // 所有全局属性都被清除(慎用)
277
387
  ## 页面浏览事件埋点
278
388
  开发者如果希望对页面路径和页面停留时长进行采集和统计。可以通过调用该接口手动埋点
279
389
  ```typescript
280
- function onPageStart(pageName: string) {}
281
- function onPageEnd(pageName: string) {}
390
+ function onPageStart(pageName: string): void
391
+ function onPageEnd(pageName: string): void
282
392
  ```
283
393
  | 参数 | 含义 |
284
394
  | --- | --- |
@@ -286,12 +396,8 @@ function onPageEnd(pageName: string) {}
286
396
 
287
397
  示例:
288
398
  ```typescript
289
- const onPageStart = () => {
290
- QT.onPageStart('MainPage');
291
- };
292
- const onPageEnd = () => {
293
- QT.onPageEnd('MainPage');
294
- };
399
+ QT.onPageStart('MainPage');
400
+ QT.onPageEnd('MainPage');
295
401
  ```
296
402
  注意:
297
403
  onPageStart 和 onPageEnd 必须成对调用。
@@ -305,21 +411,19 @@ onPageStart 和 onPageEnd 必须成对调用。
305
411
  * @param eventId 当前统计的事件ID
306
412
  * @param params 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>”对
307
413
  */
308
- function sendEvent(eventId: string, params: any) {}
414
+ function sendEvent(eventId: string, params: any): void
309
415
  ```
310
416
  | 参数 | 含义 |
311
417
  | --- | --- |
312
418
  | eventId | 为当前统计的事件ID。 |
313
- | params | 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>对”。 |
419
+ | params | 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>对”。为单层对象结构,不支持多层嵌套。 |
314
420
 
315
421
  **示例:**
316
422
  ```typescript
317
- const sendEvent = () => {
318
- QT.sendEvent('my_event', {
319
- name: 'app_name',
320
- options: 'xxx',
321
- });
322
- };
423
+ QT.sendEvent('my_event', {
424
+ name: 'app_name',
425
+ options: 'xxx',
426
+ });
323
427
  ```
324
428
  > **_备注:_**
325
429
  > - 多参数类型事件能满足原来计算事件/计数事件的分析场景;
@@ -334,19 +438,116 @@ const sendEvent = () => {
334
438
  2. 在Android中,对于全局属性值为null或undefined的场景,底层Android sdk会过滤这个全局属性字段,如需要空值分析场景,需自定义默认空值
335
439
  3. 在iOS中,全局属性值不支持null和undefined,需要手动过滤。
336
440
 
337
- ## RN App中嵌入h5页面
338
- 集成:
339
- 桥接:
441
+ ## 桥接事件埋点
442
+ 桥接事件用于h5桥接RN的场景,使用此接口将H5日志发送至App中。
443
+ ```typescript
444
+
445
+ /**
446
+ * 桥接事件埋点
447
+ * @param data H5转发事件的日志体
448
+ */
449
+ function sendEventForH5(data: string): void
450
+ ```
451
+ | 参数 | 含义 |
452
+ | --- | --- |
453
+ | data | H5转发事件的日志体 |
454
+
455
+ **示例:**
456
+ ```typescript
457
+ const content = data.nativeEvent.data;
458
+ QT.sendEventForH5(content);
459
+ ```
340
460
 
461
+ # RN App中嵌入h5页面(RN桥接模式)
462
+ ## H5集成 QuickTracking Web SDK
463
+ 该步骤请参考[QuickTrackingWeb SDK集成手册](https://help.aliyun.com/document_detail/428531.html)
464
+ ## 转发H5端发送的日志给React Native WebView
465
+ ```javascript
466
+ <script charset="UTF-8">
467
+ ...
468
+ // sdk接入及配置部分
469
+ ...
470
+
471
+ //转发页面自定义事件(点击、元素曝光、其他)
472
+ aplus_queue.push({
473
+ action: 'aplus.aplus_pubsub.subscribe',
474
+ arguments: ['mw_change_hjlj', function (content) {
475
+ var eventData = content && content.what_to_send && content.what_to_send.hjljdataToUmNative;
476
+ if (/*iOS环境*/) {
477
+ window.ReactNativeWebView.postMessage(JSON.stringify(eventData), '*');
478
+ } else {
479
+ window.ReactNativeWebView.postMessage(JSON.stringify(eventData));
480
+ }
481
+ }]
482
+ })
483
+
484
+ aplus_queue.push({
485
+ action: 'aplus.aplus_pubsub.subscribe',
486
+ arguments: ['mw_change_pv', function (content) {
487
+ var pvData = content && content.what_to_send && content.what_to_send.pvdataToUmNative;
488
+ if (/*iOS环境*/) {
489
+ window.ReactNativeWebView.postMessage(JSON.stringify(pvData), '*');
490
+ } else {
491
+ window.ReactNativeWebView.postMessage(JSON.stringify(pvData));
492
+ }
493
+ }]
494
+ })
495
+ </script>
496
+ ```
497
+ ## React Native WebView接收消息并调用QT SDK上报日志
498
+ ```javascript
499
+ import * as React from 'react'
500
+ import { WebView } from 'react-native-webview';
501
+ import { QT } from 'react-native-quicktracking-analytics-module';
502
+ import { Platform, SafeAreaView } from 'react-native';
503
+
504
+ export default function WebPage() {
505
+ const onMessage = (data) => {
506
+ try {
507
+ const content = data.nativeEvent.data;
508
+ QT.sendEventForH5(content);
509
+ } catch (error) {
510
+ console.log('webview message error:', error);
511
+ }
512
+ };
513
+ ...
514
+ return (
515
+ <SafeAreaView style={{ flex: 1 }}>
516
+ <WebView
517
+ ...
518
+ onMessage={onMessage}
519
+ ...
520
+ />
521
+ </SafeAreaView>
522
+ );
523
+ }
524
+ ```
341
525
  # FAQ
342
- ### 控制台提示[APLUS] -- jsbridge Android environment error, Umeng4Aplus = undefined
526
+ ## Umeng4Plus为空
527
+ 控制台提示[APLUS] -- jsbridge Android environment error, Umeng4Aplus = undefined
343
528
  Umeng4Plus是桥接的环境变量,若提示undefined,说明在原生端未接入桥接功能,请找负责Android或iOS的同学对接。
529
+ ## ruby版本过低
530
+ 进入项目时提示,Required ruby-2.7.5 is not installed. To install do: 'rvm install "ruby-2.7.5"'
531
+ 注意您的ruby版本,MacOS自带的Ruby为2.6.8,不符合RN项目需求。
532
+ 建议在本地终端中执行 ruby --version
533
+ 下载ruby包管理器,如rbenv或rvm等,改成ruby版本为RN需要的[版本](https://github.com/facebook/react-native/blob/main/template/_ruby-version)
534
+ ```shell
535
+ rvm install 2.7.5
536
+ rvm use 2.7.5
537
+ ```
538
+
539
+
540
+ ## 嵌入的html可以收发数,但Android端不能
541
+ 查看Android Manifest里有没有配置网络权限。
542
+ # 参考
543
+ > [QuickTracking Android SDK集成手册](https://help.aliyun.com/document_detail/260238.html)
544
+ > [QuickTracking iOS SDK集成手册](https://help.aliyun.com/document_detail/260233.html)
545
+ > [React Native Android 本地模块](https://reactnative.dev/docs/native-modules-android)
546
+ > [React Native iOS 本地模块](https://reactnative.dev/docs/native-modules-ios)
547
+
548
+
344
549
 
345
550
 
346
- ## 详细文档请参考
347
- 1. [Quicktracking iOS 集成文档](https://help.aliyun.com/document_detail/260230.html)
348
- 2. [Quicktracking Android 集成文档](https://help.aliyun.com/document_detail/260235.html)
349
- 3. [QuickTracking H5 集成文档](https://help.aliyun.com/document_detail/252737.html)
350
551
 
351
552
 
352
553
 
@@ -23,6 +23,7 @@ import com.facebook.react.bridge.ReadableType;
23
23
  import com.facebook.react.module.annotations.ReactModule;
24
24
 
25
25
  import com.quick.qt.analytics.QtTrackAgent;
26
+ import com.quick.qt.commonsdk.QtConfigure;
26
27
  import com.quick.qt.spm.SpmAgent;
27
28
 
28
29
  @ReactModule(name = QuicktrackingAnalyticsModuleModule.NAME)
@@ -54,6 +55,10 @@ public class QuicktrackingAnalyticsModuleModule extends ReactContextBaseJavaModu
54
55
  QtTrackAgent.onPageEnd(pageName);
55
56
  }
56
57
 
58
+ @ReactMethod
59
+ public void onEvent(String eventID) {
60
+ QtTrackAgent.onEvent(context, eventID);
61
+ }
57
62
 
58
63
  @ReactMethod
59
64
  public void onEventObject(String eventID, ReadableMap property) {
@@ -157,4 +162,18 @@ public class QuicktrackingAnalyticsModuleModule extends ReactContextBaseJavaModu
157
162
  public void profileSignOff() {
158
163
  QtTrackAgent.onProfileSignOff();
159
164
  }
165
+
166
+ // SDK预初始化函数不会采集设备信息,也不会向QT后台上报数据。
167
+ // preInit预初始化函数耗时极少,不会影响App首次冷启动用户体验
168
+ @ReactMethod
169
+ public void preInit(String AppKey, String Channel) {
170
+ QtConfigure.preInit(context, AppKey, Channel);
171
+ }
172
+
173
+ // 请务必在用户同意隐私政策后,再初始化SDK
174
+ // 正式初始化SDK,务必调用
175
+ @ReactMethod
176
+ public void initWithAppkey(String AppKey, String Channel) {
177
+ QtConfigure.init(context, AppKey, Channel, QtConfigure.DEVICE_TYPE_PHONE, "");
178
+ }
160
179
  }
package/ios/.DS_Store ADDED
Binary file
@@ -1,5 +1,7 @@
1
1
  //#if __has_include(<QTCommon/MobClick.h>)
2
2
  #import <QTCommon/MobClick.h>
3
+ #import <QTCommon/UMConfigure.h>
4
+
3
5
  //#else
4
6
  //#import "MobClick.h"
5
7
  //#endif
@@ -70,7 +72,7 @@ RCT_EXPORT_METHOD(onEventWithParamsAndCount:(NSString *)eventId parameters:(NSDi
70
72
  }
71
73
 
72
74
  RCT_EXPORT_METHOD(onEventForH5:(NSString*)eventId attributes:(NSDictionary *)attributes) {
73
-
75
+
74
76
  Class _MobClickEvent = NSClassFromString(@"QTMobClickEvent");
75
77
  if (_MobClickEvent){
76
78
  SEL sel = NSSelectorFromString(@"eventForH5:attributes:");
@@ -126,6 +128,16 @@ RCT_EXPORT_METHOD(getGlobalProperties:(RCTPromiseResolveBlock)resolve reject:(RC
126
128
  }
127
129
  }
128
130
 
131
+ // RCT_EXPORT_METHOD(preInit:(NSString*)appKey)
132
+ // {
133
+ // [QTMobClick preInit:appKey];
134
+ // }
135
+
136
+ RCT_EXPORT_METHOD(initWithAppkey:(NSString *)appKey channel:(NSString *)channel)
137
+ {
138
+ [QTConfigure initWithAppkey:appKey channel:channel];
139
+ }
140
+
129
141
  //======================================用户账号和用户属性相关===========================================//
130
142
  RCT_EXPORT_METHOD(profileSignIn:(NSString*)puid provider:(NSString*)provider)
131
143
  {
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>IDEDidComputeMac32BitWarning</key>
6
+ <true/>
7
+ </dict>
8
+ </plist>
@@ -78,13 +78,22 @@ class QT {
78
78
  /**
79
79
  * 注册一个全局事件属性
80
80
  * @param property 要注册的全局属性
81
- * @description 注册全局属性后,后续触发的所有事件都将自动包含这些属性;
82
- * 且这些属性及属性值存入缓存,APP退出后清除。
83
- * 在分析数据时,可根据此属性进行查看和筛选。
81
+ * @description
82
+ ** 注册全局属性后,后续触发的所有事件都将自动包含这些属性;
83
+ ** 且这些属性及属性值存入缓存,APP退出后清除。
84
+ ** 在分析数据时,可根据此属性进行查看和筛选。
84
85
  */
85
86
  static registerGlobalProperty(gp) {
86
87
  if (_reactNative.Platform.OS === 'ios') {
87
- QuicktrackingAnalyticsModule.registerGlobalProperty(gp);
88
+ Object.keys(gp).forEach((_propertyName, propertyValue) => {
89
+ if (!propertyValue && propertyValue !== 0) {
90
+ console.warn('属性值不能为null或undefined');
91
+ } else if (typeof propertyValue === 'object') {
92
+ console.warn('全局属性只能是单层对象');
93
+ } else {
94
+ QuicktrackingAnalyticsModule.registerGlobalProperty(gp);
95
+ }
96
+ });
88
97
  } else {
89
98
  QuicktrackingAnalyticsModule.registerGlobalProperties(gp);
90
99
  }
@@ -164,58 +173,29 @@ class QT {
164
173
  static profileSignOff() {
165
174
  QuicktrackingAnalyticsModule.profileSignOff();
166
175
  }
167
- // /**
168
- // * 自定义事件埋点
169
- // * @param eventId 当前统计的事件ID
170
- // * @param eventLabel 分类标签
171
- // */
172
- // static sendEventLabel(eventId: string, eventLabel: string) {
173
- // return QuicktrackingAnalyticsModule.sendEventLabel(eventId, eventLabel);
174
- // }
175
-
176
- // /**
177
- // * 自定义事件埋点
178
- // * @param eventId 当前统计的事件ID
179
- // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:"Jack",gender:"man"}
180
- // */
181
- // static sendEventMap(eventId: string, eventData: Object) {
182
- // return QuicktrackingAnalyticsModule.sendEventMap(eventId, eventData);
183
- // }
184
176
 
185
- // /**
186
- // * 自定义事件埋点
187
- // * @param eventId 当前统计的事件ID
188
- // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:"Jack",gender:"man"}
189
- // * @param eventNum 用户每次触发的数值的分布情况,如事件持续时间、每次付款金额等
190
- // */
191
- // static sendEventMapAndCount(
192
- // eventId: string,
193
- // eventData: Object,
194
- // eventNum: number
195
- // ) {
196
- // return QuicktrackingAnalyticsModule.sendEventMapAndCount(
197
- // eventId,
198
- // eventData,
199
- // eventNum
200
- // );
201
- // }
202
-
203
- // /**
204
- // * 自定义事件埋点
205
- // * @param eventId 当前统计的事件ID
206
- // * @param eventData 为当前事件的属性和取值(键值对),不能为空,值可以是对象
207
- // */
208
- // static sendEventObject(eventId: string, eventData: Object) {
209
- // return QuicktrackingAnalyticsModule.sendEventObject(eventId, eventData);
210
- // }
177
+ /**
178
+ * SDK预初始化,仅Android调用
179
+ * @param appKey QuickTracking后台提供的唯一key值,请勿泄露给第三方
180
+ * @param channel 下载渠道
181
+ * @description
182
+ ** SDK预初始化函数不会采集设备信息,也不会向QT后台上报数据。
183
+ ** preInit预初始化函数耗时极少,不会影响App首次冷启动用户体验。
184
+ ** 需要在RN中判断 Platform.OS === 'android',再调用此接口
185
+ */
186
+ static preInit(appKey, channel) {
187
+ QuicktrackingAnalyticsModule.preInit(appKey, channel);
188
+ }
211
189
 
212
- // /**
213
- // * 设置关注事件是否触发
214
- // * @param eventList 事件list
215
- // */
216
- // static setFirstLaunchEvent<T>(eventList: Array<T>) {
217
- // return QuicktrackingAnalyticsModule.setFirstLaunchEvent(eventList);
218
- // }
190
+ /**
191
+ * SDK正式初始化
192
+ * @param appKey QuickTracking后台提供的唯一key值,请勿泄露给第三方
193
+ * @param channel 下载渠道
194
+ * @description 请务必在用户同意隐私政策后,再初始化SDK,务必调用。
195
+ */
196
+ static init(appKey, channel) {
197
+ QuicktrackingAnalyticsModule.initWithAppkey(appKey, channel);
198
+ }
219
199
  }
220
200
  exports.QT = QT;
221
201
  //# sourceMappingURL=index.js.map
@@ -72,13 +72,22 @@ export class QT {
72
72
  /**
73
73
  * 注册一个全局事件属性
74
74
  * @param property 要注册的全局属性
75
- * @description 注册全局属性后,后续触发的所有事件都将自动包含这些属性;
76
- * 且这些属性及属性值存入缓存,APP退出后清除。
77
- * 在分析数据时,可根据此属性进行查看和筛选。
75
+ * @description
76
+ ** 注册全局属性后,后续触发的所有事件都将自动包含这些属性;
77
+ ** 且这些属性及属性值存入缓存,APP退出后清除。
78
+ ** 在分析数据时,可根据此属性进行查看和筛选。
78
79
  */
79
80
  static registerGlobalProperty(gp) {
80
81
  if (Platform.OS === 'ios') {
81
- QuicktrackingAnalyticsModule.registerGlobalProperty(gp);
82
+ Object.keys(gp).forEach((_propertyName, propertyValue) => {
83
+ if (!propertyValue && propertyValue !== 0) {
84
+ console.warn('属性值不能为null或undefined');
85
+ } else if (typeof propertyValue === 'object') {
86
+ console.warn('全局属性只能是单层对象');
87
+ } else {
88
+ QuicktrackingAnalyticsModule.registerGlobalProperty(gp);
89
+ }
90
+ });
82
91
  } else {
83
92
  QuicktrackingAnalyticsModule.registerGlobalProperties(gp);
84
93
  }
@@ -158,57 +167,28 @@ export class QT {
158
167
  static profileSignOff() {
159
168
  QuicktrackingAnalyticsModule.profileSignOff();
160
169
  }
161
- // /**
162
- // * 自定义事件埋点
163
- // * @param eventId 当前统计的事件ID
164
- // * @param eventLabel 分类标签
165
- // */
166
- // static sendEventLabel(eventId: string, eventLabel: string) {
167
- // return QuicktrackingAnalyticsModule.sendEventLabel(eventId, eventLabel);
168
- // }
169
-
170
- // /**
171
- // * 自定义事件埋点
172
- // * @param eventId 当前统计的事件ID
173
- // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:"Jack",gender:"man"}
174
- // */
175
- // static sendEventMap(eventId: string, eventData: Object) {
176
- // return QuicktrackingAnalyticsModule.sendEventMap(eventId, eventData);
177
- // }
178
170
 
179
- // /**
180
- // * 自定义事件埋点
181
- // * @param eventId 当前统计的事件ID
182
- // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:"Jack",gender:"man"}
183
- // * @param eventNum 用户每次触发的数值的分布情况,如事件持续时间、每次付款金额等
184
- // */
185
- // static sendEventMapAndCount(
186
- // eventId: string,
187
- // eventData: Object,
188
- // eventNum: number
189
- // ) {
190
- // return QuicktrackingAnalyticsModule.sendEventMapAndCount(
191
- // eventId,
192
- // eventData,
193
- // eventNum
194
- // );
195
- // }
196
-
197
- // /**
198
- // * 自定义事件埋点
199
- // * @param eventId 当前统计的事件ID
200
- // * @param eventData 为当前事件的属性和取值(键值对),不能为空,值可以是对象
201
- // */
202
- // static sendEventObject(eventId: string, eventData: Object) {
203
- // return QuicktrackingAnalyticsModule.sendEventObject(eventId, eventData);
204
- // }
171
+ /**
172
+ * SDK预初始化,仅Android调用
173
+ * @param appKey QuickTracking后台提供的唯一key值,请勿泄露给第三方
174
+ * @param channel 下载渠道
175
+ * @description
176
+ ** SDK预初始化函数不会采集设备信息,也不会向QT后台上报数据。
177
+ ** preInit预初始化函数耗时极少,不会影响App首次冷启动用户体验。
178
+ ** 需要在RN中判断 Platform.OS === 'android',再调用此接口
179
+ */
180
+ static preInit(appKey, channel) {
181
+ QuicktrackingAnalyticsModule.preInit(appKey, channel);
182
+ }
205
183
 
206
- // /**
207
- // * 设置关注事件是否触发
208
- // * @param eventList 事件list
209
- // */
210
- // static setFirstLaunchEvent<T>(eventList: Array<T>) {
211
- // return QuicktrackingAnalyticsModule.setFirstLaunchEvent(eventList);
212
- // }
184
+ /**
185
+ * SDK正式初始化
186
+ * @param appKey QuickTracking后台提供的唯一key值,请勿泄露给第三方
187
+ * @param channel 下载渠道
188
+ * @description 请务必在用户同意隐私政策后,再初始化SDK,务必调用。
189
+ */
190
+ static init(appKey, channel) {
191
+ QuicktrackingAnalyticsModule.initWithAppkey(appKey, channel);
192
+ }
213
193
  }
214
194
  //# sourceMappingURL=index.js.map
@@ -1,3 +1,5 @@
1
+ declare type GlobalProperty = Record<string, string | number>;
2
+ declare type EventParams = Record<string, string | number>;
1
3
  /**
2
4
  *引入 QuickTracking SDK
3
5
  */
@@ -17,7 +19,7 @@ export declare class QT {
17
19
  * @param eventId 当前统计的事件ID
18
20
  * @param params 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>”对
19
21
  */
20
- static sendEvent(eventId: string, params: any): void;
22
+ static sendEvent(eventId: string, params?: EventParams): void;
21
23
  /**
22
24
  * 桥接事件埋点
23
25
  * @param data H5转发事件的日志体
@@ -26,11 +28,12 @@ export declare class QT {
26
28
  /**
27
29
  * 注册一个全局事件属性
28
30
  * @param property 要注册的全局属性
29
- * @description 注册全局属性后,后续触发的所有事件都将自动包含这些属性;
30
- * 且这些属性及属性值存入缓存,APP退出后清除。
31
- * 在分析数据时,可根据此属性进行查看和筛选。
31
+ * @description
32
+ ** 注册全局属性后,后续触发的所有事件都将自动包含这些属性;
33
+ ** 且这些属性及属性值存入缓存,APP退出后清除。
34
+ ** 在分析数据时,可根据此属性进行查看和筛选。
32
35
  */
33
- static registerGlobalProperty(gp: any): void;
36
+ static registerGlobalProperty(gp: GlobalProperty): void;
34
37
  /**
35
38
  * 删除一个全局事件属性
36
39
  * @param propertyName 要删除的全局事件属性名,只支持大小写字母、数字及下划线
@@ -59,4 +62,22 @@ export declare class QT {
59
62
  * 账号登出时需调用此接口,调用之后不再发送账号相关内容。
60
63
  */
61
64
  static profileSignOff(): void;
65
+ /**
66
+ * SDK预初始化,仅Android调用
67
+ * @param appKey QuickTracking后台提供的唯一key值,请勿泄露给第三方
68
+ * @param channel 下载渠道
69
+ * @description
70
+ ** SDK预初始化函数不会采集设备信息,也不会向QT后台上报数据。
71
+ ** preInit预初始化函数耗时极少,不会影响App首次冷启动用户体验。
72
+ ** 需要在RN中判断 Platform.OS === 'android',再调用此接口
73
+ */
74
+ static preInit(appKey: string, channel: string): void;
75
+ /**
76
+ * SDK正式初始化
77
+ * @param appKey QuickTracking后台提供的唯一key值,请勿泄露给第三方
78
+ * @param channel 下载渠道
79
+ * @description 请务必在用户同意隐私政策后,再初始化SDK,务必调用。
80
+ */
81
+ static init(appKey: string, channel: string): void;
62
82
  }
83
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-quicktracking-analytics-module",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.1",
4
4
  "description": "QuickTracking ReactNative SDK",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/index.tsx CHANGED
@@ -1,5 +1,9 @@
1
1
  import { NativeModules, Platform } from 'react-native';
2
2
  const QuicktrackingAnalyticsModule = NativeModules.QuicktrackingAnalyticsModule;
3
+
4
+ type GlobalProperty = Record<string, string | number>;
5
+ type EventParams = Record<string, string | number>;
6
+
3
7
  /**
4
8
  *引入 QuickTracking SDK
5
9
  */
@@ -25,7 +29,7 @@ export class QT {
25
29
  * @param eventId 当前统计的事件ID
26
30
  * @param params 对当前事件的参数描述,定义为“参数名:参数值”的“<键-值>”对
27
31
  */
28
- static sendEvent(eventId: string, params: any) {
32
+ static sendEvent(eventId: string, params?: EventParams) {
29
33
  if (params) {
30
34
  QuicktrackingAnalyticsModule.onEventObject(eventId, params);
31
35
  } else {
@@ -76,13 +80,22 @@ export class QT {
76
80
  /**
77
81
  * 注册一个全局事件属性
78
82
  * @param property 要注册的全局属性
79
- * @description 注册全局属性后,后续触发的所有事件都将自动包含这些属性;
80
- * 且这些属性及属性值存入缓存,APP退出后清除。
81
- * 在分析数据时,可根据此属性进行查看和筛选。
83
+ * @description
84
+ ** 注册全局属性后,后续触发的所有事件都将自动包含这些属性;
85
+ ** 且这些属性及属性值存入缓存,APP退出后清除。
86
+ ** 在分析数据时,可根据此属性进行查看和筛选。
82
87
  */
83
- static registerGlobalProperty(gp: any) {
88
+ static registerGlobalProperty(gp: GlobalProperty) {
84
89
  if (Platform.OS === 'ios') {
85
- QuicktrackingAnalyticsModule.registerGlobalProperty(gp);
90
+ Object.keys(gp).forEach((_propertyName, propertyValue) => {
91
+ if (!propertyValue && propertyValue !== 0) {
92
+ console.warn('属性值不能为null或undefined');
93
+ } else if (typeof propertyValue === 'object') {
94
+ console.warn('全局属性只能是单层对象');
95
+ } else {
96
+ QuicktrackingAnalyticsModule.registerGlobalProperty(gp);
97
+ }
98
+ });
86
99
  } else {
87
100
  QuicktrackingAnalyticsModule.registerGlobalProperties(gp);
88
101
  }
@@ -162,56 +175,27 @@ export class QT {
162
175
  static profileSignOff() {
163
176
  QuicktrackingAnalyticsModule.profileSignOff();
164
177
  }
165
- // /**
166
- // * 自定义事件埋点
167
- // * @param eventId 当前统计的事件ID
168
- // * @param eventLabel 分类标签
169
- // */
170
- // static sendEventLabel(eventId: string, eventLabel: string) {
171
- // return QuicktrackingAnalyticsModule.sendEventLabel(eventId, eventLabel);
172
- // }
173
-
174
- // /**
175
- // * 自定义事件埋点
176
- // * @param eventId 当前统计的事件ID
177
- // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:"Jack",gender:"man"}
178
- // */
179
- // static sendEventMap(eventId: string, eventData: Object) {
180
- // return QuicktrackingAnalyticsModule.sendEventMap(eventId, eventData);
181
- // }
182
-
183
- // /**
184
- // * 自定义事件埋点
185
- // * @param eventId 当前统计的事件ID
186
- // * @param eventData 为当前事件的属性和取值(键值对),不能为空,如:{name:"Jack",gender:"man"}
187
- // * @param eventNum 用户每次触发的数值的分布情况,如事件持续时间、每次付款金额等
188
- // */
189
- // static sendEventMapAndCount(
190
- // eventId: string,
191
- // eventData: Object,
192
- // eventNum: number
193
- // ) {
194
- // return QuicktrackingAnalyticsModule.sendEventMapAndCount(
195
- // eventId,
196
- // eventData,
197
- // eventNum
198
- // );
199
- // }
200
178
 
201
- // /**
202
- // * 自定义事件埋点
203
- // * @param eventId 当前统计的事件ID
204
- // * @param eventData 为当前事件的属性和取值(键值对),不能为空,值可以是对象
205
- // */
206
- // static sendEventObject(eventId: string, eventData: Object) {
207
- // return QuicktrackingAnalyticsModule.sendEventObject(eventId, eventData);
208
- // }
179
+ /**
180
+ * SDK预初始化,仅Android调用
181
+ * @param appKey QuickTracking后台提供的唯一key值,请勿泄露给第三方
182
+ * @param channel 下载渠道
183
+ * @description
184
+ ** SDK预初始化函数不会采集设备信息,也不会向QT后台上报数据。
185
+ ** preInit预初始化函数耗时极少,不会影响App首次冷启动用户体验。
186
+ ** 需要在RN中判断 Platform.OS === 'android',再调用此接口
187
+ */
188
+ static preInit(appKey: string, channel: string) {
189
+ QuicktrackingAnalyticsModule.preInit(appKey, channel);
190
+ }
209
191
 
210
- // /**
211
- // * 设置关注事件是否触发
212
- // * @param eventList 事件list
213
- // */
214
- // static setFirstLaunchEvent<T>(eventList: Array<T>) {
215
- // return QuicktrackingAnalyticsModule.setFirstLaunchEvent(eventList);
216
- // }
192
+ /**
193
+ * SDK正式初始化
194
+ * @param appKey QuickTracking后台提供的唯一key值,请勿泄露给第三方
195
+ * @param channel 下载渠道
196
+ * @description 请务必在用户同意隐私政策后,再初始化SDK,务必调用。
197
+ */
198
+ static init(appKey: string, channel: string) {
199
+ QuicktrackingAnalyticsModule.initWithAppkey(appKey, channel);
200
+ }
217
201
  }