[英]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.