全部產品
Search
文件中心

Quick Tracking:埋點API

更新時間:Jul 16, 2025

1 如何查看埋點方案

在進行埋點前,需要確定在哪裡埋點、埋哪些點等,即需要梳理清楚明確的埋點需求。在QuickTracking平台中將明確的埋點需求稱為埋點方案,並為埋點方案設計了規範模板。如下:

image

在埋點方案中,明確的所需埋點內容有:

1、事件主體:指“誰”觸發了這個事件,分為裝置ID帳號ID,上報的事件務必具備其中之一。

  • 裝置ID:Android裝置和iOS裝置的預設裝置ID為應用層級唯一的裝置ID,由Quicktracking自動產生

    • Android9及以下裝置:SDK自動採集imei、wifimac、androidid、SN產生裝置ID,產生後存入本地,只有卸載應用或者刪除應用資料才會重建裝置ID。

    • Android10級以上裝置:SDK自動採集oaid、gaid、androidid、SN產生裝置ID,產生後存入本地,只有卸載應用或者刪除應用資料才會重建裝置ID。

    • iOS裝置:SDK自動採集openudid產生裝置ID,產生後放入keychain中,只有恢復出廠預設值或者刪除應用資料才會重建裝置ID。

    • 使用應用的C端使用者同意採集idfa和oaid,QuickTracking SDK才會採集,只有QuickTracking app SDK可以採集到oaid、gaid、imei、wifimac、androidid、SN、idfa、idfv。

  • 帳號ID:用戶端使用者登入後帳號標識,當一個使用者在不同的裝置進行登入時,裝置ID會發生變化,但是帳號ID不會發生變化。例如一個使用者使用手機和pad分別登入。

2、使用者屬性:針對帳號ID的屬性,例如帳號ID為“testdemo@111”的使用者,“生日”為“1999-02-13”,“會員等級”為“鉑金”等。“生日”和“會員”等級就為使用者屬性。

3、渠道屬性:廣告投放的屬性,例如投放渠道、投放方式、投放內容等。

4、全域屬性:在全域設定一次後,每一個事件都會攜帶的屬性

5、頁面瀏覽事件:頁面載入時上報的事件(埋點方案中頁面編碼和事件編碼相等的事件,也是標記為藍色的事件)

6、點擊、曝光、自訂事件:用戶端使用者與用戶端發生任意互動時上報的事件。

2 設定裝置ID&帳號ID

2.1 裝置ID設定

SDK 內部預設會採集如下參數。

裝置標識或裝置資訊

採集方法

備忘

idfa

[ASIdentifierManager advertisingIdentifier].UUIDString

蘋果廣告標識

idfv

[[UIDevice currentDevice].identifierForVendor UUIDString]

應用級標識

openudid

[UIPasteboardpasteboardWithName:slotPBid create:NO]

openUdid(三方)

淘寶utdid

[UTDevice utdid]

若您整合了淘寶utdid SDK,QuickTracking才會採集

mcc

[UMUtils mccString]

移動訊號國家碼

mnc

[UMUtils mncString]

移動網路編號

如果開發人員希望針對上表中的某幾個裝置標識符採集行為做控制,如:不採集或自行實現採集方法。可以實現對應block回調,如下樣本:

[QTConfigure customSetIdfaBlock:^NSString *{
  return @"";
}];
[QTConfigure customSetIdfvBlock:^NSString *{
  return @"";
}];
[QTConfigure customSetOpenUdidBlock:^NSString *{
  return @"custom-openudid";
}];
[QTConfigure customSetUtdidBlock:^NSString *{
  return @"custom-utdid";
}];
[QTConfigure customSetMccBlock:^NSString *{
  return @"custom-mcc";
}];
[QTConfigure customSetMncBlock:^NSString *{
  return @"custom-mnc";
}];

注意:請謹慎決定是否實現對應方法,一旦您選擇自己實現採集方法,此裝置標識的採集工作就由你全權接管了,SDK不會再試圖採集此裝置標識。SDK能採集到的裝置標識越少,對統計資料的準確性和穩定性的負面影響越大。

// 請在設定收數網域名稱之前,調用SDK預初始化函數之前,先調用採集工具類註冊函數
// 如果不需要對裝置標識採集行為做控制,就不需要實現自訂工具類並註冊它
[QTConfigure customSetIdfvBlock:^NSString *{
    return [[UIDevice currentDevice].identifierForVendor UUIDString];
}];
[QTConfigure setCustomDomain:@"您的收數網域名稱" standbyDomain:nil];
[QTConfigure initWithAppKey:@"您的appkey" channel:@"App Store"];

SDK支援自訂裝置ID,如果要使用自訂裝置ID需要在初始化前(即init前) 設定setCustomDeviceId:介面為有效值(非空)。

+ (void)setCustomDeviceId:(NSString *)devID;

使用樣本:

[QTConfigure setCustomDeviceId:@"xxxxxx"];

