埋點(diǎn)API
1 如何查看埋點(diǎn)方案
在進(jìn)行埋點(diǎn)前,需要確定在哪里埋點(diǎn)、埋哪些點(diǎn)等,即需要梳理清楚明確的埋點(diǎn)需求。在QuickTracking平臺中將明確的埋點(diǎn)需求稱為埋點(diǎn)方案,并為埋點(diǎn)方案設(shè)計(jì)了規(guī)范模板。如下:
在埋點(diǎn)方案中,明確的所需埋點(diǎn)內(nèi)容有:
1、事件主體:指“誰”觸發(fā)了這個(gè)事件,分為設(shè)備ID和賬號ID,上報(bào)的事件務(wù)必具備其中之一。
設(shè)備ID:Android設(shè)備和iOS設(shè)備的默認(rèn)設(shè)備ID為應(yīng)用級別唯一的設(shè)備ID,由Quicktracking自動生成:
Android9及以下設(shè)備:SDK自動采集imei、wifimac、androidid、SN生成設(shè)備ID,生成后存入本地,只有卸載應(yīng)用或者刪除應(yīng)用數(shù)據(jù)才會重新生成設(shè)備ID。
Android10級以上設(shè)備:SDK自動采集oaid、gaid、androidid、SN生成設(shè)備ID,生成后存入本地,只有卸載應(yīng)用或者刪除應(yīng)用數(shù)據(jù)才會重新生成設(shè)備ID。
iOS設(shè)備:SDK自動采集openudid生成設(shè)備ID,生成后放入keychain中,只有恢復(fù)出廠設(shè)置或者刪除應(yīng)用數(shù)據(jù)才會重新生成設(shè)備ID。
使用應(yīng)用的C端用戶同意采集idfa和oaid,QuickTracking SDK才會采集,只有QuickTracking app SDK可以采集到oaid、gaid、imei、wifimac、androidid、SN、idfa、idfv。
賬號ID:客戶端用戶登錄后賬號標(biāo)識,當(dāng)一個(gè)用戶在不同的設(shè)備進(jìn)行登錄時(shí),設(shè)備ID會發(fā)生變化,但是賬號ID不會發(fā)生變化。例如一個(gè)用戶使用手機(jī)和pad分別登錄。
2、用戶屬性:針對賬號ID的屬性,例如賬號ID為“testdemo@111”的用戶,“生日”為“1999-02-13”,“會員等級”為“鉑金”等。“生日”和“會員”等級就為用戶屬性。
3、渠道屬性:廣告投放的屬性,例如投放渠道、投放方式、投放內(nèi)容等。
4、全局屬性:在全局設(shè)置一次后,每一個(gè)事件都會攜帶的屬性
5、頁面瀏覽事件:頁面加載時(shí)上報(bào)的事件(埋點(diǎn)方案中頁面編碼和事件編碼相等的事件,也是標(biāo)記為藍(lán)色的事件)
6、點(diǎn)擊、曝光、自定義事件:客戶端用戶與客戶端發(fā)生任意交互時(shí)上報(bào)的事件。
2 設(shè)置設(shè)備ID&賬號ID
2.1 設(shè)備ID設(shè)置
SDK 內(nèi)部默認(rèn)會采集如下參數(shù)。
設(shè)備標(biāo)識或設(shè)備信息 | 采集方法 | 備注 |
idfa | [ASIdentifierManager advertisingIdentifier].UUIDString | 蘋果廣告標(biāo)識 |
idfv | [[UIDevice currentDevice].identifierForVendor UUIDString] | 應(yīng)用級標(biāo)識 |
openudid | [UIPasteboardpasteboardWithName:slotPBid create:NO] | openUdid(三方) |
淘寶utdid | [UTDevice utdid] | 若您集成了淘寶utdid SDK,QuickTracking才會采集 |
mcc | [UMUtils mccString] | 移動信號國家碼 |
mnc | [UMUtils mncString] | 移動網(wǎng)絡(luò)號碼 |
如果開發(fā)者希望針對上表中的某幾個(gè)設(shè)備標(biāo)識符采集行為做控制,如:不采集或自行實(shí)現(xiàn)采集方法。可以實(shí)現(xiàn)對應(yīng)block回調(diào),如下示例:
[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";
}];
注意:請謹(jǐn)慎決定是否實(shí)現(xiàn)對應(yīng)方法,一旦您選擇自己實(shí)現(xiàn)采集方法,此設(shè)備標(biāo)識的采集工作就由你全權(quán)接管了,SDK不會再試圖采集此設(shè)備標(biāo)識。SDK能采集到的設(shè)備標(biāo)識越少,對統(tǒng)計(jì)數(shù)據(jù)的準(zhǔn)確性和穩(wěn)定性的負(fù)面影響越大。
// 請?jiān)谠O(shè)置收數(shù)域名之前,調(diào)用SDK預(yù)初始化函數(shù)之前,先調(diào)用采集工具類注冊函數(shù)
// 如果不需要對設(shè)備標(biāo)識采集行為做控制,就不需要實(shí)現(xiàn)自定義工具類并注冊它
[QTConfigure customSetIdfvBlock:^NSString *{
return [[UIDevice currentDevice].identifierForVendor UUIDString];
}];
[QTConfigure setCustomDomain:@"您的收數(shù)域名" standbyDomain:nil];
[QTConfigure initWithAppKey:@"您的appkey" channel:@"App Store"];
SDK支持自定義設(shè)備ID,如果要使用自定義設(shè)備ID需要在初始化前(即init前) 設(shè)置setCustomDeviceId:接口為有效值(非空)。
+ (void)setCustomDeviceId:(NSString *)devID;
使用示例:
[QTConfigure setCustomDeviceId:@"xxxxxx"];
注意:因該功能在未獲取到設(shè)備ID時(shí)生效,如果本地已存在設(shè)備ID,設(shè)置后無效。如果本地已獲取到設(shè)備ID可以通過卸載重裝方式驗(yàn)證此功能。
2.2 賬號ID設(shè)置
1、QT在統(tǒng)計(jì)用戶時(shí)以設(shè)備為標(biāo)準(zhǔn),如果需要統(tǒng)計(jì)應(yīng)用自身的賬號,請使用以下接口:
接口函數(shù):
+ (void)profileSignInWithPUID:(NSString *)puid;
參數(shù):
參數(shù) | 類型 | 描述 | 備注 |
puid | NSString | 用戶賬號ID | 長度小于64字節(jié) |
注意:賬號ID設(shè)置后將被存入本地存儲,只有卸載App、清空應(yīng)用數(shù)據(jù)或者調(diào)用下述的登出接口時(shí),賬號ID才會失效,否則每一個(gè)事件都將攜帶賬號ID。
示例代碼:
[QTMobClick profileSignInWithPUID:@"UserID"];
如果不再需要綁定用戶賬號,可以調(diào)用登出接口,調(diào)用后,不再發(fā)送賬號相關(guān)內(nèi)容。
+ (void)profileSignOff;
示例代碼:
[QTMobClick profileSignOff];
2.3 設(shè)備ID獲取
接口函數(shù):
+ (NSString *)umidString;
示例代碼:
NSString *deviceID = [QTConfigure umidString];
3 用戶屬性上傳
1、使用事件編碼固定為"$$_user_profile"的自定義事件上傳,該事件所攜帶的事件屬性會被作為用戶屬性放在用戶表中。
NSDictionary *dict = @{@"sex" : @"girl", @"age" : @"8"};
[QTMobClick event:@"$$_user_profile" attributes:dict];
請注意:用戶屬性上傳一定要在賬號統(tǒng)計(jì)調(diào)用后
4 渠道屬性
4.1 H5鏈接喚起App
喚起App的URL Scheme中攜帶這些渠道屬性,且屬性key務(wù)必以“utm_”開頭,因?yàn)镾DK識別的關(guān)鍵字為“utm_”。例如:<URL scheme>?utm_channel=gzh
添加您的 URL Scheme 到項(xiàng)目中,URL Scheme 位于項(xiàng)目設(shè)置 target ->選項(xiàng)卡 Info ->URL Types。填入的scheme。在AppDelegate中調(diào)用函數(shù)[MobClick handleUrl:url]來接收 URL
AppDelegate調(diào)用:
- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
if ([QTMobClick handleUrl:url]) {
return YES;
}
return YES;
}
SceneDelegate調(diào)用:
- (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:如果渠道屬性已經(jīng)與市面上渠道投放公司進(jìn)行了合作,無法使用utm_開頭,可以使用全局屬性API將渠道屬性進(jìn)行埋點(diǎn)上報(bào)(屬性key依然需要以“utm_”開頭)。
4.2 H5鏈接喚起應(yīng)用市場下載并啟動App
該場景下,如果僅是H5鏈接中攜帶“utm_”參數(shù),已經(jīng)無法做到下載App后的啟動事件攜帶“utm_”參數(shù)。所以需要進(jìn)行“H5喚起事件”與“應(yīng)用激活事件”做關(guān)于“IP地址和瀏覽器UserAgent”的模糊匹配。
當(dāng)用戶在H5中點(diǎn)擊「喚起/下載App」的按鈕時(shí),上報(bào)“應(yīng)用喚起事件($$_app_link)”,在事件中需要攜帶喚起App的appkey和渠道屬性。
//示例
aplus_queue.push({
action:'aplus.recordAppLink',
arguments:[{
targetAppKey: '要喚起的應(yīng)用appKey', // 必填,要喚起的應(yīng)用appKey
custom1: 'custom1', // 選填,自定義參數(shù)
...
}]
})
App下載后的第一次啟動事件“應(yīng)用激活事件($$_app_install)”由QT App SDK自動采集上報(bào)。
QuickTracking系統(tǒng)進(jìn)行應(yīng)用喚起事件($$_app_link)和應(yīng)用激活事件($$_app_install)關(guān)于“IP地址和瀏覽器UserAgent”的模糊匹配。您使用時(shí),可以直接在app應(yīng)用中分析“應(yīng)用激活(預(yù)置)”的渠道屬性即可。
4.3 App各應(yīng)用市場活躍數(shù)據(jù)統(tǒng)計(jì)
在初始化函數(shù)中的第二個(gè)入?yún)hannel即為設(shè)置該應(yīng)用的應(yīng)用市場:[QTConfigure initWithAppkey:@"您的appkey" channel:@"App Store"];
,在分析中可使用“系統(tǒng)屬性-升級渠道”查看。
5 全局屬性
注冊全局屬性后,后續(xù)觸發(fā)的所有事件都將自動包含這些屬性,并且這些屬性及屬性值存入緩存,APP進(jìn)程結(jié)束后清除。在分析數(shù)據(jù)時(shí),可根據(jù)此屬性進(jìn)行查看和篩選。
5.1 注冊全局屬性
/**
* 設(shè)置全局屬性 鍵值對
* 如果和已經(jīng)存在的全局屬性key重復(fù),則更新已有值
* 如果和已經(jīng)存在的全局屬性key不一致,則插入新的全局屬性
*/
+(void) registerGlobalProperty:(NSDictionary *)property;
參數(shù) | 類型 | 描述 | 備注 |
property | NSDictionary | 全局屬性的屬性名稱和屬性值 | - |
示例:
NSDictionary *firstPropertyDict = @{
@"a" : @"1",
@"b" : @"2"
};
[QTMobClick registerGlobalProperty:firstPropertyDict];//當(dāng)前globalproperty為a:1和b:2
NSDictionary *secondPropertyDict = @{
@"b" : @"3",
@"c" : @"4"
};
[QTMobClick registerGlobalProperty:secondPropertyDict];//當(dāng)前globalproperty為a:1、b:3和c:4
5.2 獲取一個(gè)全局屬性
/**
* 獲取一個(gè)全局屬性;如果不存在,則返回空。
*/
+(NSString *) getGlobalProperty:(NSString *)propertyName;
參數(shù) | 類型 | 描述 | 備注 |
propertyName | NSString | 屬性名,只支持大小寫字母、數(shù)字及下劃線! | - |
返回值 | NSString | - |
5.3 刪除一個(gè)全局屬性
刪除一個(gè)特定的全局屬性,刪除后,后續(xù)觸發(fā)的所有事件都不再攜帶該屬性。
/**
*
* 刪除指定全局屬性
@param key
*/
+(void) unregisterGlobalProperty:(NSString *)propertyName;
參數(shù) | 類型 | 描述 | 備注 |
propertyName | NSString | 屬性名,只支持大小寫字母、數(shù)字及下劃線! | - |
5.4 獲取所有全局屬性
/**
* 獲取所有全局屬性;如果不存在,則返回空。
*/
+(NSDictionary *)getGlobalProperties;
參數(shù) | 類型 | 描述 | 備注 |
返回值 | NSDictionary | 返回的全局屬性值類型為字符型,必須和注冊此全局屬性時(shí)傳入?yún)?shù)類型一致。 | - |
5.5 清除所有的全局屬性
/**
* 清空所有全局屬性。
*/
+(void)clearGlobalProperties;
6 頁面瀏覽事件API
SDK提供頁面自動采集和頁面手動采集兩種方式上報(bào)頁面瀏覽事件,兩種方式也可以混用。
6.1 頁面自動采集
頁面自動采集是hook系統(tǒng)viewWillAppear和viewWillDisappear,獲取className 實(shí)現(xiàn)。SDK默認(rèn)不開啟頁面自動采集,如果需要開啟,建議在初始化之前調(diào)用。
接口函數(shù):
+ (void)setAutoPageEnabled:(BOOL)value;
參數(shù) | 類型 | 描述 | 備注 |
value | BOOL | 是否開啟頁面自動采集 |
|
示例代碼:
//設(shè)置為開啟頁面自動采集
[QTMobClick setAutoPageEnabled:YES];
6.1.1 禁止單個(gè)頁面的自動上報(bào)
如果全局設(shè)置了開啟頁面自動采集,可以通過此接口設(shè)置跳過單個(gè)頁面的自動采集。建議在viewWillAppear最開始調(diào)用,如只不統(tǒng)計(jì)當(dāng)前自動頁面采集,可以將pageName參數(shù)設(shè)置成nil。
接口函數(shù):
+ (void)skipMe:(id)PageObject pageName:(NSString *)pageName;
示例:
#import <QTCommon/UMSpmHybrid.h>
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//不統(tǒng)計(jì)當(dāng)前class自動頁面采集
[UMSpmHybrid skipMe:[self class] pageName:nil];
}
6.2 頁面手動采集
接口函數(shù):
/** 自動頁面時(shí)長統(tǒng)計(jì), 開始記錄某個(gè)頁面展示時(shí)長.
使用方法:必須配對調(diào)用beginLogPageView:和endLogPageView:兩個(gè)函數(shù)來完成自動統(tǒng)計(jì),若只調(diào)用某一個(gè)函數(shù)不會生成有效數(shù)據(jù)。
在該頁面展示時(shí)調(diào)用beginLogPageView:,當(dāng)退出該頁面時(shí)調(diào)用endLogPageView:
@param pageName 統(tǒng)計(jì)的頁面名稱.
@return void.
*/
+ (void)beginLogPageView:(NSString *)pageName;
/** 自動頁面時(shí)長統(tǒng)計(jì), 結(jié)束記錄某個(gè)頁面展示時(shí)長.
使用方法:必須配對調(diào)用beginLogPageView:和endLogPageView:兩個(gè)函數(shù)來完成自動統(tǒng)計(jì),若只調(diào)用某一個(gè)函數(shù)不會生成有效數(shù)據(jù)。
在該頁面展示時(shí)調(diào)用beginLogPageView:,當(dāng)退出該頁面時(shí)調(diào)用endLogPageView:
@param pageName 統(tǒng)計(jì)的頁面名稱.
@return void.
*/
+ (void)endLogPageView:(NSString *)pageName;
參數(shù):
參數(shù) | 類型 | 描述 | 備注 |
pageName | NSString | 統(tǒng)計(jì)的頁面編碼 | beginLogPageView 和 endLogPageView中的值必須一致 |
注意:
必須配對調(diào)用beginLogPageView:和endLogPageView:兩個(gè)函數(shù)來完成自動統(tǒng)計(jì),若只調(diào)用某一個(gè)函數(shù)不會生成有效數(shù)據(jù);
在該頁面展示時(shí)調(diào)用beginLogPageView:,當(dāng)退出該頁面時(shí)調(diào)用endLogPageView:。
示例代碼:
在ViewController類的viewWillAppear: 和 viewWillDisappear:中配對調(diào)用如下方法:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[QTMobClick beginLogPageView:@"Pagename"]; //("Pagename"為頁面名稱,可自定義)
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[QTMobClick endLogPageView:@"Pagename"];
}
您也可以根據(jù)您自己的業(yè)務(wù)場景,在viewDidAppear:和viewDidDisappear:等方法中配對調(diào)用beginLogPageView:和endLogPageView:兩個(gè)函數(shù)來完成自動統(tǒng)計(jì)。
6.2.1 頁面屬性設(shè)置
iOS端頁面屬性設(shè)置接口updatePageProperties,支持給當(dāng)前頁面附加自定義屬性。 接口:
/**
* @brief 更新頁面業(yè)務(wù)參數(shù).
*
* @param pageName 頁面名稱,如Page_Detail
* @param pProperties 業(yè)務(wù)參數(shù),kv對
*
* @warning 調(diào)用說明:必須在viewWillDisappear之前調(diào)用
*
* 最佳位置:在viewWillDisappear之前調(diào)用即可
*/
+(void) updatePageProperties:(NSString *)pageName properties:(NSDictionary *) pProperties;
參數(shù):
參數(shù) | 類型 | 描述 | 備注 |
pageName | NSString | 頁面編碼,如Page_Detail | |
pProperties | NSDictionary | 業(yè)務(wù)參數(shù),kv對 |
請注意:請?jiān)谡{(diào)用beginLogPageView之后設(shè)置頁面屬性。
引入頭文件:
#import <QTCommon/UMSpm.h>
示例:
[UMSpm updatePageProperties:@"page_home" properties: @{@"page_home_key":@"page_home_val"}];
請注意:頁面屬性設(shè)置只支持頁面手動埋點(diǎn)
6.2.2 透傳頁面屬性
此外,QuickTracking SDK還提供透傳頁面屬性埋點(diǎn)接口updateNextPageProperties,支持給下一個(gè)頁面附加自定義屬性。
/**
* @brief 更新下一個(gè)頁面業(yè)務(wù)參數(shù).
*
* @param properties 傳給下一個(gè)頁面業(yè)務(wù)參數(shù),kv對
*
* @warning 調(diào)用說明:必須在下一個(gè)頁面pageAppear之前調(diào)用,否則會攜帶錯(cuò)誤
*
* 最佳位置:必須在下一個(gè)頁面pageAppear之前調(diào)用
*/
+(void) updateNextPageProperties:(NSDictionary *) properties;
參數(shù):
參數(shù) | 類型 | 描述 | 備注 |
properties | NSDictionary | 傳給下一個(gè)頁面業(yè)務(wù)參數(shù),kv對 |
示例:
必須在下一個(gè)頁面beginLogPageView之前調(diào)用。
[UMSpm updateNextPageProperties:@{@"news_next_key":@"news_next_val"}];
請注意:透傳頁面屬性只支持頁面手動埋點(diǎn)
7 事件埋點(diǎn)
自定義事件可以用于追蹤用戶行為,記錄行為發(fā)生的具體細(xì)節(jié)。
7.1 事件埋點(diǎn)
接口:
+ (void)event:(NSString *)eventCode;
+ (void)event:(NSString *)eventCode attributes:(NSDictionary *)attributes;
+ (void)event:(NSString *)eventId pageName:(NSString *)pageName attributes:(NSDictionary *)attributes;
參數(shù)說明:
參數(shù) | 類型 | 描述 | 備注 |
eventCode | NSString | 事件編碼 | 埋點(diǎn)方案中點(diǎn)擊、曝光、自定義事件的事件編碼 |
attributes | NSDictionary | 自定義屬性 | -屬性中的key的value不可以是空 -value的類型只能是String、Long、Integer、Float、Double、Short,或數(shù)組(數(shù)組中的元素必須為String)類型。 |
pageName | NSString | 頁面編碼 | 事件所在頁面,埋點(diǎn)方案中點(diǎn)擊、曝光、自定義事件的所在頁面編碼。 |
事件上傳數(shù)量限制:
自定義屬性key字符串長度上限:1024
自定義屬性value字符串長度上限:1024*4
自定義屬性map長度(參數(shù)個(gè)數(shù)):100 個(gè)鍵值對
當(dāng)自定義屬性值value為數(shù)組元素時(shí),屬性值的數(shù)組長度上限:100
單條日志報(bào)文的總長度限制:2MB
示例1:
統(tǒng)計(jì)應(yīng)用中”轉(zhuǎn)發(fā)”事件發(fā)生的次數(shù),那么在轉(zhuǎn)發(fā)的函數(shù)里調(diào)用:
[QTMobClick event:@"Forward"];
示例2:
統(tǒng)計(jì)應(yīng)用中“購買”事件發(fā)生的次數(shù),以及購買的商品類型及數(shù)量,那么在購買的函數(shù)里調(diào)用:
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 全埋點(diǎn)(自動埋點(diǎn))
8.1 全埋點(diǎn)適用范圍
SDK適用于iOS 8.0及以上操作系統(tǒng)。
8.2 全埋點(diǎn)接口說明
8.2.1 自動頁面采集接口
自動采集頁面是hook系統(tǒng)viewWillAppear和viewWillDisappear,獲取className 實(shí)現(xiàn),建議在初始化之前調(diào)用,默認(rèn)是關(guān)閉
/** 設(shè)置是否自動采集頁面, 默認(rèn)NO(不自動采集).
@param value 設(shè)置為YES, QT SDK 會自動采集頁面信息
*/
+ (void)setAutoPageEnabled:(BOOL)value;
示例:
[QTMobClick setAutoPageEnabled:YES];
//設(shè)置域名
[QTConfigure setCustomDomain:@"您的收數(shù)域名" standbyDomain:nil];
//初始化appkey
[QTConfigure initWithAppkey:@"您應(yīng)用的appKey" channel:@"App Store"];
關(guān)閉某個(gè)頁面的自動頁面采集
/**
* @brief 跳過當(dāng)前頁面統(tǒng)計(jì).
*
* @param PageObject 容器對象(自動獲取頁面時(shí)使用,默認(rèn)手動可填nil)
* @param pageName 頁面名稱(手動設(shè)置頁面時(shí)使用,當(dāng)設(shè)置自動獲取頁面時(shí)可填nil)
* @warning 建議在設(shè)置頁面之前調(diào)用此接口,調(diào)用后設(shè)置的native頁面將不發(fā)送數(shù)據(jù)
*
*/
+ (void)skipMe:(id)PageObject pageName:(NSString *)pageName;
示例:
[UMSpmHybrid skipMe:self pageName:nil];
8.2.2 開啟控件點(diǎn)擊數(shù)據(jù)全埋點(diǎn)
自動采集事件是:
hook系統(tǒng)sendAction:to:from:forEvent:實(shí)現(xiàn)控件執(zhí)行方法監(jiān)測
監(jiān)聽addGestureRecognizer:實(shí)現(xiàn)所有點(diǎn)擊行為
hook tableView:didSelectRowAtIndexPath:支持tableView的點(diǎn)擊行為
hook collectionView:didSelectItemAtIndexPath: 支持collectionView的點(diǎn)擊行為
建議在初始化之前調(diào)用,默認(rèn)是關(guān)閉
/** 設(shè)置是否自動采集點(diǎn)擊事件, 默認(rèn)NO(不自動采集)
@param value 設(shè)置為YES, QT SDK 會將自動采集點(diǎn)擊事件
*/
+ (void)setAutoEventEnabled:(BOOL)value;
示例:
[QTMobClick setAutoEventEnabled:YES];
//設(shè)置域名
[QTConfigure setCustomDomain:@"您的收數(shù)域名" standbyDomain:nil];
//初始化appkey
[QTConfigure initWithAppkey:@"您應(yīng)用的appKey" channel:@"App Store"];
支持的控件:
控件名稱 | 備注 |
UITableView | |
UICollectionView | |
UIImageView | 有加UITapGestureRecognizer行為的才可以 |
UILabel | 有加UITapGestureRecognizer行為的才可以 |
UIButton | |
UISwitch | |
UIStepper | |
UISegmentedControl | |
UISlider | |
UIPageControl | |
UITabBarItem | |
UIBarButtonItem |
忽略某個(gè)容器的點(diǎn)擊事件
/**
* @abstract
* 忽略某一頁面的點(diǎn)擊
*
* @param PageObject 對應(yīng)容器
*/
+(void)ignorePageView:(id)PageObject;
例:
// 該方法支持多次調(diào)用,對合集進(jìn)行忽略
[QTAutoTrack ignorePageView:self];
忽略特定類型控件點(diǎn)擊事件的自動采集
通過 ignoreViewType 方法忽略特定類型控件點(diǎn)擊事件的自動采集。
/**
* @abstract
* 忽略某一類型的點(diǎn)擊
*
* @param aClass View 對應(yīng)的 Class
*/
+(void)ignoreViewType:(Class)aclass;
示例:
// 該方法支持多次調(diào)用,對合集進(jìn)行忽略
[QTAutoTrack ignoreViewType:[UIButton class]];
[QTAutoTrack ignoreViewType:[UISwitch class]];
忽略特定控件點(diǎn)擊事件的自動采集
通過 UMAnalyticsIgnoreView 方法忽略特定控件點(diǎn)擊事件的自動采集。
button.UMAnalyticsIgnoreView=YES;
8.2.3 頁面設(shè)置自定義信息
頁面設(shè)置自定義編碼
通過實(shí)現(xiàn) -(NSString *)getUMPageName 方法,返回一個(gè)自定義編碼
-(NSString *)getUMPageName
{
return @"testPageCode";
}
頁面設(shè)置自定義屬性
通過實(shí)現(xiàn) -(NSDictionary *)getUMPageProperties 方法,給頁面設(shè)置自定義屬性
-(NSDictionary *)getUMPageProperties
{
return @{@"key1":@"val1",@"key2":@"val2"};
}
頁面設(shè)置來源(page_referrer)信息
通過實(shí)現(xiàn) -(NSString *) getUMScreenUrl 方法,返回一個(gè)自定義來源信息
- (NSString *)getUMScreenUrl {
return @"um//um/page";
}
8.2.4 設(shè)置控件點(diǎn)擊事件自定義屬性
通過該方法,可以對特定控件設(shè)置自定義屬性,自定義屬性可以設(shè)置多個(gè)鍵值對,Key和Value都需要是字符串類型。自定義屬性和值會包含在此控件全埋點(diǎn)點(diǎn)擊事件數(shù)據(jù)中。
button.UMAnalyticsViewProperties=@{@"key11":@"val11"};
控件設(shè)置Event Code
通過該方法,可以對特定控件設(shè)置事件編碼
button.UMAnalyticsEventCode=@"abcd123";
9 分享裂變
分享裂變是增長黑客策略的一個(gè)關(guān)鍵概念,它依靠用戶之間的社交聯(lián)系來實(shí)現(xiàn)信息的相互傳遞,從而促進(jìn)新用戶的獲取。
完成分享裂變的SDK功能集成,您將可以使用QuickTracking平臺分享趨勢模型,通過分享回流相關(guān)指標(biāo)衡量營銷活動的拉新效益。
支持查看TOP分享用戶和不同分享回流層級的分享回流效果指標(biāo)。
支持回流指標(biāo)靈活組合配置,查看最具裂變拉新能力和分享回流轉(zhuǎn)化能力的TOP用戶,追蹤用戶分享裂變鏈路與分享回流關(guān)系,快速定位關(guān)鍵意見消費(fèi)者。
9.1 獲取來源分享參數(shù)
/*
* 來源分享參數(shù)獲取 API
* return @{ @"$$_ref_share_id": @"xxxxx", @"$$_ref_share_url": @"xxxxx"}
**/
+(nullable NSDictionary *)getRefShareParams;
版本要求
iOS sdk 在v1.5.0.PX 版本及以上
功能
當(dāng)被分享人打開app時(shí),用于獲取來源分享id 和來源分享 url 的 API
請求參數(shù)
無
返回參數(shù)
默認(rèn)返回空字典{},如果有值時(shí)返回如下:
參數(shù) | 類型 | 默認(rèn)值 | 含義 | 備注 |
$$_ref_share_url | String | "" | 不包含分享 id 的來源分享 url | 無 |
$$_ref_share_id | String | "" | 來源分享 id | 無 |
調(diào)用示例
-(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": @"這是一個(gè)分享標(biāo)題",
@"campaign":@"這是一個(gè)分享活動",
@"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" : @"這是一個(gè)自定義分享活動",
@"$$_share_type" : @"用戶自定義分享平臺"
};
[QTMobClick event:@"$$_share" attributes:dict];
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:@"分享參數(shù)" message:[NSString
stringWithFormat:@"請求分享參數(shù)結(jié)果如下:\n\n {\n $sid:%@ \n} \n", shareId]
preferredStyle:UIAlertControllerStyleAlert];
// 創(chuàng)建UIAlertAction
UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"知道了"
style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// 點(diǎn)擊確定按鈕后的處理
NSLog(@"用戶已復(fù)制");
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = shareId;
}];
[alertController addAction:confirmAction];
[weakSelf presentViewController:alertController animated:YES completion:nil];
});
}];
}
9.2 請求分享參數(shù)
#import <QTCommon/MobClick.h>
/*
* 分享參數(shù)獲取API
* @param url, 分享頁面的url,必須傳入
* @param params 可能的分享參數(shù),可以為null
* {
* @"title": 分享標(biāo)題, //可為null,最大長度 4*1024
* @"shareId": 來源分享Id, //可為 null
* @"campaign": 分享活動, //可為 null,最大長度 4*1024
* ... 待擴(kuò)展
* }
* @param timeout 請求超時(shí)時(shí)間,單位秒,有效值范圍:0~10(包含0和10),如果傳入0,則使用sdk內(nèi)部默認(rèn)值3秒
* @param shareResultHandler 結(jié)果回調(diào)對象,必須傳入,不能為null
*/
+(void)requestShareParams:(nonnull NSString *)url
params:(nonnull NSDictionary *)params
timeout:(int)timeout
shareResultHandler:(nonnull QTShareResultHandler)shareResultHandler;
版本要求
iOS sdk 在v1.5.0.PX 版本及以上
功能
請求用于構(gòu)建分享鏈需要的分享id
請求參數(shù)
參數(shù) | 類型 | 默認(rèn)值 | 含義 | 備注 |
url | NSString | nil | 分享頁面的 url | 必須傳入,不能為 nil |
params | NSDictionary | nil | 分享參數(shù)獲取 API 請求參數(shù) |
campaign:分享活動標(biāo)識。String 類型,默認(rèn)值為 "",最大長度為 4*1024 個(gè)字符 title:分享標(biāo)題。String類型,默認(rèn)值為 "",最大長度為 4*1024個(gè)長度 shareId:來源分享Id。String 類型,默認(rèn)值為"" |
timeout | int | 0 | 接口超時(shí)時(shí)間 | 取值范圍1~10,單位為秒。 sdk 默認(rèn)超時(shí)時(shí)間為3秒 |
shareResultHandler | QTShareResultHandler | nil | 結(jié)果回調(diào)對象 | 必須傳入,不能為 nil 注:此結(jié)果回調(diào)上下文為SDK內(nèi)部網(wǎng)絡(luò)請求后臺工作線程,如果需要在回調(diào)方法中操作UI控件,請通過UI線程Handler執(zhí)行相關(guān)操作。 |
返回參數(shù)
參數(shù) | 類型 | 默認(rèn)值 | 含義 | 備注 |
result | NSDictionary | nil | 分享參數(shù) API 請求結(jié)果 | 包含一個(gè)屬性 $sid, NSString 類型, 分享id |
error | NSError | nil | 分享參數(shù) API 請求報(bào)錯(cuò) | 無 |
調(diào)用示例
-(void)onShare {
__weak typeof(self) * weakSelf = self;
[QTMobClick requestShareParams:@"https://www.lydaas.com/?utm_source=share"
params:@{
@"title": @"這是一個(gè)分享標(biāo)題",
@"campaign":@"這是一個(gè)分享活動",
@"shareId": @"這是一個(gè)分享 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" : @"這是一個(gè)自定義分享活動",
@"$$_share_type" : @"用戶自定義分享平臺"
};
[QTMobClick event:@"$$_share" attributes:dict];
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"分享參數(shù)"
message:[NSString stringWithFormat:
@"請求分享參數(shù)結(jié)果如下:\n\n {\n $sid:%@ \n} \n", shareId]
preferredStyle:UIAlertControllerStyleAlert];
// 創(chuàng)建UIAlertAction
UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"知道了"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
// 點(diǎn)擊確定按鈕后的處理
NSLog(@"用戶已復(fù)制");
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = shareId;
}];
[alertController addAction:confirmAction];
[weakSelf presentViewController:alertController animated:YES completion:nil];
});
}];
}
9.3 上報(bào)分享事件
通過預(yù)置事件編碼 $$_share 上報(bào)分享事件
示例:
[QTMobClick requestShareParams:@"https://www.lydaas.com/?utm_source=share"
params:@{
@"title": @"這是一個(gè)分享標(biāo)題",
@"campaign":@"這是一個(gè)分享活動",
@"shareId": @"這是一個(gè)分享 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" : @"這是一個(gè)自定義分享活動",
@"$$_share_type" : @"用戶自定義分享平臺"
};
[QTMobClick event:@"$$_share" attributes:dict];
}];
請注意:喚起的鏈接需要攜帶key為"$sid",value為分享Id的參數(shù),如:https://example.aliyun.com/path/to/content?$sid=123456"