You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:26:00