注意:因該功能在未擷取到裝置ID時生效,如果本地已存在裝置ID,設定後無效。如果本地已擷取到裝置ID可以通過卸載重裝方式驗證此功能。

2.2 帳號ID設定

1、QT在統計使用者時以裝置為標準,如果需要統計應用自身的帳號,請使用以下介面:

介面函數:

+ (void)profileSignInWithPUID:(NSString *)puid;

參數:

參數

類型

描述

備忘

puid

NSString

使用者帳號ID

長度小於64位元組

注意:帳號ID設定後將被存入本機存放區,只有卸載App、清空應用資料或者調用下述的登出介面時,帳號ID才會失效,否則每一個事件都將攜帶帳號ID。

範例程式碼:

[QTMobClick profileSignInWithPUID:@"UserID"];

如果不再需要綁定使用者帳號,可以調用登出介面,調用後,不再發送帳號相關內容。

+ (void)profileSignOff;

範例程式碼:

[QTMobClick profileSignOff];

2.3 裝置ID擷取

介面函數:

+ (NSString *)umidString;

範例程式碼:

NSString *deviceID = [QTConfigure umidString];

3 使用者屬性上傳

1、使用事件編碼固定為"$$_user_profile"的自訂事件上傳,該事件所攜帶的事件屬性會被作為使用者屬性放在使用者表中。

NSDictionary *dict = @{@"sex" : @"girl", @"age" : @"8"};
[QTMobClick event:@"$$_user_profile" attributes:dict];

請注意:使用者屬性上傳一定要在帳號統計調用後

4 渠道屬性

渠道屬性生效後,後續觸發的所有事件都將自動包含這些屬性,並且這些屬性及屬性值存入緩衝,APP進程結束後清除。在分析資料時,可根據此屬性進行查看和篩選。

4.1 H5連結喚起App

  1. 喚起App的URL Scheme中攜帶這些渠道屬性,且屬性key務必以“utm_”開頭,因為SDK識別的關鍵字為“utm_”。例如:<URL scheme>?utm_channel=gzh

  2. 添加您的 URL Scheme 到專案中,URL Scheme 位於專案設定 target ->選項卡 Info ->URL Types。填入的scheme。在AppDelegate中調用函數[MobClick handleUrl:url]來接收 URL

AppDelegate調用:

- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
 if ([QTMobClick handleUrl:url]) {
 return YES;
 }

 return YES;
}

SceneDelegate調用:

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {

 for (UIOpenURLContext *context in connectionOptions.URLContexts) {
 [QTMobClick handleUrl:context.URL];
 }
}

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {

 [QTMobClick handleUrl:URLContexts.allObjects.firstObject.URL];
}

PS:如果渠道屬性已經與市面上渠道投放公司進行了合作,無法使用utm_開頭,可以使用全域屬性API將渠道屬性進行埋點上報(屬性key依然需要以“utm_”開頭)。

4.2 H5連結喚起應用市場下載並啟動App

該情境下,如果僅是H5連結中攜帶“utm_”參數,已經無法做到下載App後的啟動事件攜帶“utm_”參數。所以需要進行“H5喚起事件”與“應用啟用事件”做關於“IP地址和瀏覽器UserAgent”的模糊比對。

  1. 當使用者在H5中點擊「喚起/下載App」的按鈕時,上報“應用喚起事件($$_app_link)”,在事件中需要攜帶喚起App的appkey和渠道屬性。

//樣本
aplus_queue.push({
  action:'aplus.recordAppLink',
  arguments:[{
    targetAppKey: '要喚起的應用appKey',  // 必填,要喚起的應用appKey
    custom1: 'custom1', // 選填,自訂參數
    ...
  }]
})
  1. App下載後的第一次啟動事件“應用啟用事件($$_app_install)”由QT App SDK自動採集上報。

  2. QuickTracking系統進行應用喚起事件($$_app_link)和應用啟用事件($$_app_install)關於“IP地址和瀏覽器UserAgent”的模糊比對。您使用時,可以直接在app應用中分析“應用啟用(預置)”的渠道屬性即可。

4.3 App各應用市場活躍資料統計

在初始化函數中的第二個入參Channel即為設定該應用的應用市場:[QTConfigure initWithAppkey:@"您的appkey" channel:@"App Store"];,在分析中可使用“系統屬性-升級渠道”查看。

5 全域屬性

註冊全域屬性後,後續觸發的所有事件都將自動包含這些屬性,並且這些屬性及屬性值儲存在記憶體中,APP進程結束後清除。在分析資料時,可根據此屬性進行查看和篩選。

5.1 註冊全域屬性

/**
 * 設定全域屬性 索引值對 
 * 如果和已經存在的全域屬性key重複,則更新已有值
 * 如果和已經存在的全域屬性key不一致,則插入新的全域屬性
 */
+(void) registerGlobalProperty:(NSDictionary *)property;

參數

類型

描述

備忘

property

NSDictionary

