前言:我们都知道在windows下可以通过API轻松的hook很多消息,IOS里面貌似还沒有现成的API,不过我们通过Objective-C运行时的一些东西,就可以实现这一个功能.
So问题来了, 我们为什么要hook消息呢, 因为有些时候我们可能无法直接去继承一个类,却又像去截取这个类中的某些消息左耳一些处理, 然后在想对它进行一些我们自己想要的操作处理.
具体过程我们look一下代码即可明白:
ViewController中代码:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 创建一个hook对象
TestHook * hook = [[TestHook alloc]init];
[self sendToMessage:@"ViewController的方法"];
}
- (void)sendToMessage:(NSString *)str{
NSLog(@"%@",str);
}
TestHook.m中代码:
+ (void)load
{
// 获取到ViewController中sendEvent对应的method
Method sendEvent = class_getInstanceMethod([ViewController class], @selector(sendToMessage:));
Method sendEventMySelf = class_getInstanceMethod([self class], @selector(sendEventHooked:));
// 然后用我们自己的函数的实现,替换目标函数对应的实现
IMP sendEventMySelfImp = method_getImplementation(sendEventMySelf);
class_replaceMethod([ViewController class], @selector(sendToMessage:), sendEventMySelfImp, method_getTypeEncoding(sendEvent));
}
/*
* 截获到ViewController的sendEvent
* 我们可以先处理完以后,再继续调用正常处理流程
*/
- (void)sendEventHooked:(NSString *)str
{
// 操作我们想操作的事情
NSLog(@"%s, --> %@",__func__,@"操作我们想操作的事情");
}
这样我们就把ViewController里面的方法实现部分给更改了,其控制台打印效果:
**Hook[8843:291487] -[TestHook sendEventHooked:], --> ****操作我们想操作的事情**
网友评论