React Native SDK
集成說明
QuickTracking React Native SDK是基于QuickTracking 原生客戶端埋點SDK上的擴展,封裝了QT埋點常用的api,如全局屬性、頁面屬性、自定義事件等。
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環(huán)境變量
import { QT } from "react-native-quicktracking-analytics-module";
Android 基座集成
進入控制臺
進入QT后臺,點擊“管理控制臺”
集成應用
找到需要集成埋點的應用:進入“應用列表”,選擇所需組織,點擊操作中的“詳情或者去集成”
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統(tǒng)計分析SDK
implementation 'com.lydaas.qtsdk:qt-px-common:1.6.3.PX'
}
請注意:如果已經(jīng)通過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>
配置權(quán)限
統(tǒng)計SDK需要宿主APP授予如下權(quán)限:
權(quán)限 | 用途 |
ACCESS_NETWORK_STATE | 檢測聯(lián)網(wǎng)方式,在網(wǎng)絡(luò)異常狀態(tài)下避免數(shù)據(jù)發(fā)送,節(jié)省流量和電量。 |
READ_PHONE_STATE(可選) | 獲取用戶設(shè)備的IMEI,通過IMEI對用戶進行唯一標識,以便提供統(tǒng)計分析服務。 |
ACCESS_WIFI_STATE | 獲取WIFI mac地址,在平板設(shè)備或電視盒子上,無法通過IMEI標識設(shè)備,我們會將WIFI mac地址作為用戶的唯一標識,以便正常提供統(tǒng)計分析服務。 |
INTERNET | 允許應用程序聯(lián)網(wǎng)和發(fā)送統(tǒng)計數(shù)據(jù)的權(quán)限,以便提供統(tǒng)計分析服務。 |
下面給出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>
混淆配置
如果您的應用使用了代碼混淆,請?zhí)砑尤缦屡渲?,以避免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,但是在開發(fā)者通過proguard等混淆優(yōu)化工具處理apk時,proguard可能會將R.java刪除,如果遇到這個問題,請?zhí)砑尤缦屡渲茫?/p>
-keep public class [您的應用包名].R$*{
public stac final int
初始化SDK
域名設(shè)置
務必在初始化之前設(shè)置私有化環(huán)境收數(shù)域名。
/**
* 設(shè)置上傳統(tǒng)計日志的主域名和備用域名。SDK會優(yōu)先將統(tǒng)計數(shù)據(jù)上報到主域名,失敗的情況下會再嘗試將數(shù)據(jù)上報到備用域名。
* 主域名primaryDomain或不能傳入null或者空串,否則會拋出SdkDomainUndefined運行時異常。
*/
QtConfigure.setCustomDomain("收數(shù)域名", null);
預初始化
請在宿主App的Application.onCreate函數(shù)中調(diào)用基礎(chǔ)組件庫初始化函數(shù)。
//SDK預初始化函數(shù)不會采集設(shè)備信息,也不會向QT后臺上報數(shù)據(jù)。
//preInit預初始化函數(shù)耗時極少,不會影響App首次冷啟動用戶體驗
QtConfigure.preInit(this,"appkey","Channel");
3.正式初始化
//正式初始化SDK,務必調(diào)用
public static void init(Context context,String appkey,String channel,int deviceType,String pushSecret);
參數(shù) | 含義 | 備注 |
appkey | QT為當前應用平臺頒發(fā)的唯一標識。 |
|
channel | app投放的應用市場 | QT分析平臺的“系統(tǒng)屬性”中“升級渠道”的數(shù)據(jù)來源 |
deviceType | QtConfigure.DEVICE_TYPE_PHONE | 默認填寫QtConfigure.DEVICE_TYPE_PHONE即可 |
pushSecret | 廢棄字段,填寫空即可 | 廢棄字段,填寫空即可 |
示例:
public class MainApplication extends Application implements ReactApplication {
@Override
public void onCreate() {
super.onCreate();
//SDK預初始化函數(shù)不會采集設(shè)備信息,也不會向QT后臺上報數(shù)據(jù)。
//preInit預初始化函數(shù)耗時極少,不會影響App首次冷啟動用戶體驗
QtConfigure.preInit(this,"您的appkey","aliyun");
//正式初始化SDK,務必調(diào)用
QtConfigure.init(this,"您的appkey","aliyun",QtConfigure.DEVICE_TYPE_PHONE, "");
}
Android統(tǒng)計分析SDK集成方式請參考文檔:Android SDK
iOS 基座集成
使用CocoaPods集成
進入iOS工程目錄
cd ios && pod install && cd ..
SDK初始化并集成appKey
為保證您的App在集成統(tǒng)計SDK之后,能夠滿足工信部相關(guān)合規(guī)要求,您應確保App首次冷啟動時,在用戶閱讀您的《隱私政策》并取得用戶授權(quán)之后,才調(diào)用正式初始化函數(shù)初始化統(tǒng)計SDK,此時SDK才會真正采集設(shè)備信息并上報數(shù)據(jù)。反之,如果用戶不同意《隱私政策》授權(quán),則不能調(diào)用初始化函數(shù)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/** 初始化所有組件產(chǎn)品
* @param appKey 開發(fā)者在QT申請的appkey.
* @param channel 渠道標識,可設(shè)置nil表示"App Store".
*/
[QTConfigure initWithAppkey:@"應用的appKey" channel:@"安裝渠道"];
return YES;
}
一旦App獲取到《隱私政策》的用戶授權(quán),后續(xù)的App冷啟動,開發(fā)者應該保證調(diào)用到初始化函數(shù)。
配置收數(shù)域名
#import <QTCommon/UMConfigure.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/** 設(shè)置上報統(tǒng)計日志的主域名和備用域名。此函數(shù)必須在SDK初始化函數(shù)調(diào)用之前調(diào)用。
* @param primaryDomain 傳日志的主域名收數(shù)地址,參數(shù)不能為null或者空串。
* @param standbyDomain 上傳日志備用域名收數(shù)地址,參數(shù)可以為null或者空串,若此參數(shù)為空,SDK內(nèi)部會自動將主域名設(shè)置為備用域名。
*/
[QTConfigure setCustomDomain:@"主收數(shù)域名" standbyDomain:@"備用收數(shù)域名"];
return YES;
}
按需引入日志組件
引入統(tǒng)計所需組件庫(在更新SDK時,您可以直接使用 pod update 命令進行直接更新)
pod 'UMCCommonLog'
Podfile示例
require_relative '../node_modules/react-native/scripts/react_native_pods'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
platform :ios, '12.0'
target 'qt_reactnative_demo' do
config = use_native_modules!
//QuickTracking 統(tǒng)計分析 SDK
pod 'QTCommon', '~> 1.5.8.PX'//需要指定版本號
//可在項目中加入 “基礎(chǔ)庫-日志庫” 中的 UMCCommonLog 進行開發(fā)調(diào)試。
pod 'UMCCommonLog'
use_react_native!(
:path => config[:reactNativePath],
# to enable hermes on iOS, change `false` to `true` and then install pods
:hermes_enabled => flags[:hermes_enabled],
)
use_flipper!()
post_install do |installer|
react_native_post_install(installer)
__apply_Xcode_12_5_M1_post_install_workaround(installer)
end
end
請注意:如果已經(jīng)通過package.json 添加了 QuickTracking ReactNative SDK 的依賴,則不需要再單獨集成QuickTracking iOS原生SDK
開啟日志打印
#import <QTCommon/UMConfigure.h>
#import <UMCommonLog/UMCommonLogHeaders.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[UMCommonLogManager setUpUMCommonLogManager];
[QTConfigure setLogEnabled:YES];
return YES;
}
埋點驗證配置
添加您的 URL Scheme 到項目中,URL Scheme 位于項目設(shè)置 target -> 選項卡 Info - > URL Types。
填入的scheme:atm.yourappkey。
在AppDelegate中調(diào)用函數(shù)[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;
}
iOS統(tǒng)計分析SDK集成方式請參考文檔:iOS SDK
埋點驗證操作請參考文檔:埋點驗證詳細指南
埋點API
SDK初始化
正式初始化
務必調(diào)用,請務必在用戶同意隱私政策后,再初始化SDK。
function init(appKey: string, channel: string): void
參數(shù) | 含義 |
appKey | QT后臺提供的唯一應用key值 |
channel | 下載渠道 |
示例
QT.init('appkey', 'quicktracking');
用戶賬號上報
用戶登錄
該值的上傳對應產(chǎn)品中“登錄用戶”:計算“登錄用戶”數(shù),就是計算下述API上傳值的去重數(shù)
function profileSignIn(ID: string, provider?: string): void
參數(shù) | 含義 |
ID | 用戶賬號,長度小于64字節(jié)。 該值的上傳對應產(chǎn)品中“登錄用戶”:計算“登錄用戶”數(shù),就是計算該用戶賬號的去重數(shù) |
provider | 無效字段,傳空即可。 |
用戶登出
賬號登出時需調(diào)用此接口,調(diào)用之后不再發(fā)送賬號相關(guān)內(nèi)容。
function profileSignOff(): void
示例
QT.profileSignIn('用戶ID');
QT.profileSignOff();
用戶屬性上傳
使用事件編碼固定為"$$_user_profile"的自定義事件上傳,該事件所攜帶的事件屬性會被作為用戶屬性放在用戶表中。
function sendEvent(eventId: string, params: any): void
參數(shù) | 含義 |
eventId | 當前統(tǒng)計的事件ID |
params | 對當前事件的參數(shù)描述,定義為“參數(shù)名:參數(shù)值”的“<鍵-值>”對 |
請注意:用戶屬性上傳一定要在用戶賬號上報后。
示例:
QT.onProfileSignIn("張三");
const user = {
gender: "male",
age: "8"
}
QT.sendEvent("$$_user_profile", user);
上述上傳的業(yè)務含義為:張三 男 8歲
全局屬性
全局屬性為每一個事件都會攜帶的屬性
注冊全局屬性
function registerGlobalProperty(globalProperty: any): void
參數(shù) | 含義 |
globalProperty | 要注冊的全局屬性,定義為“屬性名:屬性值”的“<鍵-值>”對。為單層對象結(jié)構(gòu),不支持多層嵌套。 |
注意:
屬性名、string類型的屬性值,只支持大小寫字母、數(shù)字及下劃線。
在Android中,屬性值不支持JavaScript的boolean類型,需要手動在JS中轉(zhuǎn)為0、1。
在Android中,對于全局屬性值為null或undefined的場景,底層Android sdk會過濾這個全局屬性字段,如需要空值分析場景,需自定義默認空值
在iOS中,全局屬性值不支持null和undefined,需要手動過濾。
示例:
QT.registerGlobalProperty({
name: 'MyApp',
description: 'this is a app',
aBoolean: 1, //boolean類型需傳為0或1,
aNull: '', //null或undefined類型需傳空字符串
//默認為number類型,對于返回值為null或undefined場景,需業(yè)務自定義數(shù)值型默認空值
aNumber: 66,
});
刪除特定的全局屬性
function unregisterGlobalProperty(propertyName: string): void
參數(shù) | 含義 |
propertyName | 要刪除的全局屬性名 |
示例:
QT.unregisterGlobalProperty('name'); // 刪除全局屬性name
獲取特定的全局屬性
async function getGlobalProperty(propertyName: string): Promise<any>
參數(shù) | 含義 |
propertyName | 要獲取的全局屬性名 |
示例:
await QT.getGlobalProperty('name'); // 獲取全局屬性name,返回 {name: "MyApp"}
獲取所有全局屬性
async function getGlobalProperties(propertyName: string): Promise<any>
示例:
await QT.getGlobalProperties(); // 獲取所有全局屬性
清除所有全局屬性
function clearGlobalProperties(): void
示例:
QT.clearGlobalProperties(); // 所有全局屬性都被清除(慎用)
頁面瀏覽事件埋點
開發(fā)者如果希望對頁面路徑和頁面停留時長進行采集和統(tǒng)計??梢酝ㄟ^調(diào)用該接口手動埋點
function onPageStart(pageName: string): void
function onPageEnd(pageName: string): void
參數(shù) | 含義 |
pageName | 頁面編碼 |
示例:
QT.onPageStart('MainPage');
QT.onPageEnd('MainPage');
請注意:
onPageStart 是SDK記錄頁面進入的信息,onPageStart不會上報事件,只有調(diào)用onPageEnd的時候才會上報頁面瀏覽事件。
onPageStart和onPageEnd必須成對調(diào)用,且傳值的pageName需要保持一致,如果沒有onPageEnd或者onPageEnd與onPageStart傳值的pageName不一致,則onPageStart記錄的信息不會生效。
頁面屬性上傳
支持給當前頁面附加自定義屬性
function uploadPageProperties(pageName: string, params: EventParams): void
參數(shù):
參數(shù) | 含義 |
pageName | 目標頁面名(頁面編碼),必須和當前頁面名一致。如不一致,函數(shù)執(zhí)行無效。 |
params | 對當前事件的參數(shù)描述,定義為"參數(shù)名:參數(shù)值" 的 "<鍵-值>"對。為單層對象結(jié)構(gòu),不支持多層嵌套。 |
示例:
QT.uploadPageProperties('detail_page', { test: 1 })
請注意:
該接口必須在onPageStart和onPageEnd之間調(diào)用。
屬性名、string類型的屬性值,只支持大小寫字母、數(shù)字及下劃線。
在Android中,屬性值不支持JavaScript的boolean類型,需要手動在JS中轉(zhuǎn)為0、1。
在Android中,對于全局屬性值為null或undefined的場景,底層Android sdk會過濾這個全局屬性字段,如需要空值分析場景,需自定義默認空值
在iOS中,全局屬性值不支持null和undefined,需要手動過濾。
自定義事件埋點
自定義事件可以用于追蹤用戶行為,記錄行為發(fā)生的具體細節(jié)。
使用 sendEvent 接口進行事件的統(tǒng)計,接口如下:
/**
* 自定義事件埋點
* @param eventId 當前統(tǒng)計的事件編碼
* @param params 對當前事件的參數(shù)描述,定義為“參數(shù)名:參數(shù)值”的“<鍵-值>”對
* @param pageName 事件編碼
*/
function sendEvent(eventId: string, params?: any, pageName?: string): void
參數(shù) | 含義 |
eventId | 為當前統(tǒng)計的事件編碼。 |
params | 對當前事件的參數(shù)描述,定義為“參數(shù)名:參數(shù)值”的“<鍵-值>對”。為單層對象結(jié)構(gòu),不支持多層嵌套。 |
pageName | 當前統(tǒng)計事件的頁面編碼 |
示例:
// 攜帶事件參數(shù)的自定義事件
QT.sendEvent(
'event1',
{
name: 'quick tracking',
method: 'func',
},
);
// 攜帶事件參數(shù)和頁面編碼的自定義事件
QT.sendEvent(
'event2',
{
name: 'quick tracking',
method: 'func',
},
'main-page'
);
備注:
多參數(shù)類型事件能滿足原來計算事件/計數(shù)事件的分析場景;
對于計算型事件不同的參數(shù)類型對應不同的計算方式,總共可以分為兩大類,數(shù)值型和字符型
數(shù)字型:支持累加值、最大值、最小值、平均值和去重數(shù)計算
字符型:支持去重數(shù)計算
請注意:
同全局屬性,事件屬性在Android和iOS不同平臺上,也有著類型處理的差異:
在Android中,不支持JavaScript的boolean類型,需要手動在JS中轉(zhuǎn)為0、1。
在Android中,對于全局屬性值為null或undefined的場景,底層Android sdk會過濾這個全局屬性字段,如需要空值分析場景,需自定義默認空值
在iOS中,全局屬性值不支持null和undefined,需要手動過濾。
橋接事件埋點
橋接事件用于h5橋接RN的場景,使用此接口將H5日志發(fā)送至App中。
/**
* 橋接事件埋點
* @param data H5轉(zhuǎn)發(fā)事件的日志體
*/
function sendEventForH5(data: string): void
參數(shù) | 含義 |
data | H5轉(zhuǎn)發(fā)事件的日志體 |
示例:
const content = data.nativeEvent.data;
QT.sendEventForH5(content);
RN App中嵌入h5頁面(RN橋接模式)
H5集成 QuickTracking Web SDK
該步驟請參考:Web SDK
轉(zhuǎn)發(fā)H5端發(fā)送的日志給React Native WebView
<script charset="UTF-8">
...
// sdk接入及配置部分
...
//轉(zhuǎn)發(fā)頁面自定義事件(點擊、元素曝光、其他)
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環(huán)境*/) {
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環(huán)境*/) {
window.ReactNativeWebView.postMessage(JSON.stringify(pvData), '*');
} else {
window.ReactNativeWebView.postMessage(JSON.stringify(pvData));
}
}]
})
</script>
React Native WebView接收消息并調(diào)用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>
);
}
RN 全埋點
需要 QuickTracking ReactNative SDK 2.0.0版本及以上支持
頁面瀏覽事件自動采集
考慮到React Navigation庫自身豐富的場景支持以及在社區(qū)的影響力,在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;
// 設(shè)置頁面編碼
QT.onPageStart(currentRouteName);
}}
onStateChange={() => {
const previousRouteName = routeNameRef.current;
const currentRouteName = navigationRef.getCurrentRoute()?.name;
// 按需設(shè)置頁面屬性(可選)
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>
)
}
控件點擊事件自動采集
在待埋點項目路徑下執(zhí)行node命令
node node_modules/react-native-quicktracking-analytics-module/src/hook.js -run
注:如果需要恢復原始文件,可以執(zhí)行 reset 命令
node node_modules/react-native-quicktracking-analytics-module/src/hook.js -reset
忽略RN控件全埋點采集
由于存在混合開發(fā)的場景,支持單獨關(guān)閉React Native控件點擊事件的自動采集,在待埋點項目的package.json中增加QTSDKConfig配置:
{
"name": "reactnative_demo",
"QTSDKConfig": {
"enableAutoCLK": true
}
}
enableAutoCLK字段取值含義:
true 開啟RN控件自動采集
false 關(guān)閉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);
...
}
...
}
設(shè)置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>