全域屬性的屬性名稱和屬性值

-

樣本:

NSDictionary *firstPropertyDict = @{
     @"a" : @"1",
     @"b" : @"2"
};
[QTMobClick registerGlobalProperty:firstPropertyDict];//當前globalproperty為a:1和b:2
    
NSDictionary *secondPropertyDict = @{
     @"b" : @"3",
     @"c" : @"4"
};
[QTMobClick registerGlobalProperty:secondPropertyDict];//當前globalproperty為a:1、b:3和c:4

5.2 擷取一個全域屬性

/**
 * 擷取一個全域屬性;如果不存在,則返回空。
 */
+(NSString *) getGlobalProperty:(NSString *)propertyName;

參數

類型

描述

備忘

propertyName

NSString

屬性名稱,只支援大小寫字母、數字及底線!

-

傳回值

NSString

-

5.3 刪除一個全域屬性

刪除一個特定的全域屬性,刪除後,後續觸發的所有事件都不再攜帶該屬性。

/**
 *
 * 刪除指定全域屬性
 @param key
 */
+(void) unregisterGlobalProperty:(NSString *)propertyName;

參數

類型

描述

備忘

propertyName

NSString

屬性名稱,只支援大小寫字母、數字及底線!

-

5.4 擷取所有全域屬性

/**
 * 擷取所有全域屬性;如果不存在,則返回空。
 */
+(NSDictionary *)getGlobalProperties;

參數

類型

描述

備忘

傳回值

NSDictionary

返回的全域屬性實值型別為字元型,必須和註冊此全域屬性時傳入參數類型一致。

-

5.5 清除所有的全域屬性

/**
 * 清空所有全域屬性。
 */
+(void)clearGlobalProperties;

6 頁面瀏覽事件API

SDK提供頁面自動採集和頁面手動採集兩種方式上報頁面瀏覽事件,兩種方式也可以混用。

6.1 頁面自動採集

頁面自動採集是hook系統viewWillAppear和viewWillDisappear,擷取className 實現。SDK預設不開啟頁面自動採集,如果需要開啟,建議在初始化之前調用。

介面函數:

+ (void)setAutoPageEnabled:(BOOL)value;

參數

類型

描述

備忘

value

BOOL

是否開啟頁面自動採集

  • YES:開啟

  • NO:關閉 (預設關閉)

範例程式碼:

//設定為開啟頁面自動採集
[QTMobClick setAutoPageEnabled:YES];

6.1.1 禁止單個頁面的自動上報

如果全域設定了開啟頁面自動採集,可以通過此介面設定跳過單個頁面的自動採集。建議在viewWillAppear最開始調用,如只不統計當前自動頁面採集,可以將pageName參數設定成nil。

介面函數:

+ (void)skipMe:(id)PageObject pageName:(NSString *)pageName;

樣本:

#import <QTCommon/UMSpmHybrid.h>

- (void)viewWillAppear:(BOOL)animated
{
  
    [super viewWillAppear:animated];

    //不統計當前class自動頁面採集
    [UMSpmHybrid skipMe:[self class] pageName:nil];
}

6.2 頁面手動採集

介面函數:

/** 自動頁面時間長度統計, 開始記錄某個頁面展示時間長度.
 使用方法:必須配對調用beginLogPageView:和endLogPageView:兩個函數來完成自動統計,若只調用某一個函數不會產生有效資料。
 在該頁面展示時調用beginLogPageView:,當退出該頁面時調用endLogPageView:
 @param pageName 統計的頁面名稱.
 @return void.
 */
+ (void)beginLogPageView:(NSString *)pageName;

/** 自動頁面時間長度統計, 結束記錄某個頁面展示時間長度.
 使用方法:必須配對調用beginLogPageView:和endLogPageView:兩個函數來完成自動統計,若只調用某一個函數不會產生有效資料。
 在該頁面展示時調用beginLogPageView:,當退出該頁面時調用endLogPageView:
 @param pageName 統計的頁面名稱.
 @return void.
 */
+ (void)endLogPageView:(NSString *)pageName;

參數:

參數

類型

描述

備忘

pageName

NSString

統計的頁面編碼

beginLogPageView 和 endLogPageView中的值必須一致

注意:

  • 必須配對調用beginLogPageView:和endLogPageView:兩個函數來完成自動統計,若只調用某一個函數不會產生有效資料;

  • 在該頁面展示時調用beginLogPageView:,當退出該頁面時調用endLogPageView:。

範例程式碼:

在ViewController類的viewWillAppear: 和 viewWillDisappear:中配對調用如下方法:

- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];
 [QTMobClick beginLogPageView:@"Pagename"]; //("Pagename"為頁面名稱,可自訂)
}

- (void)viewWillDisappear:(BOOL)animated 
{
 [super viewWillDisappear:animated];
 [QTMobClick endLogPageView:@"Pagename"];
}

