埋点:用于了解用户使用App的行为 和 降低分析线上问题的难度。
目前常见的埋点方式:代码埋点、可视化埋点与无埋点(全埋点)。
-
代码埋点 通过手写代码的方式来埋点,可以很精确的在需要埋点的地方加上埋点,很方便的记录当前环境的变量值,方便调试并跟踪埋点内容,但存在开发量大,并且埋点代码到处有所以难维护。
-
可视化埋点,将埋点增加和修改的工作可视化,提升了增加和维护埋点的体验。
-
无埋点,确切说是“全埋点”。埋点代码不会出现在业务代码中,容易管理和维护。但是埋点成本高,后期的解析也比较复杂,再加上view_path的不确定性。所以,只适用于大量通用的埋点需求,能够节省大量的开发和维护成本。
其中,可视化埋点与无埋点属于无侵入的埋点方案,因为不需要在工程代码中写入埋点代码。所以,采用这样的无侵入埋点方案,可以做到埋点被统一维护,又可以实现埋点和工程代码的解耦。
运行时方法替换方式进行埋点
常见的三种埋点,就是对页面进入次数、页面停留时间、点击事件的埋点。对于这三种情况,可以通过运行时方法替换技术来插入埋点代码,以实现无侵入的埋点方法。
具体方法:先写一个运行时方法替换的类ADHook,再加上替换的方法。方法利用运行时method_exchangimplementations接口将方法的实现进行了交换,原方法调用时就会被hook住,从而去执行指定的方法。
页面进入次数、页面停留时间都需要对UIViewController生命周期进行埋点。可以创建一个UIViewController的Category,通过替换ViewWillAppear与ViewDidAppear来达到目的,在替换方法里增加埋点需求。
如何区别不同的UIViewController?
可以使用NSStringFromClass([self class])方法来获取类名,通过类名来区别不同的UIViewController。
对于点击事件也可以通过运行时方法替换的方式进行无侵入埋点。需要找到点击事件的方法sendAction:to:forEvent:,然后在+load()方法使用ADHook替换为自定义的方法。
和UIViewController生命周期埋点不同,UIButton在一个视图类中可能有多个不同的继承类,相同的UIButton的子类在不同视图类的埋点也要区别开。
简单说,UIButton不能根据类名来区分,因为多个视图可能用的同一个UIButton类。
所以需要通过“action 选择器名NSStringFromSelector(action)” +“视图类名NSStringFromClass([target class])”组合成一个唯一的标识。
事件唯一标识
如果想区分相同类在不同视图节点的情况。比如,一个页面的两个UIButton,这时候需要一个唯一标识来区分不同的事件。
寻找方法,就是尽可能找出元素的唯一性,然后以唯一性作为标志。而且要考虑到inserSubView:atIndex: 、removeFromSuperView等方法。
网友评论