在扩展程序

时间:2018-03-05 21:10:34

标签: objective-c swift swizzling respondstoselector

我试图在我的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的情况下实现此功能?

1 个答案:

答案 0 :(得分:0)

方法class_addMethod允许我实现未实现的方法。如果它不起作用(如果选择器已经有方法实现),你可以调用this和fallback on method_exchangeImplementations。