我试图在我的Cordova插件中实现一些推送通知方法。 Cordova创建了自己的UIApplicationDelegate,名为CDVAppDelegate,所以我尝试扩展它并使用swizzling来添加我的方法。
但是,当我实现CDVAppDelegate中未实现的可选协议方法,并使用swizzling使其可用时,不会调用此新方法。如果我破解CDVAppDelegate代码来实现此方法,则会调用新方法。
以下是一些代码片段 - 希望这有助于澄清情况:
在CDVAppDelegate.h中
@interface CDVAppDelegate : NSObject <UIApplicationDelegate>{}
在CDVAppDelegate.m
中@implementation CDVAppDelegate
// added by me
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
return;
}
在我的&#34;扩展名CDVAppDelegate {...}&#34;
中@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的情况下实现此功能?
答案 0 :(得分:0)
方法class_addMethod允许我实现未实现的方法。如果它不起作用(如果选择器已经有方法实现),你可以调用this和fallback on method_exchangeImplementations。