python埋点自动化_iOS自动化埋点的实现
一、埋點的作用:
應(yīng)用趨勢分析:清晰展現(xiàn)應(yīng)用的新增用戶、活躍用戶、啟動次數(shù)、版本分布、行業(yè)指標等數(shù)據(jù),方便從整體掌控應(yīng)用的運營情況及增長動態(tài)。
渠道分析:在哪里推廣最有效?從哪里獲取的用戶最有價值?通過數(shù)據(jù)對比評估不同渠道的用戶質(zhì)量和活躍程度,從而衡量推廣效果。
留存分析:可以掌握每日(周/月)的新增用戶在初次使用后一段時間內(nèi)的留存率,留存率的高低一定程度上反映了產(chǎn)品和用戶質(zhì)量的好壞。
用戶屬性:用戶的基本屬性和行為特征,全面了解用戶。
行為分析:針對性地進行應(yīng)用內(nèi)的數(shù)據(jù)統(tǒng)計,了解用戶的產(chǎn)品使用細節(jié)及行為特征,幫助團隊尋找產(chǎn)品改進的突破點,評估產(chǎn)品優(yōu)化的效果。
二、自動化埋點SDK的研發(fā)背景
1、代碼埋點
優(yōu)點:靈活性高,能滿足大量個性化需求。
缺點:開發(fā)者需要手動在需要埋點的節(jié)點植入埋點代碼,可能埋點代碼也需要植入一定的業(yè)務(wù)邏輯。
? 代碼耦合嚴重,復(fù)用性差,工作量大,難以維護。
2、自動化埋點
優(yōu)點:
可以較大程度降低開發(fā)成本,不受版本更新影響 。
解耦業(yè)務(wù)代碼,易維護,可移植性強。
解決了數(shù)據(jù)回溯問題,可查看歷史數(shù)據(jù)。
避免了使用三方SDK可能造成用戶關(guān)鍵數(shù)據(jù)丟失及企業(yè)泄密等問題。
缺點:未解決個性化自定義獲取數(shù)據(jù)的問題,缺乏數(shù)據(jù)獲取的靈活性。
三、數(shù)據(jù)采集
數(shù)據(jù)采集原理:利用object-c的runtime機制,對有需要的類和事件進行方法交換,進行事件攔截,注入埋點代碼,實現(xiàn)數(shù)據(jù)統(tǒng)計的功能,具體做法是:
重載類的+(void)load方法,在進程加載到內(nèi)存時利用runtime的method_exchangeImplementations等接口,
將方法(設(shè)為M)的實現(xiàn)互相交換,當方法M被調(diào)用時就會被Hook,執(zhí)行我們的方法。
1234567891011
/// ClickKit 類+ (void)swapMethod:(Class)class origMethod:(SEL)origSelector newMethod:(SEL)newSelector{
Method originalMethod = class_getInstanceMethod(class, origSelector);
Method swizzledMethod = class_getInstanceMethod(class, newSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
}
+ (BOOL)addMethod:(Class)class sel:(SEL)sel method:(IMP)method
{
return class_addMethod(class, sel, method, "v@:@@");
}
(1)頁面統(tǒng)計(PV)
PV統(tǒng)計原理:通過hook UIViewController的以下函數(shù),達到采集類名等功能:
特別注意:必須實現(xiàn)以下三個函數(shù)的super調(diào)用,否則,頁面自動化埋點無法觸發(fā)
123
- (void)viewDidLoad;
- (void)viewDidAppear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
(2)事件統(tǒng)計(event)
事件id:通過對點擊事件進行方法攔截,獲取當前點擊控件及控件所屬target,根據(jù)點擊視圖的響應(yīng)者鏈,逐級取到控件的所屬view tree,建議點擊視圖增加tag。
針對單一點擊事件,以UIControl為例:
1234567891011121314151617181920
@implementation UIControl (ClickKit)
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[ClickKit swapMethod:[self class]
origMethod:@selector(sendAction:to:forEvent:)
newMethod:@selector(swizzle_sendAction:to:forEvent:)];
});
}
- (void)swizzle_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
[self swizzle_sendAction:action to:target forEvent:event];
/// 收集數(shù)據(jù)}
@end
針對列表點擊事件,以UITableView為例:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
@implementation UIScrollView (ClickKit)
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[ClickKit swapMethod:[self class]
origMethod:@selector(setDelegate:)
newMethod:@selector(swizzle_setDelegate:)];
});
}
- (void)swizzle_setDelegate:(id)delegate
{
[self swizzle_setDelegate:delegate];
if ([self isKindOfClass:[UITableView class]]) {
[(UITableView *)self swizzle_tableViewDidSelectRowAtIndexPathInClass:delegate];
}
else if ([self isKindOfClass:[UICollectionView class]]) {
[(UICollectionView *)self swizzle_collectionViewDidSelectRowAtIndexPathInClass:delegate];
}
}
@end
@implementation UITableView (ClickKit)
- (void)swizzle_tableViewDidSelectRowAtIndexPathInClass:(id)delegate
{
if ([delegate isKindOfClass:[UITableView class]]) {
return;
}
if ([ClickKit hasMethod:[delegate class] sel:@selector(tableView:didSelectRowAtIndexPath:)])
{
SEL swizSel = NSSelectorFromString(@"swizzle_didSelectRowAtIndexPath");
if ([ClickKit addMethod:[delegate class] sel:swizSel method:(IMP)swizzle_didSelectRowAtIndexPath]) {
[ClickKit swapMethod:[delegate class] origMethod:swizSel newMethod:@selector(tableView:didSelectRowAtIndexPath:)];
}
}
}
void swizzle_didSelectRowAtIndexPath(id self, SEL _cmd, id tableView, id indexPath)
{
SEL selector = NSSelectorFromString(@"swizzle_didSelectRowAtIndexPath");
((void(*)(id, SEL, id, id))objc_msgSend)(self, selector, tableView, indexPath);
/// 收集數(shù)據(jù)
}
@end
四、數(shù)據(jù)存儲
埋點數(shù)據(jù)采用db方式進行數(shù)據(jù)存儲,一般依據(jù)事件類型,db結(jié)構(gòu)由啟動表、pv表和event表組成。具體怎么組織數(shù)據(jù)結(jié)構(gòu),需要上報什么數(shù)據(jù),需要和大數(shù)據(jù)溝通。
五、數(shù)據(jù)上報
上報策略:
1、采用實時上傳和離線上傳相結(jié)合的方式,wifi和4G模式下,pv采用實時上報的方式,事件是隨著下一個pv同時上傳。
2、離線上傳:其它網(wǎng)絡(luò)情況下只做存儲處理。
這個策略也只是建議,具體還看業(yè)務(wù)需求。
總結(jié)
以上是生活随笔為你收集整理的python埋点自动化_iOS自动化埋点的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winform实现翻书效果_如何用PPT
- 下一篇: python画饼状图的包_Python数