图片展示

打造属于自己的用户行为统计系统

关注:722     发表时间:2017-04-21 10:46:49 来源:CSDN博客 博主:JackLee18

打造一款符合自己公司需求的用户行为统计系统,相信是很多运营人员的梦想,也是开发人员对技术的的执着追求。下面我为大家分一享下自己为公司打造的用户行为统计系统。

  打造一款符合自己公司需求的用户行为统计系统,相信是很多运营人员的梦想,也是开发人员对技术的的执着追求。下面我为大家分一享下自己为公司打造的用户行为统

计系统。 

  用户行为统计(User Behavior Statistics, UBS)一直是移动互联网产品中必不可少的环节,也俗称埋点。对于产品经理,运营人员来说,埋点当然是越多,覆盖范围越广

越好。废话废话就不多少了,这里我主要利用了AOP面向切片编程的思想来解决

这个问题的。


用户行为统计统计什么?


  我们常常说用户行为统计,那么用户行为统计主要统什计么呢,在我看来主要分为两类:1,页面统计:PV ;2,事件统计:Event。


页面统计:PV


  页面统计就是就在用户进入某个页面的时候,进记行录保存;在用户离开某个页面的时候进行保存记录。在当适的时候将保存的数据发送给后台服务器。实现代码如下:



很多博客贴出这样的代码以为就解决了问题,其实忽略了很大的一个问题,这样简粗单暴的去处理,会发现项中目所的有UIViewCnotroller的这两个方法viewDidAppear:,

viewDidDisappear:都被会hook,造了成额外的性能开销,非常的不好。所以我边这进行了处理只针对要统的计页面进行hook操作。具现体实如下:


事件统计:Event


  事件统计主要是在用户触发事件时进行记录保存,然后在合适的时候将记的录数据发送给后台服务器进行处理。按照文章开头参考博客所说,简单将件事分成了

UIButotn,UIControl,UIGestureRecognizer以及点击UITableView单元格cell触发的事件,点击UICollectionView单元格cell触发的事件。 

  按照这个思路我首先对UIButton,UIControl触发的事件进行处理:



这个实现起来相对容易些,相信大家都有实现过。


  对UIGestureRecognizer触发的事件进行处理,比较麻烦 首先UIGestureRecognizer是一个类簇,我们触发事件时的tap,LongPress,swipe,pan等手势发送事件是

并不是发送事件的真正的类,我这边通过打断点的形式找到了发送事件的真正的类:UIGestureRecognizerTarget 发送事件的私有方法

是:_sendActionWithGestureRecognizer: 然后我就通过hook操作对手势触发的事件进行了处理:



对手势触发的事件进行统计虽然困难,但还是实现了。 

  对于点击UITableView单元格cell触发的事件,点击UICollectionView单元格cell触发的事件。我这边以点击UITableView单元格cell触发的事件为例进行说明。

假设JKBViewController实现了UITableView 的代理方法tableView:didSelectRowAtIndexPath:那么我的实现如下:



通过这个实现我们能够做到对点击UITableView单元格cell触发的事件进行统计,但是顺着参博考客作者的思路这一步一步做下来,做到这里我内心有种不的妙感觉。


走进死胡同


以下是参考的博客作者在开发的过程中遇到的问题



其针实对第1点,我边这虽然梳理了很多类型的事件,但是仍然有很多没有被统计上,比如摇一摇触发的事件,计步器触发的事件,tabBar点击触发的事件等,还

很有多我可能没到想的事件,我现发如果按照作者的意图,按照事件触发的类型去一个一个的进行hook操作的话,工作两蛮大,而且还是会有遗漏的。尤是其涉

及到有方些法苹果没有开放给开发者,我们进行处理的话比较麻烦。开员发人估被计要累死啊。 

针对第2点,按作照者的意图,会现发点击之后里面还有层层的判断,如何绕过层层的判断呢?这个我会在接下来详细阐述。 

针对第4点,我在上面已经实现过了。 

针对第5点,在现实的情况中确实存在者不同的页面中,甚至相同的页面中不同的按钮对应着同一个事件这样的问题。如果按照参考博客作者的思路确实处理起来

很是麻烦。


返璞归真


  针对上面出现的困境,我在想有没有更好的办法去解决呢。首先想到我们统计用户操的作事件,并是不为了统计用户点击了某个按钮,或者进行了某个手势

操作,调了用某个代理方法。而为是了统计用户进行这个操作的目的是什么,是为了购物,还是为了分享等。所以我就打破参考博客作者的思路,不再对按钮,

手势,单元格选中等事件进行hook,而是对用户的目的事件触发的方法进行hook,事件就是事件,没有来源之分。也就是hook就提示的事件,中间层层的逻辑

判断,我不需要考虑,我只考虑hook的目的事件。举例个子,用户要行进分享- (void)goShare;,我不关心用是户否点击了按钮,或者tap手势触发了方法,或者

单元格被中选,我只关心分享的方法- (void)goShare;有没有被调用,被调用的时候我是否可以进记行录操作。另外唯一确定一个方法,除了selector,还要有相关

target(方法的实现者,或者消息接受者)。针上面第5点,不同按钮对应同一个事件,一般情况下事件相同target不同,我们是能够区别的出来的。当了然也存在

同一个页面上的不同按钮触发的同一个事件,这种情况下不是太常见,函数外面包一层,改个别的名字区分一下就好了,不过EnvetID还是要一样的。 

  为了更好的方便大家,我这边按自照己的思路写了一个pod库,下面先说一下自己的plist文件文件: 


大家可以看到PV字段下,每一个页面都以可设置页面的名字,还一有些其他的信息。 Event字段下有EventID,同时呢也允许同一个EventID下有不同的触发事件。 事件1这一级字段写

上具体的事件内容,主要是方便开发人读员阅查找。 JKVC1点击,JKVC2点击,tap单击,选中tableView单元格这些都是为了标件来明事源,方便开发人员阅读。另外如果事件还需

要配置额外的参数,那么可以在EventID同级字段下添加新的内容。 下看看面来代码吧: 


JKUBS.h



其中有两个方法要重点说一下。



这两个方法都需要在JKUBS的category进行重载,来做具体的实现。例如页面活动的记录,事件的记录。打造用户行为统计系统,我这边已经完成了AOP思想下的事件采集,具体如何记录,

保存,发给送后台,这里就不详细说明了。

首页| 关于我们| 联系我们

版权所有 ©copyright 2015 - 2018 | 广州蜂陶信息技术有限公司 |粤ICP备16034685号

友情链接:百度  知乎