求助:.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平台
- 在Android项目的
AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 创建
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>
- 在
AndroidManifest.xml的application标签中引用该配置:
<application ... android:networkSecurityConfig="@xml/network_security_config">
- 自定义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
相关产品推荐
相关产品推荐

