我正在尝试在我的 Cordova 插件中实现一些推送通知方法。 Cordova 创建了自己的 UIApplicationDelegate,称为 CDVAppDelegate,因此我尝试扩展它并使用 swizzling 添加我的方法。
但是,当我实现一个在 CDVAppDelegate 中未实现的可选协议(protocol)方法,并使用 swizzling 使其可用时,不会调用这个新方法。如果我破解 CDVAppDelegate 代码以实现此方法,则确实会调用新方法。
以下是一些代码片段 - 希望这有助于澄清情况:
在 CDVAppDelegate.h 中
@interface CDVAppDelegate : NSObject <UIApplicationDelegate>{}
在 CDVAppDelegate.m 中
@implementation CDVAppDelegate
// added by me
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
return;
}
在我的“扩展 CDVAppDelegate {...}”
@objc func swizzled_application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
NSLog("\(TAG) APNs token retrieved: \(deviceToken)")
self.swizzled_application(application, didRegisterForRemoteNotificationsWithDeviceToken:deviceToken) // swizzled, so this calls original
...
}
如何在不修改 CDVAppDelegate.m 的情况下使它工作?
最佳答案
方法 class_addMethod 让我实现未实现的方法。如果它不起作用(如果选择器已经有方法实现),您可以调用它并回退到 method_exchangeImplementations 上。
关于objective-c - 在扩展中实现未处理的协议(protocol)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49119525/