欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

iOS AOP实战

程序员文章站 2022-06-15 09:41:52
黑客技术点击右侧关注,了解黑客的世界!Java开发进阶点击右侧关注,掌握进阶之路!Python开发点击右侧关注,探讨技术话题!作者丨liyongjie来源:https:......

iOS AOP实战

黑客技术

点击右侧关注,了解黑客的世界!

iOS AOP实战

iOS AOP实战

Java开发进阶

点击右侧关注,掌握进阶之路!

iOS AOP实战

iOS AOP实战

Python开发

点击右侧关注,探讨技术话题!

iOS AOP实战

作者丨liyongjie 

来源:

https://www.cnblogs.com/lyjpost/p/11402024.html


适用场景:

1. 参数校验:网络请求前的参数校验,返回数据的格式校验等等

2. 无痕埋点:统一处理埋点,降低代码耦合度

3. 页面统计:帮助统计页面访问量

4. 事务处理:拦截指定事件,添加触发事件

5. 异常处理:发生异常时使用面向切面的方式进行处理

6. 热修复:AOP可以让我们在某方法执行前后或者直接替换为另一段代码,我们可以根据这个思路,实现bug修复

 

我们希望将以上需求分离到非业务逻辑的方法中,尽可能的不影响业务逻辑的代码。

demo 从配置AOP到实际应用,记得给咱点个star~

iOS AOP实战源码分析

0. 类说明

MDAspectInfo:作为对象,包含调用信息(NSInvocation)的对象
         作为协议,提供访问对象的属性 
 MDAspectIdentifier:包含一个hook的信息,调用者,时机,回调处理等
 MDAspectTracker:防止重复hook
 MDAspectsContainer:通过runtime给被hook的对象添加属性,提供存储和移除hook的方法
 MDAspectToken:提供移除hook的协议

1. hook时机


2. 配置文件

配置hook的类,hook时机,实例方法和类方法,以及回调处理

为了区分实例方法和类方法,需要在类方法前加一个“+”

+(NSDictionary *)AOP_MDViewControllerConfigDic{

    NSDictionary *configDic = @{
                                @"MDViewController":@{//hook那个类名
                                        @"TrackEvents":@[
                                                @{//实例方法
                                                    @"moment":@"before",//hook之前调用
                                                    @"EventSelectorName":@"instanceMethod",//实例方法名
                                                    @"block":^(id<MDAspectInfo>aspectInfo){//回调处理
                                                        // 获取方法的参数
                                                        NSLog(@"跳转");
                                                    },
                                                },
                                                @{//类方法
                                                    @"moment":@"instead",//替换原方法
                                                    @"EventSelectorName":@"+hookClassMethod",//类方法名
                                                    @"block":^(id<MDAspectInfo>aspectInfo){//回调处理
                                                        // 获取方法的参数
                                                        NSLog(@"到处可以hook到我");
                                                    },
                                                },
                                            ]
                                        },
                                };
    return configDic;
}

3. 解析管理类


4. 对外接口



iOS AOP实战总结

核心步骤:把目标selector的IMP更换为runtime中的IMP,从而直接进入消息转发,检查是否能添加hook,如果能,进行存储,接着方法交换处理,在消息转发里运行before instead after方法

说明:

MDAspect是对Aspects的扩展,添加了hook类方法的支持,希望能够帮助大家~

 推荐↓↓↓ 

iOS AOP实战

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

iOS AOP实战

万水千山总是情,点个 “在看” 行不行

本文地址:https://blog.csdn.net/olsQ93038o99S/article/details/100110840