BNRHookAction 1.0.3

BNRHookAction 1.0.3

测试已测试
语言语言 Obj-CObjective C
许可证 未知
发布最后发布2018年6月

JustinYangJing 维护。



  • 作者
  • JustinYang

BNRHookAction

  • 根据字典 hook 的调用方法,先执行传人的 block,然后再执行原函数,从而实现无侵入式打点;
  • 根据字典 hook 的调用方法,只执行您传入的 block,不调用原函数

注意事项

不支持为父类和子类同时 hook 同一个函数(如 A 是父类,A1 和 A2 是子类,A1 实现了 viewWillAppear:,A2 未实现,同时 hook A 的 viewWillAppear: 和 A1 的 viewWillAppear: 会造成死循环;同时 hook A1 和 A2 的 viewWillAppear: 也会造成调用死循环,实际上 A2 未实现 viewWillAppear:,hook A2 时,就是 hook 的 A 的 viewWillAppear:。如果子类不调用 [super method] 是不会造成调用死循环的。)

hook 函数时,请确保 hook 的 target 实现了 hook 的 action,而不是父类实现了这个 action。

引入

pod 'BNRHookAction'

使用

该方法根据您传入的 recordDic,先调用 block,再调用原函数

 [[BNRHookAction shareInstance] 	
 			setRecordDic:recordDic
                               
           andHookBlock:^(
           NSString *target, 
           NSString *action, 
           NSDictionary *handleDic,
           NSDictionary *params) {
                                       				NSLog(@"hook %@",action);
                                                              
                               }];

该方法根据您传入的 recordDic,只调用 block,不会再调用原函数

[[BNRHookAction shareInstance] 	
		setRecordDic:recordDic1 	
		andWithOutCallOriginFuncHookBlock:
		^void *(NSString *target, 
		NSString *action, 
		NSDictionary *handleDic, 
		NSDictionary *params) {
        if (...)
        {
			//根据block的参数,执行特定的代码,
			//原函数可能会有返回值,您可以在这里修改
			//原函数的返回值
        }
        return nil;
}];

参数说明

  • recordDic

      {"ClassName1":{
              "actionName1":{
                  "key1":"value1";
                  "key2":"value2"};
               "actionName2":{
               "key1":"value1";
               "key2":"value2"}
              };
      "ClassName2":{
               "actionName1":{
               "key1":"value1";
               "key2":"value2"};
               "actionName2":{
               "key1":"value1";
               "key2":"value2"}
               }
      		}
    

想要className下的actionName方法,className表示类名,actionName表示函数名,源码会根据这两个key值去hook。key1和value1,您可以自定义,比如做统计时,以eventId为key,在友盟或百度统计平台上自定义的事件Id为value,只要在传进来的block里面调用[MobClick event:value]就能做无侵入式埋点了,hook字典可以由后台下发。value也可以为block,调用您事先定义好的block