передать iOS событие на веб-сайт Ionic / Capacitor - PullRequest
0 голосов
/ 29 февраля 2020

Я ищу способ передать событие во внешний интерфейс приложения Ionic / Capacitor из iOS / Swift. Конечная цель состоит в том, чтобы заново установить этот код, чтобы я мог обработать стороннее уведомление pu sh поставщик. Суть в том, что приложение загружает и передает данные уведомлений в мой плагин Capacitor, чтобы я мог использовать методы bridge (может быть, я могу сделать это непосредственно из AppDelegate?), И в моем плагине у меня есть наблюдаемая готовность к приему уведомление, которое затем передается методу, который выполняет события в соответствии с документацией по конденсатору, однако ни одно событие не запускается и не выдается предупреждение, возможно, это связано с тем, что AppDelegate и плагин загружаются до веб-просмотра, но в этом отношении я не уверен, как

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 ")
      });

1 Ответ

0 голосов
/ 29 февраля 2020

Что вы можете сделать, чтобы заархивировать это (одно решение, которое я использовал в плагине):

Ваш плагин имеет js файл в папке www, который управляет Функции. В этом файле вы можете создать методы для создания прослушивателя, удаления прослушивателя, 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;
        }
    }
};

Возможно, вам придется немного их отредактировать, чтобы соответствовать тому, что вы хотите. Затем вам нужно соединение с вашим собственным кодом, это может быть заархивировано с помощью вызова метода при запуске плагина, например:

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

, тогда вам нужна функция (Objective- C, так как я этого не делаю Swift много) вызывается init (), который просто сохраняет 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];
...