無(wú)侵入埋點(diǎn)思路

思路圖

無(wú)侵入埋點(diǎn)思路圖.png

思路解析:利用Method Swizzling(黑魔法)實(shí)現(xiàn)埋點(diǎn)統(tǒng)計(jì)的無(wú)侵入實(shí)現(xiàn)。

步驟如下

1.調(diào)用class_addMethod為需要hook的類(lèi)增加新方法,用新的SEL指向原有的方法實(shí)現(xiàn)IMP;
2.調(diào)用method_setImplementation為原有Method設(shè)置新的IMP;
3.在新的IMP中,調(diào)用新的SEL,實(shí)現(xiàn)原方法的IMP,并收集對(duì)象,參數(shù)等信息傳入埋點(diǎn)業(yè)務(wù)模塊;
4.在埋點(diǎn)業(yè)務(wù)模塊中,加入埋點(diǎn)邏輯。

比如我們可以實(shí)現(xiàn),收集用戶crash前的操作,功能:
分析:用戶主要行為就是點(diǎn)擊,所以我們主要收集的就是用戶crash前的點(diǎn)擊事件,也就是action-target;我們知道對(duì)于一個(gè)給定的事件,UIControl會(huì)調(diào)用sendAction:to:forEvent:來(lái)將行為轉(zhuǎn)發(fā)到UIApplication對(duì)象,再由UIApplication對(duì)象調(diào)用其sendAction:to:fromSender:forEvent:方法來(lái)將消息轉(zhuǎn)發(fā)到指定target上,而如果我們沒(méi)有指定target,則會(huì)將事件分發(fā)到事件響應(yīng)者鏈上第一個(gè)想處理消息的對(duì)象上。我們現(xiàn)在主要收集有指定target響應(yīng)的action。

我們可以hook UIApplication對(duì)象的sendAction:to:fromSender:forEvent:方法,收集信息。

代碼如下:

@interface UIApplication (HLCHook)
+ (void)hookUIApplication;
@end

@implementation UIApplication (HLCHook)
+ (void)hookUIApplication
{
Method controlMethod = class_getInstanceMethod([UIApplication class], @selector(sendAction:to:from:forEvent:));
Method hookMethod = class_getInstanceMethod([self class], @selector(hook_sendAction:to:from:forEvent:));
method_exchangeImplementations(controlMethod, hookMethod);
}


- (BOOL)hook_sendAction:(SEL)action to:(nullable id)target from:(nullable id)sender forEvent:(nullable UIEvent *)event;
{
NSString *actionDetailInfo = [NSString stringWithFormat:@" %@ - %@ - %@", NSStringFromClass([target class]), NSStringFromClass([sender class]), NSStringFromSelector(action)];
NSLog(@"%@", actionDetailInfo);
return [self hook_sendAction:action to:target from:sender forEvent:event];
}
@end

至此,核心功能已經(jīng)實(shí)現(xiàn),只需要在UIApplication的代理方法application:didFinishLaunchingWithOptions:中添加[UIApplication hookUIApplication];方法,即可實(shí)現(xiàn)。

同理可得埋點(diǎn)UINavigationController的push和pop,一個(gè)頁(yè)面的停留時(shí)間,都可以用hook方式實(shí)現(xiàn)

總結(jié):

1.hook方式非常強(qiáng)大,幾乎可以截取任何用戶想截取的消息事件,但是,每次觸發(fā)hook,必然存在置換IMP整個(gè)過(guò)程,頻繁的置換IMP必然會(huì)影響到應(yīng)用及手機(jī)資源的消耗,不到非不得已,建議少用。
2.需要知道什么時(shí)候用hook方式來(lái)埋點(diǎn)。如果十個(gè)頁(yè)面,只有一兩個(gè)頁(yè)面需要埋點(diǎn),是不需要用hook方式來(lái)埋點(diǎn)的。沒(méi)有最好的方法,只有最合適的方法。


覺(jué)得有用,請(qǐng)幫忙點(diǎn)亮紅心


Better Late Than Never!
努力是為了當(dāng)機(jī)會(huì)來(lái)臨時(shí)不會(huì)錯(cuò)失機(jī)會(huì)。
共勉!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容