簡體   English   中英

將 iOS 事件傳遞給 Ionic/Capacitor webview

[英]pass iOS event to Ionic/Capacitor webview

我正在尋找一種方法將事件從 iOS/Swift 傳遞到 Ionic/Capacitor 應用程序的前端,最終目標是改造此代碼,以便我可以處理 3rd 方推送通知提供程序。 流程是應用程序加載並將通知數據傳遞給我的 Capacitor 插件,以便我可以使用bridge方法(也許我可以直接從 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._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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM