【问题标题】:Implement unhandled protocol method in extension在扩展中实现未处理的协议方法
【发布时间】:2018-03-05 21:10:33
【问题描述】:

我正在尝试在我的 Cordova 插件中实现一些推送通知方法。 Cordova 创建了他们自己的 UIApplicationDelegate,称为 CDVAppDelegate,所以我尝试扩展它并使用 swizzling 添加我的方法。

但是,当我实现 CDVAppDelegate 中未实现的可选协议方法并使用 swizzling 使其可用时,不会调用此新方法。如果我破解 CDVAppDelegate 代码来实现这个方法,新方法就会被调用。

这里有一些代码 sn-ps - 希望这将有助于澄清情况:

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

【问题讨论】:

    标签: objective-c swift swizzling respondstoselector


    【解决方案1】:

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

    【讨论】:

    • 对于我现在的实现来说已经足够好了,但我不接受这个答案——这给了我 2 个不同签名下的方法副本,我只想有 1 个这样我可以检查respondsToSelector 调用原始方法(这将以通用方式解决此问题)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多