将iOS事件传递给Ionic/webview

将iOS事件传递给Ionic/webview,ios,swift,ionic4,capacitor,Ios,Swift,Ionic4,Capacitor,我正在寻找一种方法,将事件从iOS/Swift传递到Ionic/Capactor应用程序的前端,最终目标是重新调整此代码,以便我可以处理第三方推送通知提供商。流程是应用程序加载通知数据并将其传递给我的电容器插件,这样我就可以使用桥接方法(也许我可以直接从AppDelegate执行此操作?)在我的插件中,我有一个observable准备接收通知,然后它将通知传递给一个方法,该方法根据电容器文档执行事件,但是没有触发任何事件,也没有发出警报,这可能是因为AppDelegate和插件在webview之

我正在寻找一种方法,将事件从iOS/Swift传递到Ionic/Capactor应用程序的前端,最终目标是重新调整此代码,以便我可以处理第三方推送通知提供商。流程是应用程序加载通知数据并将其传递给我的电容器插件,这样我就可以使用
桥接
方法(也许我可以直接从AppDelegate执行此操作?)在我的插件中,我有一个observable准备接收通知,然后它将通知传递给一个方法,该方法根据电容器文档执行事件,但是没有触发任何事件,也没有发出警报,这可能是因为AppDelegate和插件在webview之前加载,但在这种情况下,我不知道如何处理它

AppDelegate.swift

  func applicationDidBecomeActive(_ application: UIApplication) {
    let nc = NotificationCenter.default
    nc.post(name: Notification.Name("TestingEvents"), object: nil)
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was
  }
MyPlugin.swift

    public override func load() {
        let nc = NotificationCenter.default
            nc.addObserver(self, selector: #selector(handleSignal), name: Notification.Name("TestingEvents"), object: nil)
    }

    @objc func handleSignal() {
        self.bridge.triggerWindowJSEvent(eventName: "myCustomEvent")
        self.notifyListeners("myPluginEvent", data: [:])
    }
还有我的app.component.ts

      window.addEventListener('myCustomEvent', () => {
        console.log("ATTEMPTILE PUSH")
        alert("myCustomEvent 2 ")
      });            
      Plugins.myPlugin.addListener("myPluginEvent", (info: any) => {
        console.log("myPluginEvent was fired");
        alert("myPluginEvent 2 ")
      });

您可以做些什么来存档此文件(我在插件中使用的一个解决方案):

您的插件在
www
文件夹中有一个js文件,用于管理函数。在此文件中,您可以创建创建侦听器、删除侦听器、fireEvent的方法:

exports.\u listener={};
/**
*使用给定参数触发事件。
*
*@param[String]event事件的名称。
*@param[Array]回调函数的参数。
*
*@return[Void]
*/
exports.firevent=函数(事件)
{
var args=Array.apply(null,参数).slice(1),
监听器=此。_监听器[事件];
如果(!侦听器)
返回;
for(var i=0;i
也许你需要编辑一下,以匹配你想要的。然后您需要连接到您的本机代码,这可以通过在插件启动时调用Methode来存档,如下所示:

channel.oncordovarready.subscribe(函数(){
cordova.exec(函数(事件){
//接收到来自本机代码的回调。调用JS侦听器
本次火灾事件(事件);
},null,'YourPluginName','init',[]);
}
然后需要一个名为init()的函数(Objective-C,我不太喜欢),它只保存回调ID:

- (void) init:(CDVInvokedUrlCommand *)command
{
    self.eventCallbackId = command.callbackId;
    return;
}
然后,您可以通过以下方式向CallbackId发送内容:

CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:@"event"];
[self.commandDelegate sendPluginResult:result callbackId:self.eventCallbackId];

啊,这是给cordova的。我试图避免它,只是坚持原生+电容器的绑定。有什么线索可以用它做同样的吗?我还没有用电容器工作,但我想你也可以用电容器的插件?是的,但我试着远离cordova和插件