我正在尝试在我的Cordova插件中实现一些推送通知方法。Cordova创建了自己的UIApplicationDelegate,称为CDVAppDelegate,所以我试图扩展它并使用滑动来添加我的方法。
但是,当我实现在 CDVAppDelegate 中未实现的可选协议方法并使用重排使其可用时,不会调用此新方法。如果我破解CDVAppDelegate代码来实现此方法,则确实会调用新方法。
以下是一些代码片段 - 希望这将有助于澄清情况:
In CDVAppDelegate.h
@interface CDVAppDelegate : NSObject <UIApplicationDelegate>{}
In 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上回退。