通用的iOS/Android用戶行為跟蹤機制

bcf2 10年前發布 | 52K 次閱讀 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方法來實現。
    </li>
  • extraInfo:
    對于一些特殊場景,需要紀錄額外的信息,通過這個字段來實現。實現方式類似于trackingTag, Dictionary 類型。 在Hook UI事件時,要保證tracking event的發送在 程序的event handler之后,這樣才能保證tracking event發送時extraInfo已被填充。
  • </ul>

    Page View信息

    主要用作紀錄用戶在每個頁面的停留時間,iOS紀錄到UIViewController這個層面,Android紀錄到Activity層面。

    • iOS 通過Method Swizzle 來Hook UIViewController的 ViewWillAppear 和 ViewWillDisapper函數。
    • Android 自定義TrackableActivity實現。
    • 同時提供Tracking.BeginPageView() 和 Tracking.EndPageView()的方法,供某些特殊場景自定義自己的PageView tracking。

    防遺漏機制

    • 增加一個TrackingDebug開關,當這個開關打開時,會全局遍歷當前Visual Tree, 給所有可以交互并且沒有分配trackingTag的UIElement畫一個紅色的框。
    • 可以添加Build 腳本, 在編譯時進行檢查。
    來自:http://jimhuang.cn/?p=44

 本文由用戶 bcf2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!