iOS 14 无法获取方法的IMP,但符号断点可以看到调用

需求:获取 [NWConcrete_nw_connection initWithEndpoint:parameters:identifier:] 的IMP。NWConcrete_nw_connection 是 runtime libnetwork.dylib 中的类。

在 iOS 13 及之前版本,是可以轻松获取该方法的。今天测试了下iOS 14 Beta,无法获取了。

Class class = NSClassFromString(@"NWConcrete_nw_connection");
SEL selector = NSSelectorFromString(@"initWithEndpoint:parameters:identifier:");
Method method = class_getInstanceMethod(class, selector);

before iOS 14,获取 mehod 正常,iOS 14,method 为 NULL。看了下runtime 中 NWConcrete_nw_connection.h 头文件,这个方法确实消失了。

但是即使在iOS 14,使用符号断点,依然可以能看到该方法的调用。

尝试了下从该类的的元类中找,也没有。猜测 Apple 可能在新系统使用了动态方法解析来实现这个部分。那么问题来了:我该如何获取该方法 IMP?

objc direct?

对,很有可能。看了其他几个私有类的头文件,之前有的 init 相关方法都不见了。Apple 很可能在新 SDK 中将私有方法都用objc_direct注释掉了。 Swizzing 使用要大大受限了。