iOS 無侵入埋點的實現(xiàn)

埋點
  • 概念:在iOS開發(fā)中,埋點可以解決兩大類問題,一是了解用戶使用App的行為烁兰,二是降低分析線上問題的難度减响。
  • 常見的埋點方式
    常見的埋點方式主要包括代碼埋點靖诗、可視化埋點和無埋點三種
  1. 代碼埋點主要就是通過手寫代碼的形式埋點,能很精確的在需要埋點的代碼處加上埋點的代碼支示,可以很方便的記錄當前環(huán)境的變量值刊橘,方便調試,并跟蹤埋點內容颂鸿。但存在開發(fā)工作量大促绵,并且埋點代碼到處都是,后期難以維護等問題嘴纺。
  2. 可視化埋點败晴,就是將埋點增加和修改的工作可視化了,提升了增加和維護埋點的體驗栽渴。
  3. 無埋點尖坤,并不是不需要埋點,而更確切的說是“全埋點”闲擦,而且埋點代碼也不會出現(xiàn)在業(yè)務代碼中糖驴,容易管理和維護。它的缺點在于佛致,埋點成本高贮缕,后期的解析也比較復雜,再加上view_path的不確定性俺榆。所以這種方案不能解決所有的埋點需求感昼,但對于大量通用的埋點需求來說,能夠節(jié)省大量的開發(fā)和維護成本罐脊。

其中定嗓,可視化埋點和無埋點蜕琴,都屬于無侵入埋點的內容,因為它們都不需要在工程代碼中寫入埋點代碼宵溅。所以凌简,采用這樣的無侵入埋點方案,既可以做到埋點被統(tǒng)一處理恃逻,又可以實現(xiàn)和工程代碼的解耦雏搂。

運行時方法替換方式進行埋點

iOS開發(fā)中,最常見的三種埋點寇损,就是對頁面進入次數(shù)凸郑、頁面停留時間、點擊事件的埋點矛市。對于這三種常見情況芙沥,我們都可以通過運行時方法替換技術來插入埋點的代碼,以實現(xiàn)無侵入的埋點方式浊吏。

  1. 對于頁面曝光埋點而昨,則需要對VC的生命周期方法進行埋點,交換VC的viewWillAppear找田、viewDidAppear配紫、viewWillDisappear、viewDidDisappear等方法午阵,這樣的我們就可以在交互的方法里面加上埋點代碼躺孝。
    如果區(qū)分不同的UIViewController呢?我們可以使用NSStringFromClass([self class])類名字符串來標識不同的UIViewController底桂。

  2. 對于點擊事件來說植袍,則需要替換Button的點擊事件方法sendAction:to:forEvent,以調用埋點代碼籽懦。
    和UIViewController生命周期埋點不同的是于个,UIButton在一個視圖類中可能有多個不同的繼承類,相同UIButton的子類在不同視圖類的埋點也要區(qū)分開暮顺,這時候厅篓,我們可以通過action選擇器名NSStringFromSelector(action)+視圖類名NSStringFromClass([target class])組合成為唯一的一個標識,來進行埋點記錄捶码。

  3. 除了UIViewController羽氮、UIButton空間以外,Cocoa框架的其他控件都可以通過這種方法來進行無侵入埋點惫恼。以Cocoa框架中最復雜的UITableView控件為例档押,你可以hook setDelegate方法來實現(xiàn)無侵入埋點。另外,對于Cocoa框架中的手勢事件(Gesture Event)令宿,我們也可以通過hook initWithTarget:action:方法來實現(xiàn)無侵入埋點叼耙。

事件的唯一標識

通過運行時替換的方式,我們能夠hook住所有的Objective-C方法粒没,可以說大而全了筛婉,能夠幫助我們解決大部分的埋點問題。

但是癞松,這種方案的精確度還不夠高爽撒,還無法區(qū)分相同類在不同視圖樹節(jié)點的情況。比如拦惋,一個視圖下相同UIButton的不同實例,僅僅通過action選擇器名+視圖類名的組合還不能夠區(qū)分開安寺。這是厕妖,我們就需要一個唯一標識來區(qū)分不同的事件。

