将 iOS 事件传递给 Ionic/Capacitor webview
Posted
技术标签:
【中文标题】将 iOS 事件传递给 Ionic/Capacitor webview【英文标题】:pass iOS event to 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 ")
);
【问题讨论】:
【参考方案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];
【讨论】:
啊,这是给科尔多瓦的。我试图避免它,只是坚持使用原生 + 电容器的绑定。任何线索如何用它做同样的事情? 我还没用过电容,不过我想你也可以用电容插件? 是的,但我试图远离科尔多瓦和插件以上是关于将 iOS 事件传递给 Ionic/Capacitor webview的主要内容,如果未能解决你的问题,请参考以下文章