SDK基本資料
SDK名稱 | 版本號碼 | md5 | 包名 |
QuickTracking React Native SDK | 最新版本:2.1.1 更新日誌:React Native SDK更新日誌 | e8136a02cdf635f06296f64924fa347f | react-native-quicktracking-analytics-module |
整合說明
Quick Tracking React Native SDK是基於Quick Tracking原生用戶端埋點SDK上的擴充,封裝了QT埋點常用的api,如全域屬性、頁面屬性、自訂事件等,需要分別在RN、Android、iOS三端做整合以及配置。
React Native SDK整合
npm線上地址:react-native-quicktracking-analytics-module
下載npm包到專案中
# npm
npm install react-native-quicktracking-analytics-module
# yarn
yarn add react-native-quicktracking-analytics-module
# pnpm
pnpm add react-native-quicktracking-analytics-module引入SDK環境變數
import * as QT from "react-native-quicktracking-analytics-module";AppKey和收數網域名稱擷取
進入控制台
進入QT後台,點擊“管理主控台”

整合應用
找到需要整合埋點的應用:進入“應用列表”,選擇所需組織,點擊操作中的“詳情或者去整合”

Android 基座配置
Maven地址配置
在工程 build.gradle 配置指令碼中 buildscript 和 allprojects 段中添加 sdk maven 倉庫地址
buildscript {
repositories {
google()
jcenter()
maven { url 'https://repo1.maven.org/maven2/' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'}
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://repo1.maven.org/maven2/' }
}
}組件引用
在工程app對應build.gradle配置指令碼dependencies段中,添加整合所需要的依賴
dependencies {
implementation fileTree(include:['*.jar'], dir:'libs')
//QuickTracking統計分析SDK
implementation 'com.lydaas.qtsdk:qt-px-common:1.8.6.PX'
}請注意:如果已經通過package.json 添加了 QuickTracking ReactNative SDK 的依賴,則不需要再單獨整合QuickTracking Android原生SDK
埋點驗證配置
在Android.manifest中,找到MainActivity對應的activity標籤,並將以下代碼粘貼進去,appkey換成自己的
//1.喚起碼預設為"atm.該app對應的appkey",不可改變
//2.請使用單獨intent-filter,和其他intent-filter並列
//不要將以下代碼填入其他intent-filter裡;
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="atm.appkey" />
</intent-filter>配置許可權
統計SDK需要宿主APP授予如下許可權:
許可權 | 用途 |
ACCESS_NETWORK_STATE | 檢測連網方式,在網路異常狀態下避免資料發送,節省流量和電量。 |
READ_PHONE_STATE(可選) | 擷取使用者裝置的IMEI,通過IMEI對使用者進行唯一標識,以便提供統計分析服務。 |
ACCESS_WIFI_STATE | 擷取WIFI mac地址,在平板裝置或電視盒子上,無法通過IMEI標識裝置,我們會將WIFI mac地址作為使用者的唯一標識,以便正常提供統計分析服務。 |
INTERNET | 允許應用程式連網和發送統計資料的許可權,以便提供統計分析服務。 |
下面給出AndroidManifest.xml資訊清單檔樣本:
<manifest ……>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application ……>
</manifest>混淆配置
如果您的應用使用了代碼混淆,請添加如下配置,以避免Quick Tracking SDK被錯誤混淆導致SDK不可用。
-keep class com.umeng.** {*;}
-keep class org.repackage.** {*;}
-keep class com.quick.qt.** {*;}
-keep class rpk.quick.qt.** {*;}
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}SDK需要引用匯入工程的資源檔,通過了反射機製得到資源引用檔案R.java,但是在開發人員通過proguard等混淆最佳化工具處理apk時,proguard可能會將R.java刪除,如果遇到這個問題,請添加如下配置:
-keep public class [您的應用程式套件名].R$*{
public stac final int iOS 基座配置
使用CocoaPods整合
進入iOS工程目錄
cd ios && pod install 埋點驗證配置
添加您的 URL Scheme 到專案中,URL Scheme 位於專案設定 target -> 選項卡 Info - > URL Types。
填入的scheme:atm.yourappkey。

在AppDelegate中調用函數[QTMobClick handleUrl:url]來接收 URL
- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
if ([QTMobClick handleUrl:url]) {
return YES;
}
return YES;
}
埋點驗證操作請參考文檔:埋點驗證詳細指南
埋點API
SDK初始化
注意初始化方法要放在App.tsx中,保證最先被執行到
樣本
import * as QT from 'react-native-quicktracking-analytics-module';
import { Platform } from 'react-native';
// 初始化相關代碼寫在此處
QT.setTrackDomain(
'收數網域名稱',
'備用收數網域名稱(可以傳空)'
);
if (Platform.OS === 'android') {
QT.init('appkey', '市集名稱');
} else {
QT.init('appkey', 'App Store');
}
export default function App() {
return (
...
);
}設定收數網域名稱
調用初始化SDK能力之前,需要調用 setTrackDomain 方法設定收數網域名稱
function setTrackDomain(mainTrackDomain: string, subTrackDomain: string): void;參數 | 含義 |
mainTrackDomain | 收數網域名稱 |
chsubTrackDomainannel | 備用收數網域名稱 |
樣本
import * as QT from "react-native-quicktracking-analytics-module";
QT.setTrackDomain(
'收數網域名稱',
'備用收數網域名稱(如果沒有可以傳空'')'
);預初始化
僅Android端需要預初始化方法
function preInit(appKey: string, channel: string): void;參數 | 含義 |
appKey | QT後台提供的唯一應用key值 |
channel | 下載渠道 |
樣本
需要在Android原生Application中進行preinit初始化,防止事件漏報等異常
class MainApplication : Application(), ReactApplication {
private var appKey = "您的appkey"
private var domain = "您的收數網域名稱"
override fun onCreate() {
super.onCreate()
QtConfigure.setCustomDomain(domain, domain)//設定收數網域名稱
// QtConfigure.setLogEnabled(true)// 開啟日誌
QtConfigure.preInit(
this,
appKey,
"您的渠道名稱"
)
// loadReactNative(this)
}
}正式初始化
務必調用,請務必在使用者同意隱私政策後,再初始化SDK。
function init(appKey: string, channel: string): void參數 | 含義 |
appKey | QT後台提供的唯一應用key值 |
channel | 下載渠道 |
樣本
import * as QT from "react-native-quicktracking-analytics-module";
QT.init('appkey', 'quicktracking');日誌開關(按需開啟, 上線的時候記得關閉)
function enableLog(enable: boolean): void;參數 | 含義 |
enable | true開啟 false關閉 |
樣本
import * as QT from "react-native-quicktracking-analytics-module";
QT.enableLog(true);使用者帳號上報
使用者登入
該值的上傳對應產品中“登入使用者”:計算“登入使用者”數,就是計算下述API上傳值的去重數
function profileSignIn(ID: string, provider?: string): void參數 | 含義 |
ID | 使用者帳號,長度小於64位元組。 該值的上傳對應產品中“登入使用者”:計算“登入使用者”數,就是計算該使用者帳號的去重數 |
provider | 無效欄位,傳空即可。 |
樣本
import * as QT from "react-native-quicktracking-analytics-module";
QT.profileSignIn('使用者ID');使用者登出
帳號登出時需調用此介面,調用之後不再發送帳號相關內容。
function profileSignOff(): void樣本
import * as QT from "react-native-quicktracking-analytics-module";
QT.profileSignOff();使用者屬性上傳
使用事件編碼固定為"$$_user_profile"的自訂事件上傳,該事件所攜帶的事件屬性會被作為使用者屬性放在使用者表中。
function sendEvent(eventId: string, params: any): void參數 | 含義 |
eventId | 當前統計的事件ID |
params | 對當前事件的參數描述,定義為“參數名:參數值”的“<鍵-值>”對 |
請注意:使用者屬性上傳一定要在使用者帳號上報後。
樣本:
import * as QT from "react-native-quicktracking-analytics-module";
QT.onProfileSignIn("張三");
const user = {
gender: "male",
age: "8"
}
QT.sendEvent("$$_user_profile", user);上述上傳的業務含義為:張三 男 8歲
全域屬性
全域屬性為每一個事件都會攜帶的屬性
註冊全域屬性
function registerGlobalProperty(globalProperty: any): void參數 | 含義 |
globalProperty | 要註冊的全域屬性,定義為“屬性名稱:屬性值”的“<鍵-值>”對。為單層對象結構,不支援多層嵌套。 |
注意:
屬性名稱、string類型的屬性值,只支援大小寫字母、數字及底線。
在Android中,屬性值不支援JavaScript的boolean類型,需要手動在JS中轉為0、1。
在Android中,對於全域屬性值為null或undefined的情境,底層Android sdk會過濾這個全域屬性欄位,如需要空值分析情境,需自訂預設空值
在iOS中,全域屬性值不支援null和undefined,需要手動過濾。
樣本:
import * as QT from "react-native-quicktracking-analytics-module";
QT.registerGlobalProperty({
name: 'MyApp',
description: 'this is a app',
aBoolean: 1, //boolean類型需傳為0或1,
aNull: '', //null或undefined類型需傳Null 字元串
//預設為number類型,對於傳回值為null或undefined情境,需業務自訂數值型預設空值
aNumber: 66,
});刪除特定的全域屬性
function unregisterGlobalProperty(propertyName: string): void參數 | 含義 |
propertyName | 要刪除的全域屬性名 |
樣本:
import * as QT from "react-native-quicktracking-analytics-module";
QT.unregisterGlobalProperty('name'); // 刪除全域屬性name擷取特定的全域屬性
async function getGlobalProperty(propertyName: string): Promise<any>參數 | 含義 |
propertyName | 要擷取的全域屬性名 |
樣本:
import * as QT from "react-native-quicktracking-analytics-module";
const nameValue = await QT.getGlobalProperty('name');
console.log('getGlobalProperty 調用成功', nameValue);擷取所有全域屬性
async function getGlobalProperties(propertyName: string): Promise<any>樣本:
import * as QT from "react-native-quicktracking-analytics-module";
const globalProperties = await QT.getGlobalProperties();
console.log('getGlobalProperties 調用成功', globalProperties);清除所有全域屬性
function clearGlobalProperties(): void樣本:
import * as QT from "react-native-quicktracking-analytics-module";
QT.clearGlobalProperties(); // 所有全域屬性都被清除(慎用)頁面瀏覽事件埋點
開發人員如果希望對頁面路徑和頁面停留時間長度進行採集和統計。可以通過調用該介面手動埋點
function onPageStart(pageName: string): void
function onPageEnd(pageName: string): void參數 | 含義 |
pageName | 頁面編碼 |
樣本:
import * as QT from "react-native-quicktracking-analytics-module";
QT.onPageStart('MainPage');
QT.onPageEnd('MainPage');請注意:
onPageStart 是SDK記錄頁面進入的資訊,onPageStart不會上報事件,只有調用onPageEnd的時候才會上報頁面瀏覽事件。
onPageStart和onPageEnd必須成對調用,且傳值的pageName需要保持一致,如果沒有onPageEnd或者onPageEnd與onPageStart傳值的pageName不一致,則onPageStart記錄的資訊不會生效。
頁面屬性上傳
支援給當前頁面附加自訂屬性
function uploadPageProperties(pageName: string, params: EventParams): void參數:
參數 | 含義 |
pageName | 目標頁面名(頁面編碼),必須和當前頁面名一致。如不一致,函數執行無效。 |
params | 對當前事件的參數描述,定義為"參數名:參數值" 的 "<鍵-值>"對。為單層對象結構,不支援多層嵌套。 |
樣本:
import * as QT from "react-native-quicktracking-analytics-module";
QT.uploadPageProperties('detail_page', { test: 1 })請注意:
該介面必須在onPageStart和onPageEnd之間調用。
屬性名稱、string類型的屬性值,只支援大小寫字母、數字及底線。
在Android中,屬性值不支援JavaScript的boolean類型,需要手動在JS中轉為0、1。
在Android中,對於全域屬性值為null或undefined的情境,底層Android sdk會過濾這個全域屬性欄位,如需要空值分析情境,需自訂預設空值
在iOS中,全域屬性值不支援null和undefined,需要手動過濾。
自訂事件埋點
自訂事件可以用於追蹤使用者行為,記錄行為發生的具體細節。
使用 sendEvent 介面進行事件的統計,介面如下:
function sendEvent(eventId: string, params?: any, pageName?: string): void參數 | 含義 |
eventId | 為當前統計的事件編碼。 |
params | 對當前事件的參數描述,定義為“參數名:參數值”的“<鍵-值>對”。為單層對象結構,不支援多層嵌套。 |
pageName | 當前統計事件的頁面編碼 |
樣本:
import * as QT from "react-native-quicktracking-analytics-module";
// 攜帶事件參數的自訂事件
QT.sendEvent(
'event1',
{
name: 'quick tracking',
method: 'func',
},
);
// 攜帶事件參數和頁面編碼的自訂事件
QT.sendEvent(
'event2',
{
name: 'quick tracking',
method: 'func',
},
'main-page'
);備忘:
多參數類型事件能滿足原來計算事件/計數事件的分析情境;
對於計算型事件不同的參數類型對應不同的計算方式,總共可以分為兩大類,數值型和字元型
數字型:支援累加值、最大值、最小值、平均值和去重數計算
字元型:支援去重數計算
請注意:
同全域屬性,事件屬性在Android和iOS不同平台上,也有著類型處理的差異:
在Android中,不支援JavaScript的boolean類型,需要手動在JS中轉為0、1。
在Android中,對於全域屬性值為null或undefined的情境,底層Android sdk會過濾這個全域屬性欄位,如需要空值分析情境,需自訂預設空值
在iOS中,全域屬性值不支援null和undefined,需要手動過濾。
橋接事件埋點
橋接事件用於h5橋接RN的情境,使用此介面將H5日誌發送至App中。
function sendEventForH5(data: string): void參數 | 含義 |
data | H5轉寄事件的日誌體 |
樣本:
import * as QT from "react-native-quicktracking-analytics-module";
const content = data.nativeEvent.data;
QT.sendEventForH5(content);RN App中嵌入h5頁面(RN橋接模式)
H5整合 QuickTracking Web SDK
該步驟請參考:Web SDK
轉寄H5端發送的日誌給React Native WebView
<script charset="UTF-8">
...
// sdk接入及配置部分
...
//轉寄頁面自訂事件(點擊、元素曝光、其他)
aplus_queue.push({
action: 'aplus.aplus_pubsub.subscribe',
arguments: ['mw_change_hjlj', function (content) {
var eventData = content && content.what_to_send && content.what_to_send.hjljdataToUmNative;
if (/*iOS環境*/) {
window.ReactNativeWebView.postMessage(JSON.stringify(eventData), '*');
} else {
window.ReactNativeWebView.postMessage(JSON.stringify(eventData));
}
}]
})
aplus_queue.push({
action: 'aplus.aplus_pubsub.subscribe',
arguments: ['mw_change_pv', function (content) {
var pvData = content && content.what_to_send && content.what_to_send.pvdataToUmNative;
if (/*iOS環境*/) {
window.ReactNativeWebView.postMessage(JSON.stringify(pvData), '*');
} else {
window.ReactNativeWebView.postMessage(JSON.stringify(pvData));
}
}]
})
</script>React Native WebView接收訊息並調用QT SDK上報日誌
import * as React from 'react'
import { WebView } from 'react-native-webview';
import { QT } from 'react-native-quicktracking-analytics-module';
import { Platform, SafeAreaView } from 'react-native';
export default function WebPage() {
const onMessage = (data) => {
try {
const content = data.nativeEvent.data;
QT.sendEventForH5(content);
} catch (error) {
console.log('webview message error:', error);
}
};
return (
<SafeAreaView style={{ flex: 1 }}>
<WebView
...
onMessage={onMessage}
...
/>
</SafeAreaView>
);
}其他
關閉SDK
const disableSDK: () => void;樣本
import * as QT from "react-native-quicktracking-analytics-module";
QT.disableSDK();開啟SDK
const enableSDK: () => void;樣本
import * as QT from "react-native-quicktracking-analytics-module";
QT.enableSDK();自訂裝置ID
const setCustomDeviceId: (deviceId: string) => void;參數 | 含義 |
deviceId | 裝置ID |
樣本
import * as QT from "react-native-quicktracking-analytics-module";
QT.setCustomDeviceId('deviceId');讀取裝置ID
const getDeviceId: () => Promise<any>;樣本
import * as QT from "react-native-quicktracking-analytics-module";
const deviceID = await QT.getDeviceId();
console.log(‘getDeviceId 調用成功’, JSON.stringify(deviceID)); RN 全埋點
需要 QuickTracking ReactNative SDK 2.0.0版本及以上支援
頁面瀏覽事件自動採集
考慮到React Navigation庫自身豐富的情境支援以及在社區的影響力,在SDK的頁面瀏覽事件自動採集能力上直接藉助了React Navigation開放的介面能力,樣本如下:
import {QT} from 'react-native-quicktracking-analytics-module';
import {
NavigationContainer,
useNavigationContainerRef,
} from '@react-navigation/native';
import {createNativeStackNavigator} from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();
const App = () => {
const navigationRef = useNavigationContainerRef();
const routeNameRef = useRef('');
return (
<NavigationContainer
ref={navigationRef}
onReady={() => {
routeNameRef.current = currentRouteName;
// 設定頁面編碼
QT.onPageStart(currentRouteName);
}}
onStateChange={() => {
const previousRouteName = routeNameRef.current;
const currentRouteName = navigationRef.getCurrentRoute()?.name;
// 按需設定頁面屬性(可選)
QT.uploadPageProperties(previousRouteName, {
test_page_p_1: 1,
test_page_p_2: "test"
});
// 採集頁面瀏覽事件
QT.onPageEnd(previousRouteName);
if (currentRouteName) {
if (previousRouteName !== currentRouteName) {
// 更新新的頁面編碼
QT.onPageStart(currentRouteName);
routeNameRef.current = currentRouteName;
}
}
}}
>
...
</NavigationContainer>
)
}控制項點擊事件自動採集
在待埋點專案路徑下執行node命令
node node_modules/react-native-quicktracking-analytics-module/src/hook.js -run註:如果需要恢複原始檔案,可以執行 reset 命令
node node_modules/react-native-quicktracking-analytics-module/src/hook.js -reset忽略RN控制項全埋點採集
由於存在混合開發的情境,支援單獨關閉React Native控制項點擊事件的自動採集,在待埋點專案的package.json中增加QTSDKConfig配置:
{
"name": "reactnative_demo",
"QTSDKConfig": {
"enableAutoCLK": true
}
}enableAutoCLK欄位取值含義:
true 開啟RN控制項自動採集
false 關閉RN控制項自動採集
註:開啟RN控制項點擊事件自動採集功能需要配合上述 node 命令使用
開啟iOS控制項點擊事件自動採集
#import <QTCommon/UMConfigure.h>
#import <QTCommon/MobClick.h>
#import <UMCommonLog/UMCommonLogHeaders.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 全埋點原生控制項點擊自動採集功能開啟
[QTMobClick setAutoEventEnabled:YES];
return YES;
}開啟Android控制項點擊事件自動採集
import com.quick.qt.analytics.QtTrackAgent;
public class MainApplication extends Application implements ReactApplication {
...
@Override
public void onCreate() {
super.onCreate();
...
// 全埋點原生控制項點擊自動採集功能開啟
QtTrackAgent.setAutoEventEnabled(true);
...
}
...
}設定ReactNative控制項自訂屬性
註:僅支援React Native控制項,如TouchableHighlight、TouchableOpacity、Pressable等等
<Pressable
onPress={()=>{}}
qtParams={{
pressable: "press_1",
}}
>
{({pressed}) => (
<Text style={styles.text}>
{pressed ? '點下了Pressable控制項!' : 'Pressable 控制項'}
</Text>
)}
</Pressable>
<TouchableHighlight
onPress={()=>{}}
qtParams={{aTouchableHighlight: 1, b: 2}}>
<Text>TouchableHighlight 控制項</Text>
</TouchableHighlight>
<TouchableOpacity
onPress={()=>{}}
qtParams={{aTouchableOpacity: 1, b: 2}}>
<Text>TouchableOpacity 控制項</Text>
</TouchableOpacity>
<TouchableWithoutFeedback
onPress={()=>{}}
qtParams={{aTouchableWithoutFeedback: 1, b: 2}}>
<Text>TouchableWithoutFeedback 控制項</Text>
</TouchableWithoutFeedback>忽略單個控制項的自動採集
在事件屬性中增加 ignore欄位等於true
<TouchableHighlight
onPress={()=>{}}
qtParams={{
aTouchableHighlight: 1,
b: 2,
ignore: true
}}>
<Text>TouchableHighlight 控制項</Text>
</TouchableHighlight>嵌入的html可以收發數,但Android端不能
查看Android Manifest裡有沒有配置網路許可權。
參考
License
MIT
Made with create-react-native-library