【问题标题】:pass iOS event to Ionic/Capacitor webview将 iOS 事件传递给 Ionic/Capacitor webview
【发布时间】:2020-02-29 16:34:34
【问题描述】:

我正在寻找一种将事件从 iOS/Swift 传递到 Ionic/Capacitor 应用程序前端的方法,最终目标是改造此代码,以便我可以处理第 3 方推送通知提供程序。流程是应用程序加载通知数据并将其传递给我的 Capacitor 插件,以便我可以使用 bridge 方法(也许我可以直接从 AppDelegate 执行此操作?)并且在我的插件中我有一个可观察的准备接收然后将通知传递给根据 Capacitor 文档执行事件的方法,但是没有事件每次都被触发并且没有警报弹出,这可能是因为 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 ")
      });

【问题讨论】:

    标签: ios swift ionic4 capacitor


    【解决方案1】:

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

    您的插件在 www 文件夹中有一个 js 文件,用于管理功能。在这个文件中你可以创建方法来创建监听器、移除监听器、fireEvent:

    exports._listener = {};
    
    /**
     * Fire event with given arguments.
     *
     * @param [ String ] event The event's name.
     * @param [ Array<Object> ] The callback's arguments.
     *
     * @return [ Void ]
     */
    exports.fireEvent = function (event)
    {
        var args     = Array.apply(null, arguments).slice(1),
            listener = this._listener[event];
    
        if (!listener)
            return;
    
        for (var i = 0; i < listener.length; i++)
        {
            var fn    = listener[i][0],
                scope = listener[i][1];
    
            fn.apply(scope, args);
        }
    };
    
    /**
     * Register callback for given event.
     *
     * @param [ String ] event The event's name.
     * @param [ Function ] callback The function to be exec as callback.
     * @param [ Object ] scope The callback function's scope.
     *
     * @return [ Void ]
     */
    exports.on = function (event, callback, scope)
    {
        if (typeof callback !== "function")
            return;
    
        if (!this._listener[event])
        {
            this._listener[event] = [];
        }
    
        var item = [callback, scope || window];
    
        this._listener[event].push(item);
    };
    
    /**
     * Unregister callback for given event.
     *
     * @param [ String ] event The event's name.
     * @param [ Function ] callback The function to be exec as callback.
     *
     * @return [ Void ]
     */
    exports.un = function (event, callback)
    {
        var listener = this._listener[event];
    
        if (!listener)
            return;
    
        for (var i = 0; i < listener.length; i++)
        {
            var fn = listener[i][0];
    
            if (fn == callback)
            {
                listener.splice(i, 1);
                break;
            }
        }
    };
    

    也许您必须对这些内容进行一些编辑,以匹配您想要的内容。然后你需要连接到你的本机代码,这可以通过在插件启动时调用 Methode 来存档,如下所示:

    channel.onCordovaReady.subscribe(function () {
      cordova.exec(function(event) {
        // Callback from Native Code received. Fire to JS Listeners
        this.fireEvent(event);
      }, null, 'YourPluginName', 'init', []);
    }
    

    那么你需要一个名为 init() 的函数(Objective-C,因为我不太 Swift),它只是保存 CallbackId:

    - (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];
    

    【讨论】:

    • 啊,这是给科尔多瓦的。我试图避免它,只是坚持使用原生 + 电容器的绑定。任何线索如何用它做同样的事情?
    • 我还没用过电容,不过我想你也可以用电容插件?
    • 是的,但我试图远离科尔多瓦和插件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2017-06-30
    • 2016-04-12
    • 2022-01-03
    相关资源
    最近更新 更多