您也可以根據您自己的業務情境,在viewDidAppear:和viewDidDisappear:等方法中配對調用beginLogPageView:和endLogPageView:兩個函數來完成自動統計。

6.2.1 頁面屬性設定

iOS端頁面屬性設定介面updatePageProperties,支援給當前頁面附加自訂屬性。 介面:

/**
 * @brief 更新頁面業務參數.
 *
 * @param pageName 頁面名稱,如Page_Detail
 * @param pProperties 業務參數,kv對
 *
 * @warning 調用說明:必須在viewWillDisappear之前調用
 *
 * 最佳位置:在viewWillDisappear之前調用即可
 */
+(void) updatePageProperties:(NSString *)pageName properties:(NSDictionary *) pProperties;

參數:

參數

類型

描述

備忘

pageName

NSString

頁面編碼,如Page_Detail

pProperties

NSDictionary

業務參數,kv對

請注意:請在調用beginLogPageView之後設定頁面屬性。

引入標頭檔:

#import <QTCommon/UMSpm.h>

樣本:

[UMSpm updatePageProperties:@"page_home" properties: @{@"page_home_key":@"page_home_val"}];

請注意:頁面屬性設定只支援頁面手動埋點

6.2.2 透傳頁面屬性

此外,QuickTracking SDK還提供透傳頁面屬性埋點介面updateNextPageProperties,支援給下一個頁面附加自訂屬性。

/**
 * @brief  更新下一個頁面業務參數.
 *
 * @param properties 傳給下一個頁面業務參數,kv對
 *
 * @warning  調用說明:必須在下一個頁面pageAppear之前調用,否則會攜帶錯誤
 *
 * 最佳位置:必須在下一個頁面pageAppear之前調用
 */
+(void) updateNextPageProperties:(NSDictionary *) properties;

參數:

參數

類型

描述

備忘

properties

NSDictionary

傳給下一個頁面業務參數,kv對

樣本:

必須在下一個頁面beginLogPageView之前調用。

[UMSpm updateNextPageProperties:@{@"news_next_key":@"news_next_val"}];

請注意:透傳頁面屬性只支援頁面手動埋點

7 事件埋點

自訂事件可以用於追蹤使用者行為,記錄行為發生的具體細節。

7.1 事件埋點

介面:

+ (void)event:(NSString *)eventCode; 

+ (void)event:(NSString *)eventCode attributes:(NSDictionary *)attributes;

+ (void)event:(NSString *)eventId pageName:(NSString *)pageName attributes:(NSDictionary *)attributes;

參數說明:

參數

類型

描述

備忘

eventCode

NSString

事件編碼

埋點方案中點擊、曝光、自訂事件的事件編碼

attributes

NSDictionary

自訂屬性

-屬性中的key的value不可以是空

-value的類型只能是String、Long、Integer、Float、Double、Short,或數組(數組中的元素必須為String)類型。

pageName

NSString

頁面編碼

事件所在頁面,埋點方案中點擊、曝光、自訂事件的所在頁面編碼。

事件上傳數量限制:

  • 自訂屬性key字串長度上限:1024

  • 自訂屬性value字串長度上限:1024*4

  • 自訂屬性map長度(參數個數):100 個索引值對

  • 當自訂屬性值value為數組元素時,屬性值的數組長度上限:100

  • 單條日誌報文的總長度限制:2MB

樣本1:

統計應用中”轉寄”事件發生的次數,那麼在轉寄的函數裡調用:

[QTMobClick event:@"Forward"];

樣本2:

統計應用中“購買”事件發生的次數,以及購買的商品類型及數量,那麼在購買的函數裡調用:

NSDictionary *dict = @{@"type" : @"book", @"quantity" : @"3"};
[QTMobClick event:@"purchase" attributes:dict];

樣本3:

NSDictionary *dict = @{@"type" : @"book", @"quantity" : @"3"};
[QTMobClick event:@"purchase" pageName:@"ViewController" attributes:dict];

8 全埋點(自動埋點)

8.1 全埋點適用範圍

SDK適用於iOS 8.0及以上作業系統。

8.2 全埋點介面說明

8.2.1 自動頁面採集介面

說明

自動採集頁面是hook系統viewWillAppear和viewWillDisappear,擷取className 實現,建議在初始化之前調用,預設是關閉

/** 設定是否自動採集頁面, 預設NO(不自動採集).
 @param value 設定為YES, QT SDK 會自動採集頁面資訊
 */
+ (void)setAutoPageEnabled:(BOOL)value;

樣本:

 [QTMobClick setAutoPageEnabled:YES];
 //設定網域名稱
 [QTConfigure setCustomDomain:@"您的收數網域名稱" standbyDomain:nil]; 
 //初始化appkey
 [QTConfigure initWithAppkey:@"您應用的appKey" channel:@"App Store"];

關閉某個頁面的自動頁面採集

