iOS 關(guān)于統(tǒng)計打點

? ? 之前到別人的一篇博客上評論了下他的打點統(tǒng)計方法,后來很多人來問我俏蛮,,所以還是決定寫下這篇文章上遥。第一次寫博客搏屑,不喜勿噴。

? ? 關(guān)于統(tǒng)計打點粉楚,個人覺得最好的還是用面向切面編程思想(AOP)辣恋,這樣可以實現(xiàn)把我們的統(tǒng)計打點功能提出來與一批對象進行隔離亮垫,這樣與一批對象之間降低了耦合性。這里需要用到的就是Method Swizzling伟骨,如果不知道Method Swizzling饮潦,先百度一下。下面開始一一說:

一底靠、頁面(UIViewController)統(tǒng)計?

UIViewController統(tǒng)計比較簡單害晦,一般也就需要在viewWillAppear和viewWillDisappear里進行統(tǒng)計 。所以我們只需要在category中交換viewWillAppear和viewWillDisappear和兩個方法即可

#import "UIViewController+Tracking.h"

#import <objc/runtime.h>

@implementation UIViewController (Tracking)

+ (void)load {

// 交換方法viewWillAppear:

method_exchangeImplementations(class_getInstanceMethod(self, @selector(viewWillAppear:)),class_getInstanceMethod(self, @selector(tracking_viewWillAppear:)));

//交換方法viewWillDisappear:

method_exchangeImplementations(class_getInstanceMethod(self, @selector(viewWillDisappear:)), class_getInstanceMethod(self, @selector(tracking_viewWillDisappear:)));

}

- (void)tracking_viewWillAppear:(BOOL)animated {

[self tracking_viewWillAppear:animated];

//此處添加你想統(tǒng)計的打點事件

NSLog(@"當(dāng)前viewController :%@",NSStringFromClass([self class]));

}

- (void)tracking_viewWillDisappear:(BOOL)animated {

[self tracking_viewWillDisappear:animated];

//此處添加你想統(tǒng)計的打點事件

NSLog(@"當(dāng)前viewController :%@",NSStringFromClass([self class]));

}

經(jīng)過以上交換 暑中,所有的viewController就會走到自定義的tracking_viewWillAppear和tracking_viewWillDisappear方法壹瘟,就可以在注釋的地方做頁面統(tǒng)計事件了。這里統(tǒng)計建議先建立個viewController的類名或者title作為索引值鳄逾,自定義標(biāo)識為鍵值的字典或plist文件稻轨,比如@{@"homeViewController" : @"首頁"},然后就可以直接在注釋處通過NSStringFromClass([self class])獲取到viewController的類名然后索引到自定義標(biāo)識雕凹。

不過有時候殴俱,可能會出現(xiàn)一個viewController可能會復(fù)用,比如用type(或title)區(qū)分的情況枚抵,线欲,這時候,就需要你在注釋處汽摹,對self進行判斷李丰,如果是這些類,強轉(zhuǎn)后得到該類逼泣,在類名后拼接上type(或title)作為字典索引值趴泌,比如@{@"homeViewController_type1" : @"首頁", @"homeViewController_type2" : @"第二頁",}


二、按鈕(UIControl)及UIBarButtonItem點擊事件

要想統(tǒng)計UIControl點擊事件拉庶,嗜憔,首先要知道從哪地方進行方法交換,在UIControl里找到sendAction:to:forEvent:方法氏仗,吉捶,這是每次點擊都會走的方法

#import "UIControl+Tracking.h"

#import <objc/runtime.h>

@implementation UIControl (Tracking)

+ (void)load

{

method_exchangeImplementations(class_getInstanceMethod(self, @selector(sendAction:to:forEvent:)), class_getInstanceMethod(self, @selector(tracking_sendAction:to:forEvent:)));

}

- (void)tracking_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

{

[self tracking_sendAction:action to:target forEvent:event];

//此處添加你想統(tǒng)計的打點事件

}

就這么兩句代碼 ,然后所有的UIControl點擊事件皆尔,就會走這注釋處帚稠,我們就可以進行點擊統(tǒng)計了,在注釋這里床佳,可以獲取到的信息有action(點擊響應(yīng)的方法),control的target榄审,self(就是control本身了砌们,可以獲取title,tag等信息)還有event。簡單吧。不過這里要建的索引表就有點復(fù)雜了浪感,最常見的昔头,在同一個target(比如viewController)下,多個control指向同一方法影兽,這時我們就需要用self的tag屬性來做區(qū)分了揭斧。所以我建議拼接索引值時將target,action和tag三個值給拼起來。如@{@"homeViewController_searchAction_tag1" : @"首頁的第一個搜索按鈕" , @"homeViewController_searchAction_tag2" : @"首頁的第二個搜索按鈕"}

UIBarButtonItem 的點擊事件也會走到- (void)tracking_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event方法這峻堰,只是target變成了UIBarButtonItem讹开,所以我們需要到這方法里,對target進行判斷

- (void)tracking_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

{

[self tracking_sendAction:action to:target forEvent:event];

if ([target isKindOfClass:[UIBarButtonItem class]]) {

UIBarButtonItem *item = (UIBarButtonItem *)target;

// 在此拼接NSStringFromClass([item.target class])和NSStringFromSelector(item.action)]]

}else {

//此處添加你想統(tǒng)計的打點事件

// 在此拼接將NSStringFromClass([target class]) ,NSStringFromSelector(action)和tag三個值給拼起來

}

}


三捐名、UITableView的cell點擊事件

