Aspects的hook冲突问题解决

利用MonkeyDev分析一个第三方App时,通常可以采用hook UIViewController的viewWillAppear:方法 来打印当前显示视图的vc名,但是现在大部分app内部为了方便数据统计起见,早就对 viewWillAppear: 进行了method swizzling处理,如果这个时候使用Aspects 对 UIViewController的viewWillAppear:方法进行hook时,运行就会出现undeclared selector 错误,为什么会出现这个错误,在JSPatch作者团队写的 面向切面编程之 Aspects 源码解析及应用 一文中已经有分析。

如何解决这个问题呢?答案其实已经给出来了,JSPatch也是用类似的方法进行hook,但对这个问题进行了兼容处理,所以只需要在项目中pod引进JSPatch,创建demo.js,然后增加类似的代码:

defineClass('UIViewController', {
viewWillAppear: function(animated) {
    self.ORIGviewWillAppear(animated);
    console.log('viewWillAppear jspatch! ');
    UIViewController.printClassString(self);
}
    });

查找资料的过程中发现了一个比较不错的库,JGMethodSwizzler: Powerful and easy to use Objective-C swizzling API.,对swizzling API 进行了简化,更重要的它可以对已经swizzling 的API 进行反向恢复操作,Kapeli/Dash-iOS 中似乎就使用了它。

参考:

推荐阅读更多精彩内容