/**
 * @brief                   跳過當前頁面統計.
 *
 * @param     PageObject    容器物件(自動擷取頁面時使用,預設手動可填nil)
 * @param     pageName      頁面名稱(手動設定頁面時使用,當設定自動擷取頁面時可填nil)
 * @warning                 建議在設定頁面之前調用此介面,調用後設定的native頁面將不發送資料
 *                          
 */
+ (void)skipMe:(id)PageObject pageName:(NSString *)pageName;

樣本:

[UMSpmHybrid skipMe:self pageName:nil];

8.2.2 開啟控制項點擊資料全埋點

說明

自動採集事件是:

  • hook系統sendAction:to:from:forEvent:實現控制項執行方法監測

  • 監聽addGestureRecognizer:實現所有點擊行為

  • hook tableView:didSelectRowAtIndexPath:支援tableView的點擊行為

  • hook collectionView:didSelectItemAtIndexPath: 支援collectionView的點擊行為

建議在初始化之前調用,預設是關閉

/** 設定是否自動採集點擊事件, 預設NO(不自動採集)
 @param value 設定為YES, QT SDK 會將自動採集點擊事件
 */
+ (void)setAutoEventEnabled:(BOOL)value;

樣本:

 [QTMobClick setAutoEventEnabled:YES];
 //設定網域名稱
 [QTConfigure setCustomDomain:@"您的收數網域名稱" standbyDomain:nil]; 
 //初始化appkey
 [QTConfigure initWithAppkey:@"您應用的appKey" channel:@"App Store"];

支援的控制項:

控制項名稱

備忘

UITableView

UICollectionView

UIImageView

有加UITapGestureRecognizer行為的才可以

UILabel

有加UITapGestureRecognizer行為的才可以

UIButton

UISwitch

UIStepper

UISegmentedControl

UISlider

UIPageControl

UITabBarItem

UIBarButtonItem

忽略某個容器的點擊事件

/**
 * @abstract
 * 忽略某一頁面的點擊
 *
 * @param PageObject 對應容器
 */
+(void)ignorePageView:(id)PageObject;

例:

// 該方法支援多次調用,對合集進行忽略    
[QTAutoTrack ignorePageView:self];

忽略特定類型控制項點擊事件的自動採集

通過 ignoreViewType 方法忽略特定類型控制項點擊事件的自動採集。

/**
 * @abstract
 * 忽略某一類型的點擊
 *
 * @param aClass View 對應的 Class
 */
+(void)ignoreViewType:(Class)aclass;

樣本:

// 該方法支援多次調用,對合集進行忽略    
[QTAutoTrack ignoreViewType:[UIButton class]];    
[QTAutoTrack ignoreViewType:[UISwitch class]];

忽略特定控制項點擊事件的自動採集

通過 UMAnalyticsIgnoreView 方法忽略特定控制項點擊事件的自動採集。

button.UMAnalyticsIgnoreView=YES;

8.2.3 版面設定自訂資訊

版面設定自訂編碼

通過實現 -(NSString *)getUMPageName 方法,返回一個自訂編碼

-(NSString *)getUMPageName
{
   return @"testPageCode";
}

版面設定自訂屬性

通過實現 -(NSDictionary *)getUMPageProperties 方法,給版面設定自訂屬性

-(NSDictionary *)getUMPageProperties
{
   return @{@"key1":@"val1",@"key2":@"val2"};
}

版面設定來源(page_referrer)資訊

通過實現 -(NSString *) getUMScreenUrl 方法,返回一個自訂來源資訊

- (NSString *)getUMScreenUrl {
    return @"um//um/page";
}

8.2.4 設定控制項點擊事件自訂屬性

通過該方法,可以對特定控制項設定自訂屬性,自訂屬性可以設定多個索引值對,Key和Value都需要是字串類型。自訂屬性和值會包含在此控制項全埋點點擊事件數目據中。

button.UMAnalyticsViewProperties=@{@"key11":@"val11"};

控制項設定Event Code

通過該方法,可以對特定控制項設定事件編碼

button.UMAnalyticsEventCode=@"abcd123";

8.3 曝光埋點

說明

本功能在SDK1.7.0.PX及以上版本支援,詳情可以參考iOS SDK更新日誌

