无侵入埋点、日志监控方案怎么实现?

手写代码埋点的优缺点

代码埋点主要就是通过手写代码的方式来埋点,能很精确的在需要埋点的代码处加上埋点的代码方便调试,并跟踪埋点内容

但存在开发工作量大,并且埋点代码到处都是,后期难以维护等问题。

封装一个专门用于方法交换的类

//封装一个对象方法交换的公共类
+(void)hookClass:(Class)classObject fromSelector:(SEL)fromSelector toSelector:(SEL)toSelector 
//这个方法利用运行时 method_exchangeImplementations 接口将方法的实现进行了交换,原方法调用时就会被 hook 住,从而去执行指定的方法。    

UIViewController生命周期埋点

1、页面进入次数、页面停留时间都需要对 UIViewController 生命周期进行埋点,你可以创建一个 UIViewController 的 Category

2、Category 在 +load() 方法里使用了 SMHook 进行方法替换,在替换的方法里执行需要埋点的方法 [self insertToViewWillAppear]。每个 UIViewController 生命周期到了 ViewWillAppear 时都会去执行 insertToViewWillAppear 方法

3、我们要怎么区别不同的 UIViewController 呢?我一般采取的做法都是,使用 NSStringFromClass([self class]) 方法来取类名。

UIButton点击事件无侵入埋点

1、对于点击事件来说,我们也可以通过运行时方法替换的方式进行无侵入埋点。这里最主要的工作是,找到这个点击事件的方法 sendAction:to:forEvent:,然后在 +load() 方法使用 SMHook 替换成为你定义的方法。

2、在UIButton的分类+load()方法,替换自定义的方法

3、我们需要通过 “action 选择器名 NSStringFromSelector(action)” +“视图类名 NSStringFromClass([target class])”组合成一个唯一的标识,来进行埋点记录。

日志监控

一般的程序调试,用断点就好了,我不推荐你把 NSLog 作为一种调试手段。因为,使用 NSLog 调试,会发生 IO 磁盘操作,当频繁使用 NSLog 时,性能就会变得不好。

iOS10以后如何对NSLog函数进行重定向?

1、新的统一日志系统没有 ASL 那样的接口可以让我们取出全部日志,所以为了兼容新的统一日志系统,你就需要对 NSLog 日志的输出进行重定向。

2、对 NSLog 进行重定向,我们首先想到的就是采用 Hook 的方式。因为 NSLog 本身就是一个 C 函数,而不是 Objective-C 方法,所以我们就可以使用 fishhook 来完成重定向的工作。

3、利用了 fishhook 对方法的符号地址进行了重新绑定,从而只要是 NSLog 的调用就都会转向 redirect_nslog 方法调用。

你可能感兴趣的:(无侵入埋点、日志监控方案怎么实现?)