python埋点自动化_iOS自动化埋点的实现
一、埋點的作用:
應用趨勢分析:清晰展現應用的新增用戶、活躍用戶、啟動次數、版本分布、行業指標等數據,方便從整體掌控應用的運營情況及增長動態。
渠道分析:在哪里推廣最有效?從哪里獲取的用戶最有價值?通過數據對比評估不同渠道的用戶質量和活躍程度,從而衡量推廣效果。
留存分析:可以掌握每日(周/月)的新增用戶在初次使用后一段時間內的留存率,留存率的高低一定程度上反映了產品和用戶質量的好壞。
用戶屬性:用戶的基本屬性和行為特征,全面了解用戶。
行為分析:針對性地進行應用內的數據統計,了解用戶的產品使用細節及行為特征,幫助團隊尋找產品改進的突破點,評估產品優化的效果。
二、自動化埋點SDK的研發背景
1、代碼埋點
優點:靈活性高,能滿足大量個性化需求。
缺點:開發者需要手動在需要埋點的節點植入埋點代碼,可能埋點代碼也需要植入一定的業務邏輯。
? 代碼耦合嚴重,復用性差,工作量大,難以維護。
2、自動化埋點
優點:
可以較大程度降低開發成本,不受版本更新影響 。
解耦業務代碼,易維護,可移植性強。
解決了數據回溯問題,可查看歷史數據。
避免了使用三方SDK可能造成用戶關鍵數據丟失及企業泄密等問題。
缺點:未解決個性化自定義獲取數據的問題,缺乏數據獲取的靈活性。
三、數據采集
數據采集原理:利用object-c的runtime機制,對有需要的類和事件進行方法交換,進行事件攔截,注入埋點代碼,實現數據統計的功能,具體做法是:
重載類的+(void)load方法,在進程加載到內存時利用runtime的method_exchangeImplementations等接口,
將方法(設為M)的實現互相交換,當方法M被調用時就會被Hook,執行我們的方法。
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)頁面統計(PV)
PV統計原理:通過hook UIViewController的以下函數,達到采集類名等功能:
特別注意:必須實現以下三個函數的super調用,否則,頁面自動化埋點無法觸發
123
- (void)viewDidLoad;
- (void)viewDidAppear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
(2)事件統計(event)
事件id:通過對點擊事件進行方法攔截,獲取當前點擊控件及控件所屬target,根據點擊視圖的響應者鏈,逐級取到控件的所屬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];
/// 收集數據}
@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);
/// 收集數據
}
@end
四、數據存儲
埋點數據采用db方式進行數據存儲,一般依據事件類型,db結構由啟動表、pv表和event表組成。具體怎么組織數據結構,需要上報什么數據,需要和大數據溝通。
五、數據上報
上報策略:
1、采用實時上傳和離線上傳相結合的方式,wifi和4G模式下,pv采用實時上報的方式,事件是隨著下一個pv同時上傳。
2、離線上傳:其它網絡情況下只做存儲處理。
這個策略也只是建議,具體還看業務需求。
總結
以上是生活随笔為你收集整理的python埋点自动化_iOS自动化埋点的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winform实现翻书效果_如何用PPT
- 下一篇: python画饼状图的包_Python数