objective-c - 在扩展中实现未处理的协议(protocol)方法

标签 objective-c swift swizzling respondstoselector

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

但是,当我实现一个在 CDVAppDelegate 中未实现的可选协议(protocol)方法,并使用 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 的情况下使它工作?

最佳答案

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

关于objective-c - 在扩展中实现未处理的协议(protocol)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49119525/

相关文章:

ios - iOS 设备之间的 TCP 连接

ios - Swizzling 符合 UI_APPEARANCE_SELECTOR 的属性

swift - 既然 Swift 已经弃用了 macOS 中的 initialize() ,是否有替代方案?

ios - 当我在后台收到推送通知后点击应用程序图标时,没有调用 didReceiveRemoteNotification

objective-c - 颜色菜单选择器

ios - 设置计算值(结构与类)

ios - 方法混合实现未发生

ios - findObjectsInBackgroundWithBlock : gets data from Parse, 但数据只存在于 block 内

iphone - 立方体结构 View Controller

xml - 使用 SWXMLHash for Swift 遍历 XML 文件