美文网首页
RunTime实现无侵入全局埋点

RunTime实现无侵入全局埋点

作者: 攻城狮GG | 来源:发表于2021-03-12 13:32 被阅读0次

无埋点,不是不需要埋点,更确切地说是“全埋点”,只是埋点代码不会出现在业务代码中
优点:容易管理和维护。并且可移植性高。
缺点:埋点成本高,后期的解析也比较复杂,再加上 view_path 的不确定性。所以,这种方案并不能解决所有的埋点需求,但对于大量通用的埋点需求来说,能够节省大量的开发和维护成本。

废话不多说直接上代码
1.创建一个Hook类用于方法替换
.h文件如下

@interface Hook : NSObject
+ (void)hookClass:(Class)classObject fromSelector:(SEL)fromSelector toSelector:(SEL)toSelector;
@end

.m文件如下

#import "Hook.h"
#import <objc/runtime.h>
@implementation Hook
+ (void)hookClass:(Class)classObject fromSelector:(SEL)fromSelector toSelector:(SEL)toSelector {
    Class class = classObject;
    // 得到被替换类的实例方法
    Method fromMethod = class_getInstanceMethod(class, fromSelector);
    // 得到替换类的实例方法
    Method toMethod = class_getInstanceMethod(class, toSelector);
    
    // class_addMethod 返回成功表示被替换的方法没实现,然后会通过 class_addMethod 方法先实现;返回失败则表示被替换方法已存在,可以直接进行 IMP 指针交换
    if(class_addMethod(class, fromSelector, method_getImplementation(toMethod), method_getTypeEncoding(toMethod))) {
      // 进行方法的替换
        class_replaceMethod(class, toSelector, method_getImplementation(fromMethod), method_getTypeEncoding(fromMethod));
    } else {
      // 交换 IMP 指针
        method_exchangeImplementations(fromMethod, toMethod);
    }

}
@end

写一个UIViewcontroller的分类

@interface UIViewController (HookBuriedPoint)

@end

分类.m文件代码如下

#import "UIViewController+HookBuriedPoint.h"
#import "Hook.h"
@implementation UIViewController (HookBuriedPoint)
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 通过 @selector 获得被替换和替换方法的 SEL,作为 ViewHook:hookClass:fromeSelector:toSelector 的参数传入
        SEL fromSelectorAppear = @selector(viewWillAppear:);
        SEL toSelectorAppear = @selector(hook_viewWillAppear:);
        [Hook hookClass:self fromSelector:fromSelectorAppear toSelector:toSelectorAppear];
        
        SEL fromSelectorDisappear = @selector(viewWillDisappear:);
        SEL toSelectorDisappear = @selector(hook_viewWillDisappear:);
        
        [Hook hookClass:self fromSelector:fromSelectorDisappear toSelector:toSelectorDisappear];
    });
}

- (void)hook_viewWillAppear:(BOOL)animated {
    // 先执行插入代码,再执行原 viewWillAppear 方法
    [self insertToViewWillAppear];
    [self hook_viewWillAppear:animated];
}
- (void)hook_viewWillDisappear:(BOOL)animated {
    // 执行插入代码,再执行原 viewWillDisappear 方法
    [self insertToViewWillDisappear];
    [self hook_viewWillDisappear:animated];
}

- (void)insertToViewWillAppear {
    // 在 ViewWillAppear 时进全局无侵入埋点
    NSLog(@"hook-%@",[NSString stringWithFormat:@"%@ Appear",NSStringFromClass([self class])]);
}
- (void)insertToViewWillDisappear {
    // 在 ViewWillDisappear 时进全局无侵入埋点
}
@end

相关文章

  • RunTime实现无侵入全局埋点

    无埋点,不是不需要埋点,更确切地说是“全埋点”,只是埋点代码不会出现在业务代码中优点:容易管理和维护。并且可移植性...

  • AOP无痕埋点技术

    使用AOP实现iOS应用内的埋点计数 - 简书 iOS用户行为追踪——无侵入埋点 - CSDN博客 iOS 无埋点...

  • Javassist实现无侵入埋点

    Apk编译流程 Apk编译流程主要经过以下几步:1、使用javac将java文件编译成class2、使用dex工具...

  • 戴铭(iOS开发课)读书笔记:09章节-无侵入埋点

    原文链接:无侵入的埋点方案如何实现? 前言: 原文中介绍了iOS开发常见的埋点方式:代码埋点、可视化埋点和无埋点。...

  • 无侵入埋点参考

    无侵入埋点

  • iOS 无侵入埋点的实现

    埋点 概念:在iOS开发中,埋点可以解决两大类问题,一是了解用户使用App的行为,二是降低分析线上问题的难度。 常...

  • 无侵入埋点方案如何实现

    埋点可以解决两大类问题: 一是了解用户使用App的行为, 二是降低分析线上问题的难度 常见的埋点方式: 代码埋点、...

  • iOS - Runtime 无埋点实现

    一、创建工具类 NSObject+Swizzling 创建工具类,里面包含以下四个方法,这样可以针对不同的需求进行...

  • iOS无侵入埋点

    什么是埋点? 埋点是一种了解用户行为,分析用户行为,提高用户体验的一种方式。常见的解决方案有三种,代码埋点、可视化...

  • 无侵入埋点思路

    思路图 思路解析:利用Method Swizzling(黑魔法)实现埋点统计的无侵入实现。 步骤如下 1.调用cl...

网友评论

      本文标题:RunTime实现无侵入全局埋点

      本文链接:https://www.haomeiwen.com/subject/lvtzqltx.html