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

Android端AuthenticatedWebView Handler调用LoadUrl页面加载失败求助

Android端MAUI AuthenticatedWebView调用LoadUrl空白问题修复

问题根源

Android端直接在WebViewHandler的映射逻辑里调用LoadUrl,会和MAUI自身的WebView加载流程冲突。MAUI的WebViewHandler会自行管理Source的加载状态,直接调用原生LoadUrl会打乱这个逻辑,导致页面加载异常空白。

修复方案

Android端改用自定义WebViewClient拦截请求的方式注入头部,而非直接调用LoadUrl。这种方式既符合MAUI的生命周期管理,又能稳定实现头部添加需求。

修正后的完整代码

public class AuthenticatedWebView : WebView
{
    static AuthenticatedWebView()
    {
        Microsoft.Maui.Handlers.WebViewHandler.Mapper.AppendToMapping(nameof(IWebView.Source), (handler, view) =>
        {
            if (view is AuthenticatedWebView webView)
            {
                var targetUrl = "https://www.google.com";
                var authToken = "";
#if ANDROID
                // 替换WebViewClient以拦截请求注入头部
                handler.PlatformView.SetWebViewClient(new AuthenticatedWebViewClient(authToken));
                // 让MAUI正常处理Source加载
                webView.Source = new UrlWebViewSource { Url = targetUrl };
#elif IOS
                var webRequest = new NSMutableUrlRequest(new NSUrl(targetUrl));
                var headerKey = new NSString("Authorization");
                var headerValue = new NSString(authToken);
                webRequest.Headers = new NSDictionary(headerKey, headerValue);
                handler.PlatformView.LoadRequest(webRequest as NSUrlRequest);
#else
                throw new NotImplementedException();
#endif
            }
        });
    }
}

#if ANDROID
public class AuthenticatedWebViewClient : Android.Webkit.WebViewClient
{
    private readonly string _authToken;

    public AuthenticatedWebViewClient(string authToken)
    {
        _authToken = authToken;
    }

    public override WebResourceResponse ShouldInterceptRequest(Android.Webkit.WebView view, IWebResourceRequest request)
    {
        // 构造带头部的新请求
        var requestBuilder = new Android.Net.HttpUrlRequest.Builder(request.Url.ToString())
            .AddHeader("Authorization", _authToken);

        var newRequest = requestBuilder.Build();

        try
        {
            // 执行请求并返回响应
            var connection = Android.Net.HttpURLConnection.OpenConnection(newRequest.Url);
            foreach (var header in newRequest.Headers)
            {
                connection.SetRequestProperty(header.Key, header.Value);
            }

            return new WebResourceResponse(
                connection.ContentType,
                connection.ContentEncoding,
                connection.InputStream
            );
        }
        catch
        {
            // 异常时回退到默认处理
            return base.ShouldInterceptRequest(view, request);
        }
    }
}
#endif

关键说明

  • Android端通过WebViewClient拦截请求,确保所有请求都能带上认证头部,同时让MAUI正常管理WebView的加载流程,避免直接调用原生方法的冲突。
  • 测试空头部场景时,authToken为空也不会影响页面加载,符合你的测试需求。
  • 直接设置webView.Source保证MAUI的生命周期逻辑正常运行,不会出现空白页面问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:57:25