IOS中如何Hook消息

前言:我们都知道在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:], --> ****操作我们想操作的事情**
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 十多年没有学c++了,突然心血来潮,想重新看看,而且发现了qt这么个亲切的工具,不像mfc那么难以入门,趁着不是那...
    升级成功阅读 1,157评论 0 0
  • 一、你的计划实现了多少 自己一直有个编辑梦,按计划,我现在应该进行到“拥有一份新媒体编辑的实习,拥有一定的读者”。...
    云之鸢阅读 2,707评论 2 3