来自appdelegate IOS的​​Cordova呼叫插件代码

时间:2020-10-05 08:38:56

标签: ios cordova cordova-plugins

我正在尝试为Cordova应用构建插件。在此插件中,我有一些用于推送通知的本机代码。我已经在插件中添加了所需的文件,现在我正尝试从应用程序的AppDelegate.m调用标头。但是导入时出现错误“找不到文件”。我在插件的plugin.xml中添加了头文件,如下所示:<头文件src =“ src / ios / xxxxx / xxxxx.h” /> 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

AppDelegate.m是在Cordova创建iOS平台项目时自动生成的,因此不建议直接对其进行修改,因为如果使用cordova plugin rm ios && cordova platform add ios重建平台项目,则所有更改都将丢失。 >

插件可以通过使用AppDelegate类的类别扩展名来解决此问题,该类扩展名使您可以捆绑在您的插件存储库中扩展AppDelegate的代码,而不会影响自动生成的文件。

例如,您将创建myplugin/src/ios/AppDelegate+MyPlugin.h

#import "AppDelegate.h"

@interface AppDelegate (MyPlugin) <UIApplicationDelegate>
@end

然后在myplugin/src/ios/AppDelegate+MyPlugin.m中,您可以实现您的应用程序委托,例如:

#import "AppDelegate+MyPlugin.h"

@implementation AppDelegate (MyPlugin)


// A UIApplication delegate
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"Remote notification received");
}

...

要允许您的AppDelegate类别与Cordova插件类进行交互,您可以公开一个公共方法,该方法返回其单例实例,AppDelegate类别可以调用该实例。例如:

myplugin/src/ios/MyPlugin.h

#import <Cordova/CDV.h>

@interface MyPlugin : CDVPlugin

// Public static method
+ (MyPlugin*) myPlugin;

// A public instance method
- (void)logMessage: (NSString*)msg;

@end

myplugin/src/ios/MyPlugin.m

#import "MyPlugin.h"

@implementation MyPlugin

// Private static reference
static MyPlugin* myplugin;

// Public static method
+ (MyPlugin*) myplugin {
    return myplugin;
}


// implement CDVPlugin delegate
- (void)pluginInitialize {
    myplugin = self;
}


// A public instance method
- (void)logMessage: (NSString*)msg
{
    NSLog(@"MyPlugin: %@", msg);
}

@end

然后在myplugin/src/ios/AppDelegate+MyPlugin.m中,您可以使用插件方法:

#import "AppDelegate+MyPlugin.h"
#import "MyPlugin.h"

@implementation AppDelegate (MyPlugin)


// A UIApplication delegate
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    [MyPlugin.myPlugin logMessage:@"Remote notification received"];
}

...

采用这种方法的插件示例为cordova-plugin-firebasex