iOS自动化埋点探索
https://mp.weixin.qq.com/s/u-HmmrSAgtER1N2pKxCm0A
问: 如果我只想跟踪某三个viewcontroler
答: 可以在plist中设置要跟踪的vc
问: 通过什么hook?
答: 写一个uicontrol category, 不需要引入, 重写load方法, 通过method swizzling, 动态交换方法, 然后跟踪sendAction to forEvent
问: 如果我要hook所有的按钮点击事件, 怎么做?
答: 所有的按钮被点击时,都会触发UIApplication的sendAction方法,我们hook这个方法,即可拦截所有按钮的点击事件。
问: 全自动无埋点(全埋点)有什么不好的地方?
答: 无埋点方案由于全部数据都收集,造成数据量巨大,这给服务器和网络传输带来较大负载,另外数据清洗难度也非常大
hook
的方法
在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。
利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法hook的目的。
每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的Method实现。
https://blog.csdn.net/chenxi506343891/article/details/72832678
- 用 method_exchangeImplementations 方法来交换2个方法中的IMP,
- 用 class_replaceMethod 方法来修改类,
- 用 method_setImplementation 方法来直接设置某个方法的IMP,
在 上篇文章 中简单提了一下,SDK 在实现对基本事件数据的自动收集时,主要 hook
的方法分为 3 类:
- 系统类的方法
- 系统类的
Delegate
方法 - 自定义类的方法
各类点击事件的拦截
对于 SDK 来说,收集用户的所有点击的行为数据是非常重要的一部分。另外,这部分数据对于用户行为分析以及统计路径转化率时,都是至关重要的。
那么 SDK 对于用户的各类点击事件的收集,主要 hook 了如下的一些系统类的方法: