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