使用自動曝光埋點功能時,使用者需要在配置項手動開啟自動曝光功能(預設關閉

// 開啟曝光統計
[QTConfigure setAutoExposureEnabled:YES showMonitorVerboseLog:NO];

當然您也可以在需要的時候關閉自動曝光功能

// 關閉曝光統計
[QTConfigure setAutoExposureEnabled:NO showMonitorVerboseLog:NO];

參數說明:

參數

類型

備忘

exposureEnabled

BOOL

是否開啟曝光自動採集,預設為NO,即關閉元素曝光監聽

showMonitorVerboseLog

BOOL

元素曝光監聽的冗餘日誌開關,預設為NO,用於查看監聽曝光時機的改變

8.4.1 曝光配置項

#import <QTCommon/QTCommon.h>

// 通用曝光設定
QTExposureConfig *config = [[QTExposureConfig alloc] initWithVisibleAreaThreshold:0 exposureDurationThreshold:0 allowRepeatExposure:YES];
[QTConfigure setExposureConfig:config];

QTExposureConfig為曝光配置屬性其詳細參數如下:

參數

類型

描述

visibleAreaThreshold

CGFloat

最小曝光比率,預設值 0.5f,曝光範圍是 0~1f;

  • 當為 0.0f 時為元素曝光任意像素可見即可觸發曝光埋時間點事件

  • 當為 1.0f 時為元素曝光完全可見才能觸發曝光埋時間點事件

exposureDurationThreshold

NSTimeInterval

有效曝光時間長度,最小支援0.3,預設值是0.3,即展示超過該時間才觸發一次曝光行為

allowRepeatExposure

BOOL

是否重複曝光,預設值是 YES;

  • 當為 YES 時如果元素被隱藏,那麼下次出現並滿足曝光條件時會觸發一次曝光

  • 當為 NO 時如果元素被隱藏,那麼下次出現並滿足曝光條件時不會再次觸發曝光

8.4.1 設定全域曝光配置

通過setExposureConfig方法可以設定全域曝光屬性,建議在初始化SDK之前調用

#import <QTCommon/QTCommon.h>

[QTConfigure setExposureConfig:config];

8.4.2 標記曝光元素

要使用曝光功能,您需要手動綁定曝光元素,您可以調用addViewForExposure方法來實現曝光元素的綁定

//添加曝光視圖
+ (void)addViewForExposure:(UIView *_Nullable)view withData:(QTExposureData *_Nullable)data;

參數說明:

參數

類型

備忘

view

UIView

需要統計曝光的視圖對象

data

QTExposureData

曝光資料詳細說明如下表

QTExposureData API:

/// 封裝曝光事件的資料,包括事件名稱、自訂屬性、曝游標識符和曝光配置
@interface QTExposureData : NSObject

// 曝光配置
@property (nonatomic, copy) QTExposureConfig *exposureConfig;

// 自訂事件屬性
@property (nonatomic, strong) NSDictionary<NSString *, id> *properties;

// 事件名稱
@property (nonatomic, copy) NSString *event;

// view 的唯一標誌
@property (nonatomic, copy, readonly) NSString *exposureIdentifier;

@property (nonatomic, weak) id<QTExposureListener> exposureListener;

// 初始化方法
- (instancetype)initWithEvent:(NSString *)event properties:(NSDictionary<NSString *, id> *)properties exposureConfig:(QTExposureConfig *)exposureConfig exposureIdentifier:(NSString *)exposureIdentifier;

@end

參數說明:

參數

類型

描述

event

NSString

事件名(必傳)

properties

NSDictionary<NSString *, id>

曝光事件屬性 (可選)

exposureConfig

QTExposureConfig

曝光配置 (可選,預設使用全域配置)

exposureIdentifier

NSString

元素的唯一標識

普通元素標記

範例程式碼:

#import <QTCommon/QTCommon.h>

// 構造曝光資料
QTExposureData *data = [[QTExposureData alloc] initWithEvent:@"test_item_exp" properties:nil exposureConfig:nil exposureIdentifier:nil];
[QTMobClick addViewForExposure:view withData:data];
列表類元素標記

標記全部元素

#import <QTCommon/QTCommon.h>

QTExposureConfig *config = [[QTExposureConfig alloc] initWithVisibleAreaThreshold:0 exposureDurationThreshold:0 allowRepeatExposure:YES];
QTExposureData *data = [[QTExposureData alloc] initWithEvent:@"test_whole_tableview_exp" properties:@{
    @"tableviewName":@"xxxx"
} exposureConfig:config exposureIdentifier:nil];
[QTMobClick addViewForExposure:self.tableView withData:data];

標記單個元素:

說明

列表單個元素往往會元素複用、元素位置變更(重新整理、刪除、添加等),建議在曝光資料增加 exposureIdentifier 欄位並確保ID的唯一性

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"exposureCell"];
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
    label.text = [NSString stringWithFormat:@"session:%ld", (long)indexPath.section];
    [cell addSubview:label];
    
    UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(160, 0, 100, 20)];
    label2.text = [NSString stringWithFormat:@"row:%ld", (long)indexPath.row];
    [cell addSubview:label2];
    
    QTExposureData *data;
    // 定義曝光事件的事件編碼
    NSString *cell_exp_eventcode = [NSString stringWithFormat:@"exposure_cell_%ld_%ld", indexPath.section, (long)indexPath.row];
    // 定義元素需要曝光的屬性字典
    NSDictionary *properties = @{ @"cell_image_name": @"xxxx" };
    // 定義曝光元素的唯一標識
    NSString* uniqueExpItemId = @"xxxx";
    // 定義列表單個元素的曝光時機控制
    // 預設元素在視口地區超過50%,元素出現300ms
    // 是否需要重複曝光,請根據業務需要自訂
    QTExposureConfig* expItemConfig = [[QTExposureConfig alloc] initWithVisibleRadio:0.5 exposureMinDuration:0.3 allowRepeatExposure:YES];
    //組裝曝光資料
    data = [[QTExposureData alloc] initWithEvent:cell_exp_eventcode
                                      properties:properties
                                  exposureConfig:expItemConfig
                              exposureIdentifier:uniqueExpItemId];
    /* 其他可選 曝光資料配置API
    
    data = [[QTExposureData alloc] initWithEvent:cell_exp_eventcode
                                      properties:properties];
    
    data = [[QTExposureData alloc] initWithEvent:cell_exp_eventcode
                                  exposureConfig:expItemConfig
                              exposureIdentifier:uniqueExpItemId];
    
    data = [[QTExposureData alloc] initWithEvent:cell_exp_eventcode
                                      properties:properties
                              exposureIdentifier:uniqueExpItemId];
    
    data = [[QTExposureData alloc] initWithEvent:cell_exp_eventcode
                                      properties:properties
                                  exposureConfig:expItemConfig];
     
    */
   
    [QTMobClick addViewForExposure:cell withData:data];
    
    return cell;
}