如何制定出這個唯一標識
  1. 可以通過視圖層級的路徑來解決這個問題挑庶。因為每個頁面都有一個視圖樹結構言秸,通過視圖的superview和subviews的屬性,我們就能夠還原出每個頁面的視圖樹迎捺。視圖樹的頂層是UIWindow举畸,每個視圖都在樹的子節(jié)點上。
    一個視圖下的子節(jié)點可能是同一個視圖的不同實例凳枝,比如如果UIView中有兩個UIButton是同一個類的不同實例抄沮,所以光靠視圖樹的路徑還是沒辦法確定出唯一的視圖標識。
    這時候岖瑰,索引可以解決這個問題:每個視圖在父視圖中都會有自己的索引叛买,如果我們再加上這個索引的話,每個視圖的標識就是唯一的了蹋订。
  2. 視圖層級路徑加上在父視圖中的索引來進行唯一標識率挣,也無法涵蓋所有情況
    類似于UITableViewCell這種具有可復用機制的視圖,cell會在頁面滾動時不斷復用露戒,這種情況下加索引的方法還是沒用椒功。這時候我們可以通過cell的索引,也就是indexPath的section和row的值去確定cell的唯一性智什。
  3. UIAlertController也比較特殊动漾,它的特殊性在于視圖層級的不固定,因為它可能出現(xiàn)在任何頁面中荠锭。這時候我們可以通過上層視圖+彈窗內容來確定唯一標識谦炬。
  4. 其它的情況,我們可以想辦法找出相同視圖中不同的元素,然后進行組合键思,最后形成一個能夠區(qū)別于其他元素的標識來础爬。
  5. 除此之外,如果在程序運行過程中吼鳞,修改視圖的層級和索引看蚜,比如執(zhí)行insetSubView:atIndex:、removeFromSuperView等方法時赔桌,我們也無法獲得唯一標識供炎,即使只截取部分路徑也無法保證后期代碼更新時不會動到這個部分。就算是運行時視圖層級不會修改疾党,以后需求更新迭代頁面頻繁的話音诫,視圖唯一標識也需要同步的更新維護。

事件唯一標識的準確性難以保障雪位,這也是通過運行時方法替換進行無侵入埋點很難在各個公司全面鋪開的原因竭钝。雖然無侵入埋點無法覆蓋到所有情況,但是還是解決了部分的埋點需求雹洗,也節(jié)省了大量的人力成本香罐。

小結

通過運行時替換方法來實現(xiàn)無侵入埋點的方案,由于唯一表示難以維護和準確性難以保障的原因时肿,很難被全面采用庇茫,一般都只是用于一些功能和視圖穩(wěn)定的地方,手動埋點依然占據(jù)大部分場景螃成。

所以說旦签,這種方案不一定是未來的方向。使用clang AST的接口寸宏,在構建時遍歷AST顷霹,通過定義的規(guī)則將所需要的埋點代碼直接加進入,可能會更合適击吱。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末淋淀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子覆醇,更是在濱河造成了極大的恐慌朵纷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件永脓,死亡現(xiàn)場離奇詭異袍辞,居然都是意外死亡,警方通過查閱死者的電腦和手機常摧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門搅吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來威创,“玉大人,你說我怎么就攤上這事谎懦《遣颍” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵界拦,是天一觀的道長吸申。 經(jīng)常有香客問我,道長享甸,這世上最難降的妖魔是什么截碴? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蛉威,結果婚禮上日丹,老公的妹妹穿的比我還像新娘。我一直安慰自己蚯嫌,他們只是感情好哲虾,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著齐帚,像睡著了一般妒牙。 火紅的嫁衣襯著肌膚如雪彼哼。 梳的紋絲不亂的頭發(fā)上对妄,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音敢朱,去河邊找鬼剪菱。 笑死,一個胖子當著我的面吹牛拴签,可吹牛的內容都是我干的孝常。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蚓哩,長吁一口氣:“原來是場噩夢啊……” “哼构灸!你這毒婦竟也來了?” 一聲冷哼從身側響起岸梨,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤喜颁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后曹阔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體半开,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年赃份,在試婚紗的時候發(fā)現(xiàn)自己被綠了寂拆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奢米。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纠永,靈堂內的尸體忽然破棺而出鬓长,到底是詐尸還是另有隱情,我是刑警寧澤渺蒿,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布痢士,位于F島的核電站,受9級特大地震影響茂装,放射性物質發(fā)生泄漏怠蹂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一少态、第九天 我趴在偏房一處隱蔽的房頂上張望城侧。 院中可真熱鬧,春花似錦彼妻、人聲如沸嫌佑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屋摇。三九已至,卻和暖如春幽邓,著一層夾襖步出監(jiān)牢的瞬間炮温,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工牵舵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柒啤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓畸颅,卻偏偏與公主長得像担巩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子没炒,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345