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

.NET MAUI:iOS自定义WebView应用崩溃,改注册后无法显示HTML数据

.NET MAUI iOS自定义WebView显示HTML及字体放大修复方案

核心修改点

1. 重构自定义Handler实现

.NET MAUI的Handler机制和Xamarin的Renderer逻辑不同,需按MAUI的生命周期重新实现:

  • 创建MyWebViewHandler继承自ViewHandler<MyWebView, WKWebView>
  • 在CreatePlatformView中初始化带JS权限的WKWebView配置
  • 重写ConnectHandler绑定属性变更监听与导航完成事件,DisconnectHandler清理事件订阅

2. 正确注册Handler

在MauiProgram.cs中精准关联自定义View和Handler:

builder.ConfigureMauiHandlers(handlers =>
{
#if IOS
    handlers.AddHandler<MyWebView, MyWebViewHandler>();
#endif
});

3. 确保自定义属性的变更通知

在MyWebView类中,给Url属性添加属性变更回调,触发Handler加载内容:

public static readonly BindableProperty UrlProperty =
    BindableProperty.Create(nameof(Url), typeof(string), typeof(MyWebView), null, propertyChanged: OnUrlChanged);

public string Url
{
    get => (string)GetValue(UrlProperty);
    set => SetValue(UrlProperty, value);
}

private static void OnUrlChanged(BindableObject bindable, object oldValue, object newValue)
{
    var webView = (MyWebView)bindable;
    (webView.Handler as MyWebViewHandler)?.LoadUrl(newValue?.ToString());
}

4. Handler中实现加载与字体放大逻辑

protected override WKWebView CreatePlatformView()
{
    var config = new WKWebViewConfiguration();
    config.Preferences.JavaScriptEnabled = true;
    return new WKWebView(CGRect.Empty, config);
}

protected override void ConnectHandler(WKWebView platformView)
{
    base.ConnectHandler(platformView);
    platformView.NavigationFinished += OnNavigationFinished;
    LoadUrl(VirtualView.Url);
}

protected override void DisconnectHandler(WKWebView platformView)
{
    platformView.NavigationFinished -= OnNavigationFinished;
    base.DisconnectHandler(platformView);
}

private void OnNavigationFinished(object sender, WKNavigationEventArgs e)
{
    // 执行字体放大JS,示例为150%比例
    var zoomScript = "document.body.style.zoom = '1.5';";
    (sender as WKWebView)?.EvaluateJavaScript(zoomScript, null);
}

internal void LoadUrl(string url)
{
    if (string.IsNullOrEmpty(url)) return;
    if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out var uri))
    {
        PlatformView.LoadRequest(new NSUrlRequest(uri));
    }
    else
    {
        // 处理HTML字符串加载
        PlatformView.LoadHtmlString(url, null);
    }
}

5. 平台配置补充

  • 若加载远程Url,在iOS项目的Info.plist中添加网络权限:
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
  • 加载本地HTML文件时,需将文件的生成操作设为BundleResource

关键差异说明

Xamarin的Renderer基于继承重写控件全生命周期,MAUI的Handler采用组合模式,仅负责平台视图的创建、属性绑定与事件处理,需避免直接照搬Renderer逻辑,严格遵循Handler的生命周期方法组织代码。

内容的提问来源于stack exchange,提问作者Matthew Pans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:40:04