通用的iOS/Android用戶行為跟蹤機制
用戶行為跟蹤和分析對于改善產品非常重要,目前也有很多tracking服務, 比如國外的Google Analytics, Flurry 和國內的友盟等等。
讓大家困擾的一個問題是,為了track用戶的行為,我們需要到處”埋點”,非常不易于維護,而且容易遺漏。這里介紹一個相對通用的方式,可以在iOS和Android應用中進行用戶行為跟蹤。
設計目標
- 相對通用的方案,避免到處打點,丑陋且不易于維護
- 盡可能紀錄所有事件,且每個事件包含足夠的信息來進行區分。
- 有機制避免人為遺漏
- 對特殊場景, 如果需要紀錄額外的信息,提供擴展方法或屬性
方案實現
大致思路是在程序里或者Layout xml里給可交互的UI元素分配Tag,然后在統一的地方Hook事件處理并發送track event。
考慮過但是最后舍棄的方案:
- 類似于[[http://blog.heapanalytics.com/|Heap]]的 Auto Logging機制。通過反射自動生成tracking event里的信息, 主要的問題在于自動生成的信息可能不夠全,很多場景不足以Identify某個行為。
- 繼承的方式,定義自己的UIButton, UIListView, UICellView,UIActivity, 在自定義的控件里提供tracking機制, 然后所有用到這些控件的地方都換成自定義控件。問題在于 1)繼承的方式比較重,不靈活,對于第三方的控件沒有辦法支持 2)開發會變的麻煩,比如在xib里拖的系統控件全部要變成自定義控件,對現有代碼也要做很多修改。
Hook UI 事件
-
iOS
通過Method Swizzle來hook [UIApplication sendAction:to:from:forEvent:],iOS的所有UI事件都會經過這個函數。參見 這里]
補充: 實際測試發現對UIButton, UIAlertView, UITableView等 控件要做額外的 Hook,后面有時間放上源代碼。 -
Android
通過修改RoboBinding框架來實現。在綁定事件的地方完成事件調用后 統一發送tracking event。
Tracking Event 信息
-
trackingTag: 給每個可交互的UI元素分配一個trackingTag屬性,string類型, 來紀錄哪個元素被點擊了,通過Attach Property的方式來實現。
- iOS: 通過associate object實現
- Android: xml里通過修改RoboBinding框架來實現,增加trackingTag這個自定義屬性。 代碼里可以通過Helper方法來實現。
-
extraInfo:
對于一些特殊場景,需要紀錄額外的信息,通過這個字段來實現。實現方式類似于trackingTag, Dictionary 類型。 在Hook UI事件時,要保證tracking event的發送在 程序的event handler之后,這樣才能保證tracking event發送時extraInfo已被填充。
</ul>
- iOS 通過Method Swizzle 來Hook UIViewController的 ViewWillAppear 和 ViewWillDisapper函數。
- Android 自定義TrackableActivity實現。
- 同時提供Tracking.BeginPageView() 和 Tracking.EndPageView()的方法,供某些特殊場景自定義自己的PageView tracking。
- 增加一個TrackingDebug開關,當這個開關打開時,會全局遍歷當前Visual Tree, 給所有可以交互并且沒有分配trackingTag的UIElement畫一個紅色的框。
- 可以添加Build 腳本, 在編譯時進行檢查。
Page View信息
主要用作紀錄用戶在每個頁面的停留時間,iOS紀錄到UIViewController這個層面,Android紀錄到Activity層面。
防遺漏機制
本文由用戶 bcf2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!