很早之前拜读了limboy 的iOS 统计打点那些事这篇文章,之后又了解了heapanalytics可视化全埋点,对我的帮助很大。
前期的简单做法是UI设计完界面后标坐标的时候同时给所有可点击控件标一个event id。 这个id可以为一个递增数字, 也可以为控件内随机点一个点后取x,y的组合, 也可以用随机数的, 只要保证唯一就可以了。 event id可以一类控件用一个id, 也可以按照界面将一类控件分成多个id。 一类控件用多个id的好处是数据组好过滤。然后开发写代码的时候将这个id写进控件里面, 然后全局拦截所有的点击事件, 加入埋点处理的代码。
为了与其他端保持一致的统计方式最后实现的格式如下
1 | <UIView page = "XMStoreScrollPageViewController" pageAttribute = |
我们只统计到当前ViewController的层,当然如果view没有对应的viewController 那么就使用window当根节点。
Code
整合limboy提供能的代码,可以完成如下
1 | #import <Foundation/Foundation.h> |
1 | #import "Aspects.h" |
1 | @implementation PTAnalyticsUtility |
1 | @implementation NSObject (Extents) |
整合
很多死板的方式是在 print 函数中将打印的字符串上报到服务器,这样的坏处是你每点击一次就会上报一次,对服务器的压力有点大。那么最好的方式是将这些打点记录到一个文件中,等下次应用唤起的时候上传文件到日志分析平台。其实这种方式现有三方控件有很多。我使用的是CocoaLumberjack,它是Mac和iOS上一个集快捷、简单、强大和灵活于一身的日志框架。
用DDLog替换NSLog语句
DDLog的头文件定义了你用来替换NSLog语句的宏,本质上看起来向下边这样:
1 | // Convert from this: |
我们看到DDLog宏和NSLog的语法完全相同。
所以你所要做的就是决定每个NSlog语句属于哪种日志级别。DDLog默认有四种级别的日志,分别是:
- @DDlogError
- @DDlogWarn
- @DDlogInfo
- @DDlogVerbose
其实这种标记方式跟我们打点统计好像没有什么关系,后来我们将DDLog重新封装了下,添加一个级别 Statistic 的等级。以便之后日志分析系统方便查看和分析。
优化
这种打点方式的一个缺陷是在你给一个按键添加一个点击事件的时候就需要将对应的方法加入到你的文件列表中。在iOS中有这么一个函数,所有UI事件都会经过这个函数,补充: 实际测试发现对 UICollectionView, UITableView等 控件要做额外的 Hook。
1 | [UIApplication sendAction:to:from:forEvent:] |
可以将PTAnalytics.m做如下修改
1 | - (void)setupAnalytics |
当然你还可以hook UITableView 和 UICollectionView 的delegate的方法
1 | [UICollectionView |