Xamarin.iOS项目中UIWebView事件监听向WKWebView迁移咨询
从UIWebView迁移到WKWebView:事件监听与加载开始事件的等效实现
嘿,我刚完成过Xamarin.iOS Forms项目里UIWebView到WKWebView的迁移,这两个场景我都踩过坑,给你详细说下对应的实现方式:
1. JavaScript事件监听(对应AddEventListener)
UIWebView的AddEventListener本质是实现C#与JavaScript的桥接通信,在WKWebView里,这个功能是通过WKUserContentController来实现的,步骤如下:
第一步:实现脚本消息处理器
先创建一个类实现IWKScriptMessageHandler接口,用来接收JS发来的消息:
public class JsMessageHandler : NSObject, IWKScriptMessageHandler { public void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message) { // 匹配你要监听的JS事件名 if (message.Name == "javascriptRoutine") { // message.Body就是JS传递过来的数据,按需处理 // do something here } } }
第二步:配置WKWebView并注册处理器
在初始化WKWebView时,把这个处理器注册到WKWebViewConfiguration中:
// 创建配置对象 var webConfig = new WKWebViewConfiguration(); // 实例化消息处理器 var jsHandler = new JsMessageHandler(); // 注册监听指定名称的JS消息 webConfig.UserContentController.AddScriptMessageHandler(jsHandler, "javascriptRoutine"); // 创建WKWebView实例 var wkWebView = new WKWebView(View.Bounds, webConfig);
第三步:调整JavaScript端代码
原来UIWebView里触发事件的逻辑,需要改成WKWebView支持的消息发送方式:
// 代替原来触发事件的代码,发送消息到C#端 window.webkit.messageHandlers.javascriptRoutine.postMessage(/* 要传递的数据 */);
⚠️ 注意:页面销毁时记得移除处理器,避免内存泄漏:
webConfig.UserContentController.RemoveScriptMessageHandler("javascriptRoutine"); jsHandler.Dispose();
2. 加载开始事件(对应LoadStarted)
UIWebView的LoadStarted事件,在WKWebView里对应的是NavigationStarted事件。如果是在Xamarin.Forms的自定义Renderer中使用WKWebView,你可以这样绑定事件:
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e) { base.OnElementChanged(e); if (Control != null) { var wkWebView = Control as WKWebView; // 绑定导航开始事件,对应原来的LoadStarted wkWebView.NavigationStarted += (sender, args) => { // 执行原来LoadStarted里的逻辑 // do something here }; } }
如果是直接在原生iOS代码中使用WKWebView,除了NavigationStarted事件,你也可以通过实现WKNavigationDelegate的DidStartProvisionalNavigation方法来处理,不过Xamarin封装的事件用起来更直接。
内容的提问来源于stack exchange,提问作者dlimes
相关产品推荐
相关产品推荐