8.4.3 移除曝光元素

元素本身被移除即會移除對應埋點監控(如刪除某一列表)

當然您可以使用removeViewForExposure來移除不需要曝光採集的元素

[QTMobClick removeViewForExposure:view withExposureIdentifier:nil];

9 分享裂變

分享裂變是增長駭客策略的一個關鍵概念,它依靠使用者之間的社交聯絡來實現資訊的相互傳遞,從而促進新使用者的擷取。

完成分享裂變的SDK功能整合,您將可以使用QuickTracking平台分享趨勢模型,通過分享迴流相關指標衡量營銷活動的拉新效益。

  1. 支援查看TOP分享使用者和不同分享迴流層級的分享迴流效果指標。

  2. 支援迴流指標靈活組合配置,查看最具裂變拉新能力和分享迴流轉化能力的TOP使用者,追蹤使用者分享裂變鏈路與分享迴流關係,快速定位關鍵意見消費者。

9.1 擷取來源分享參數

/*
 * 來源分享參數擷取 API
 * return @{ @"$$_ref_share_id": @"xxxxx", @"$$_ref_share_url": @"xxxxx"}
 **/

+(nullable NSDictionary *)getRefShareParams;

版本要求

iOS sdk 在v1.5.0.PX 版本及以上

功能

當被分享人開啟app時,用於擷取來源分享id 和來源分享 URL 的 API

請求參數

返回參數

預設返回空字典{},如果有值時返回如下:

參數

類型

預設值

含義

備忘

$$_ref_share_url

String

""

不包含分享 id 的來源分享 URL

$$_ref_share_id

String

""

來源分享 id

調用樣本

-(void)onShare {
    __weak typeof(self) weakSelf = self;
    NSDictionary* refShareParams = [QTMobClick getRefShareParams];
    NSString* $$_ref_share_id = [refShareParams objectForKey:@"$sid"];
    
    [QTMobClick requestShareParams:@"https://www.lydaas.com/?utm_source=share" params:@{
        @"title": @"這是一個分享標題",
        @"campaign":@"這是一個分享活動",
        @"shareId": $$_ref_share_id
    } timeout:0 shareResultHandler:^(id  _Nullable result, NSError * _Nullable error) {
        NSLog(@"result === %@", result);
        if (error) {
            NSLog(@"error === %@", error);
        }
        __block NSString *shareId = [(NSDictionary*)result objectForKey:@"$sid"];
        
        NSDictionary *dict = @{
            @"$$_share_id": shareId,
            @"$$_share_url" : @"https://www.lydaas.com/?utm_source=share",
            @"$$_share_title" : @"分享活動A",
            @"$$_share_campaign_id" : @"這是一個自訂分享活動",
            @"$$_share_type" : @"使用者自訂分享平台"
        };
        [QTMobClick event:@"$$_share" attributes:dict];
        dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertController *alertController = [UIAlertController 
                alertControllerWithTitle:@"分享參數" message:[NSString 
                stringWithFormat:@"請求分享參數結果如下:\n\n {\n $sid:%@ \n} \n", shareId] 
                preferredStyle:UIAlertControllerStyleAlert];
            // 建立UIAlertAction
            UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"知道了" 
                style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                // 點擊確定按鈕後的處理
                NSLog(@"使用者已複製");
                UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
                pasteboard.string = shareId;
            }];
            [alertController addAction:confirmAction];
            [weakSelf presentViewController:alertController animated:YES completion:nil];
        });
    }];
}

9.2 請求分享參數

#import <QTCommon/MobClick.h>