UITableView的點擊事件就稍微麻煩點了旦万,因為需要切面的點擊方法tableView:didSelectRowAtIndexPath:是在代理那,所以我們需要先替換設(shè)置代理方法镶蹋,獲取到代理人成艘,然后再進行切面,上代碼

#import "UITableView+Tracking.h"

#import <objc/runtime.h>

#import <objc/message.h>

@implementation UITableView (Tracking)

+ (void)load{? ?

?//交換實現(xiàn)setDelegate,獲取到代理人? ? method_exchangeImplementations(class_getInstanceMethod(self, @selector(setDelegate:)), class_getInstanceMethod(self, @selector(tracking_setDelegate:)));

}

- (void)tracking_setDelegate:(id)delegate

{

[self tracking_setDelegate:delegate];

Class class = [delegate class];

// 在代理人這先添加用于實現(xiàn)統(tǒng)計的方法贺归,然后和交換原先的點擊方法

if (class_addMethod(class, NSSelectorFromString(@"tracking_didSelectRowAtIndexPath"), (IMP)tracking_didSelectRowAtIndexPath, "v@:@@")) {

Method dis_originalMethod = class_getInstanceMethod(class, NSSelectorFromString(@"tracking_didSelectRowAtIndexPath"));

Method dis_swizzledMethod = class_getInstanceMethod(class, @selector(tableView:didSelectRowAtIndexPath:));

//交換實現(xiàn)

method_exchangeImplementations(dis_originalMethod, dis_swizzledMethod);

}

}

void tracking_didSelectRowAtIndexPath(id self, SEL _cmd, id tableView, id indexpath)

{

SEL selector = NSSelectorFromString(@"tracking_didSelectRowAtIndexPath");

((void(*)(id, SEL,id, id))objc_msgSend)(self, selector, tableView, indexpath);

//此處添加你想統(tǒng)計的打點事件

}

@end

這里會因為要將代理人的方法進行切面淆两,所以這需要給代理人通過class_addMethod這方式動態(tài)的添加方法。至于為什么要判斷是因為拂酣,只能第一次添加時才進行交換秋冰,不判斷的話,多設(shè)置幾次delegate踱葛,就會多交換幾次丹莲,偶數(shù)次就會還原了,不會進入設(shè)置好的統(tǒng)計打點方法尸诽。至于為什么要寫成((void(*)(id, SEL,id, id))objc_msgSend)甥材,是為什么兼容ios的多版本問題。最后的統(tǒng)計和上面的也差不多了性含,都是建立字典洲赵,只不過已知信息換成了(id self, SEL _cmd, id tableView, id indexpath),里面self也就是delegate商蕴,


四叠萍,UICollectionView的點擊統(tǒng)計

UICollectionView的點擊統(tǒng)計和UITableView的點擊統(tǒng)計原理差不多,都是先交換setDelegate:這里就不展示了绪商,想要看直接去我的github上下載就可以了苛谷,下載地址https://github.com/363128432/ActionTracking/tree/master/Tracking




最后,很多人還問格郁,能不能自動生成索引字典的key腹殿,独悴,這我只想到了進入每個頁面時自動寫成plist文件的key,最后導(dǎo)出成锣尉,刻炒,但是需要人一個頁面一個頁面創(chuàng)建,如果有誰知道怎么一開始在main函數(shù)獲取所有的類自沧,歡迎聯(lián)系我坟奥,,解決這一問題拇厢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爱谁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旺嬉,更是在濱河造成了極大的恐慌管行,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邪媳,死亡現(xiàn)場離奇詭異捐顷,居然都是意外死亡,警方通過查閱死者的電腦和手機雨效,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門迅涮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徽龟,你說我怎么就攤上這事叮姑。” “怎么了据悔?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵传透,是天一觀的道長。 經(jīng)常有香客問我极颓,道長朱盐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任菠隆,我火速辦了婚禮兵琳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骇径。我一直安慰自己躯肌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布破衔。 她就那樣靜靜地躺著清女,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晰筛。 梳的紋絲不亂的頭發(fā)上嫡丙,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天忠售,我揣著相機與錄音,去河邊找鬼迄沫。 笑死,一個胖子當(dāng)著我的面吹牛卦方,可吹牛的內(nèi)容都是我干的羊瘩。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼盼砍,長吁一口氣:“原來是場噩夢啊……” “哼尘吗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浇坐,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤睬捶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后近刘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擒贸,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年觉渴,在試婚紗的時候發(fā)現(xiàn)自己被綠了介劫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡案淋,死狀恐怖座韵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踢京,我是刑警寧澤誉碴,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站瓣距,受9級特大地震影響黔帕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旨涝,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一蹬屹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧白华,春花似錦慨默、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至管搪,卻和暖如春虾攻,著一層夾襖步出監(jiān)牢的瞬間铡买,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工霎箍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奇钞,地道東北人。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓漂坏,卻偏偏與公主長得像景埃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子顶别,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉谷徙,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 751評論 0 1
  • 1.背景說明 最近公司需要對用戶行為進行深層次的數(shù)據(jù)分析和挖掘,需要用戶詳細(xì)的操作數(shù)據(jù)驯绎,想走無埋點的數(shù)據(jù)上報方式完慧。...
    木魚鐘閱讀 792評論 1 0
  • 1、禁止手機睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa閱讀 1,116評論 1 6
  • 晨光薄雪,了無痕 作者\茶呵呵 飛鴻掠影赴叹,已去 你鸿染,卻存留心 薄雪無意屬今朝 你,確有盛情 既已飛下乞巧,難免指爪 飄...
    墨跡簡書閱讀 192評論 2 6