转载

通用的 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已被填充。
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 脚本, 在编译时进行检查。

广告

招聘从一线城市回到武汉的iOS, 前端,服务器端,C++ 工程师, 详情请点击 Hiring。

正文到此结束
Loading...