1

我正在尝试在我的 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;
}

在我的“扩展 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 的情况下使其正常工作?

4

1 回答 1

0

方法 class_addMethod 让我实现未实现的方法。如果它不起作用(如果选择器已经有方法实现),您可以调用它并在 method_exchangeImplementations 上回退。

于 2018-03-07T19:49:06.543 回答