/*
 * 分享參數擷取API
 * @param url, 分享頁面的URL,必須傳入
 * @param params 可能的分享參數,可以為null
 * {
 *   @"title": 分享標題, //可為null,最大長度 4*1024
 *   @"shareId": 來源分享Id, //可為 null
 *   @"campaign": 分享活動, //可為 null,最大長度 4*1024
 *   ... 待擴充
 * }
 * @param timeout 請求逾時時間,單位秒,有效值範圍:0~10(包含0和10),如果傳入0,則使用sdk內部預設值3秒
 * @param shareResultHandler 結果回調對象,必須傳入,不能為null
 */

+(void)requestShareParams:(nonnull NSString *)url
                   params:(nonnull NSDictionary *)params
                  timeout:(int)timeout
       shareResultHandler:(nonnull QTShareResultHandler)shareResultHandler;

版本要求

iOS SDK 在v1.5.0.PX 版本及以上

功能

請求用於構建分享鏈需要的分享id

請求參數

參數

類型

預設值

含義

備忘

url

NSString

nil

分享頁面的 URL

必須傳入,不能為 nil

params

NSDictionary

nil

分享參數擷取 API 請求參數

  • 選擇性參數

campaign:分享活動標識。String 類型,預設值為 "",最大長度為 4*1024 個字元

title:分享標題。String類型,預設值為 "",最大長度為 4*1024個長度

shareId:來源分享Id。String 類型,預設值為""

timeout

int

0

介面逾時時間

取值範圍1~10,單位為秒。 sdk 預設逾時時間為3秒

shareResultHandler

QTShareResultHandler

nil

結果回調對象

必須傳入,不能為 nil

註:此結果回調上下文為SDK內部網路請求後台背景工作執行緒,如果需要在回調方法中操作UI控制項,請通過UI線程Handler執行相關操作

返回參數

參數

類型

預設值

含義

備忘

result

NSDictionary

nil

分享參數 API 請求結果

包含一個屬性

$sid, NSString 類型, 分享id

error

NSError

nil

分享參數 API 請求報錯

調用樣本

-(void)onShare {
  __weak typeof(self) * weakSelf = self;
 	[QTMobClick requestShareParams:@"https://www.lydaas.com/?utm_source=share" 
   	params:@{
     @"title": @"這是一個分享標題",
     @"campaign":@"這是一個分享活動",
     @"shareId": @"這是一個分享 id"
     } 
   timeout:0 
   shareResultHandler:^(id  _Nullable result, NSError * _Nullable error) {
     NSLog(@"result === %@", result);
     if (error) {
       NSLog(@"error === %@", error);
     }
     __block NSString *shareId = [(NSDictionary*)result objectForKey:@"$sid"]; 
     NSDictionary *dict = @{
       @"$$_share_id": shareId, 
       @"$$_share_url" : @"https://www.lydaas.com/?utm_source=share",
       @"$$_share_title" : @"分享活動A",
       @"$$_share_campaign_id" : @"這是一個自訂分享活動",
       @"$$_share_type" : @"使用者自訂分享平台"
     };
     [QTMobClick event:@"$$_share" attributes:dict];
     dispatch_async(dispatch_get_main_queue(), ^{
       UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"分享參數"
                                             message:[NSString stringWithFormat:
                                             @"請求分享參數結果如下:\n\n {\n $sid:%@ \n} \n", shareId] 
                                             preferredStyle:UIAlertControllerStyleAlert];
       // 建立UIAlertAction
       UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"知道了"
                                       style:UIAlertActionStyleDefault
                                       handler:^(UIAlertAction * _Nonnull action) {
                                         // 點擊確定按鈕後的處理
                                         NSLog(@"使用者已複製");
                                         UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
                                         pasteboard.string = shareId;                                                     
                                       }];
       [alertController addAction:confirmAction];
       [weakSelf presentViewController:alertController animated:YES completion:nil];
     });
   }];
}

9.3 上報分享事件

通過預置事件編碼 $$_share 上報分享事件

樣本:

[QTMobClick requestShareParams:@"https://www.lydaas.com/?utm_source=share"
                        params:@{
    @"title": @"這是一個分享標題",
    @"campaign":@"這是一個分享活動",
    @"shareId": @"這是一個分享 id"
}
                        timeout:0
            shareResultHandler:^(id  _Nullable result, NSError * _Nullable error) {
    NSLog(@"result === %@", result);
    if (error) {
        NSLog(@"error === %@", error);
    }
    __block NSString *shareId = [(NSDictionary*)result objectForKey:@"$sid"];
    NSDictionary *dict = @{
        @"$$_share_id": shareId,
        @"$$_share_url" : @"https://www.lydaas.com/?utm_source=share",
        @"$$_share_title" : @"分享活動A",
        @"$$_share_campaign_id" : @"這是一個自訂分享活動",
        @"$$_share_type" : @"使用者自訂分享平台"
    };
    [QTMobClick event:@"$$_share" attributes:dict];   
}];

請注意:喚起的連結需要攜帶key為"$sid",value為分享Id的參數,如:https://example.aliyun.com/path/to/content?$sid=123456"