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

求助:.NET MAUI WebView无法打开SSL不可信网站,出现黑屏

解决.NET MAUI WebView访问无SSL证书网站的黑屏问题

黑屏的核心原因是目标网站无有效SSL证书,.NET MAUI WebView默认会拦截这类不安全连接,导致页面无法加载。以下是分步骤的解决方案:

1. 修正URL传递的编码问题

原代码直接拼接URL可能因特殊字符导致解析错误,先对URL编码再传递:

private async void lwConnections_ItemTapped(object sender, Syncfusion.Maui.ListView.ItemTappedEventArgs e)
{
    if (lwConnections.SelectedItem != null)
    {
        var rawUrl = ((Connection)lwConnections.SelectedItem).URL;
        var encodedUrl = Uri.EscapeDataString(rawUrl);
        await Shell.Current.GoToAsync($"{nameof(WebViewer)}?URL={encodedUrl}");
    }
}

在WebViewer页面接收时解码:

protected override void OnNavigatedTo(NavigatedToEventArgs args)
{
    base.OnNavigatedTo(args);
    if (Navigation.Parameter is IDictionary<string, object> parameters && parameters.TryGetValue("URL", out var urlObj))
    {
        var decodedUrl = Uri.UnescapeDataString(urlObj.ToString());
        webView.Source = new UrlWebViewSource { Url = decodedUrl };
    }
}

2. 配置各平台允许不安全连接

Android平台

  1. 在Android项目的AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
  1. 创建Resources/xml/network_security_config.xml文件,允许明文或自签名证书连接:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 允许所有明文HTTP连接(仅测试用,生产环境不建议) -->
    <base-config cleartextTrafficPermitted="true" />
    <!-- 如果是自签名HTTPS证书,可添加信任配置,示例:
    <domain-config>
        <domain includeSubdomains="true">your-insecure-domain.com</domain>
        <trust-anchors>
            <certificates src="@raw/your_self_signed_cert" />
        </trust-anchors>
    </domain-config>
    -->
</network-security-config>
  1. 在AndroidManifest.xml的application标签中引用该配置:
<application ... android:networkSecurityConfig="@xml/network_security_config">
  1. 自定义WebViewClient忽略SSL错误(针对自签名HTTPS):
#if ANDROID
public class CustomSslWebViewClient : Android.Webkit.WebViewClient
{
    public override void OnReceivedSslError(Android.Webkit.WebView view, Android.Webkit.ISslErrorHandler handler, Android.Webkit.SslError error)
    {
        // 忽略SSL错误,继续加载页面
        handler.Proceed();
    }
}
#endif

在WebViewer页面绑定WebView时设置该Client:

protected override void OnHandlerChanged()
{
    base.OnHandlerChanged();
#if ANDROID
    var androidWebView = (Android.Webkit.WebView)webView.Handler.PlatformView;
    androidWebView.SetWebViewClient(new CustomSslWebViewClient());
#endif
}

iOS/macOS平台

在项目的Info.plist中添加App Transport Security配置,允许不安全连接:

<key>NSAppTransportSecurity</key>
<dict>
    <!-- 允许所有域名的不安全连接(仅测试用) -->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <!-- 生产环境建议仅允许特定域名:
    <key>NSExceptionDomains</key>
    <dict>
        <key>your-insecure-domain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
    -->
</dict>

3. 确保WebView导航未被拦截

在WebViewer页面的WebView中添加导航事件,确认未取消不安全连接的导航:

<WebView x:Name="webView" NavigationStarting="WebView_NavigationStarting" />

后台代码:

private void WebView_NavigationStarting(object sender, WebNavigatingEventArgs e)
{
    // 不要取消不安全连接的导航请求
    e.Cancel = false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:21:26