
前言
在使用 QQ,微信等第三方登录时需要通过 application:openURL:options: 方法来调起对应的应用。但是在制作登录 SDK 时无法直接在 application:openURL:options: 写入相应的代码。此时需要通过 swizzle 技术来交换 application:openURL:options: 方法。
swizzle
application:openURL:options: 是 UIApplicationDelegate 的方法,不能在 AppDelegate 当分类中 swizzle,因为 load 分类的时候并不能保证 UIApplicationDelegate 的代理方法已经实现。
可以通过一个 regist 方法在 application:didFinishLaunchingWithOptions: 中 swizzle 。
这里要注意的是需要判断原来的类中是否已经存在 swizzle 的方法,防止重复交换。
BOOL registerMethod = class_addMethod(originalClass,
swizzledSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (!registerMethod) {
return;
}
具体代码参考 GitHub。