logos:http://iphonedevwiki.net/index.php/Logos
%hook (%end结束)
开始hook
1 2 3 4 5 6 7 8 9 10 |
%hook ViewController // 要hook的方法 - (void)loginAction:(id)arg1 { NSLog(@"______loginAction.hook ✅"); } %end |
%group、%ctor、%init
%group组,%ctor构造函数, %init初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
// ------------ group1 ---------------- @group group1 %hook ViewController - (void)loginAction:(id)arg1 { NSLog(@"______loginAction.hook ✅"); } %end %end // ------------ group2 ---------------- @group group2 %hook ViewController - (void)registerAction:(id)arg1 { NSLog(@"______registerAction.hook ✅"); } %end %end %ctor { // 方式1 要构造所有的group // %init(group2)%init(group1) // 方式2 或者有条件单个判断 NSString *version = [UIDevice currentDevice].systemVersion; if(version.doubleValue >= 11.1) { %init(group2) } else { %init(group1) } } |
- 对于没有写group的,它会有个隐士的”_ungrouped”group
- 定义多少个group必须在构造函数中初始化几个,初始化是后面覆盖前面的
%new、%c
就是新增一个方法。%c相当于objc_getClass或NSClassFromString
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#import "HookHeader.h" %hook ViewController - (void)loginAction:(id)arg1 { NSLog(@"______loginAction.hook ✅"); } %new - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { self.view.backgroundColor = [UIColor redColor]; [%c(ViewController) myClassMethod]; } %new +(void)myClassMethod { NSLog(@"调用新增加的类方法!"); } %end |
注意:
- self.view提示没定义,把class-dump的头文件复制到上面或者单独写到HookHeader文件中
- + (void)myClassMethod要复制到上面或者单独写到HookHeader文件中
%log
1 |
%log((NSString *)@"name",(NSString *)@"add"); |
%orig
调用之前的方法(调用自己)
1 2 3 4 5 |
- (void)showView:(_Bool)arg1 { %orig; [self.navigationItem setLeftBarButtonItem: [[UIBarButtonItem alloc] initWithCustomView:leftBtn]]; } |