动态埋点实现

今天需要进行事件埋点和页面埋点。研究了下动态埋点实现。记录下。

其实动态埋点也是利用 runtime 运行时通过 methd swizzle 来实现的。

原理:

页面埋点在系统的 viewwillAppear: 或 viewwillDisappear: 方法中添加自己进行埋点的代码实现。

事件埋点也是在系统的 sendAction:to:forEvent: 方法中加入自己埋点的代码实现。

废话不说直接上代码

动态埋点实现_第1张图片

在 load 方法中进行 method swizzle。dispatch_once 是为了在不同线程中只执行一次。

method swizzle 代码:

动态埋点实现_第2张图片

BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod))

这句代码:就是为 class的 originalSelector 添加 swizzleMethod 的实现。

会出现两种情况:didAddMethod 为 YES 或 NO。

YES 的情况:① 就是类中声明了该方法却没有实现该方法。 ② 父类中有有声明有实现,子类中没有overwrite。

NO 的情况:就是类中实现了该方法。

当 YES 的情况下: class_replaceMethod(class, swizzlSelector, method_getImplementation(origianMethod), method_getTypeEncoding(origianMethod)); 将父类实现 originalMethod 实现替换到 swizzleMethod。

当 NO 的情况下,直接交换两个方法。

跟进

动态埋点实现_第3张图片

发现是从一个字典里面根据 viewcontroller 的类名来读取不同的 pageId 的。

继续跟进

发现原来是从plist 文件中读取所有事件和页面埋点的 id 的。

动态埋点实现_第4张图片

跟进

在这个类中进行埋点事件处理,上传服务器。

当运行程序时:

同理事件打点,直接上代码

动态埋点实现_第5张图片

发现是通过 target 找到 vc ,通过 action 来回去 eventId的。

参考链接:

http://nshipster.cn/method-swizzling/

http://blog.leichunfeng.com/blog/2015/06/14/objective-c-method-swizzling-best-practice/

http://www.jianshu.com/p/0497afdad36d

你可能感兴趣的:(动态埋点实现)