runtime无痕埋点实现

508 阅读1分钟

需求描述

有时候我们需要在app统计用户在每个页面的使用情况,一般做法是在每个control的viewWillappear去添加埋点统计,这样就比较麻烦,需要改动很多地方的代码,现在我们可以利用runtime的特性将viewWillApear方法替换成我们自定义的方法,再自定义方法里面添加埋点就可以实现不修改原有代码的情况下支持页面埋点

实现步骤

//UIViewController+Target.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIViewController(Target)

@end

NS_ASSUME_NONNULL_END


//UIViewController+Target.m

#import "UIViewController+Target.h"
#import <objc/runtime.h>

@implementation UIViewController(Target)

+ (void)load
{
    method_exchangeImplementations(@selector(viewDidAppear:), @selector(swizzled_viewDidAppear:));
}

- (void)swizzled_viewDidAppear:(BOOL)animated
{
    // 调用原有方法
    [self swizzled_viewDidAppear:animated];
    
    NSLog(@"Target:%@", NSStringFromClass([self class]));
}