Android WebViewClient的ShouldInterceptRequest永远不会在MAUI WebView中调用



UPDATE:这是一个已确认的错误。请在这里投赞成票,因为它并没有真正受到女士的关注


我需要重写WebViewClientshouldInterceptRequest方法,以按照该指南加载应用内HTML内容。

这是带有可复制代码的repo:GitHub。我从微软Q&A也是:

// ...
.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler<Microsoft.Maui.Controls.WebView, ProblemHandler2>();
});
// ...
internal class ProblemHandler2 : WebViewHandler
{
protected override Android.Webkit.WebView CreatePlatformView()
{
var wv = new Android.Webkit.WebView(Android.App.Application.Context);
wv.SetWebViewClient(new CustomWebClient());
return wv;
}
}

在回购中,我包含了2个自定义处理程序:

  • ProblemHandler2是MSFT的精确片段。我意识到一个问题:设置MAUIWebViewSource属性不再导航真正的Android WebView:
WebViewHandler.Mapper.AppendToMapping("MyHandler", (handler, view) =>
{
#if ANDROID
var xWv = handler.PlatformView;
// For ProblemHandler2, this is needed to actually navigate:
xWv.LoadUrl("https://www.google.com/");
#endif
});
this.wv.Source = "https://www.google.com/";
  • ProblemHandler1使用默认结果并添加自定义处理程序。这修复了导航问题,,这两个问题都有相同的问题:

ShouldInterceptRequest从不被调用。即使我手动单击链接进行导航,也不会对任何内容调用它。我错过了什么?我确信CustomWebClient是正确创建和设置的。

我注意到其他回调都不起作用,例如:

public override void OnPageStarted(Android.Webkit.WebView view, string url, Bitmap favicon)
{
Debugger.Break();
Debug.WriteLine(url);
base.OnPageStarted(view, url, favicon);
}
public override void OnPageFinished(Android.Webkit.WebView view, string url)
{
Debugger.Break();
Debug.WriteLine(url);
base.OnPageFinished(view, url);
}

我也尝试过使用WebViewHandler.Mapping,但它也不起作用:

WebViewHandler.Mapper.AppendToMapping("MyHandler", (handler, _) =>
{
#if ANDROID
handler.PlatformView.SetWebViewClient(new CustomWebClient());
#endif
});

我可能错了,但我认为这可能与CreatePlatform方法的重写版本有关

你能试试默认的WebViewHandler在做什么吗:

protected override WebView CreatePlatformView()
{
var platformView = new MauiWebView(this, Context!)
{
LayoutParameters = new LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent)
};
platformView.Settings.JavaScriptEnabled = true;
platformView.Settings.DomStorageEnabled = true;
platformView.Settings.SetSupportMultipleWindows(true);
return platformView;
}

检查此URL以获取默认处理程序CreatePlatform设置:

https://github.com/dotnet/maui/blob/c6250a20d73e1992b4a02e6f3c26a1e6cbcbe988/src/Core/src/Handlers/WebView/WebViewHandler.Android.cs

也不要在处理程序中使用应用程序上下文,处理程序有自己的上下文属性可以使用。

是的,正如您所说的那样。

我为这个问题创建了一个新问题,您可以在这里跟进:https://github.com/dotnet/maui/issues/11004.

感谢您对maui的支持和反馈。

谨致问候。

MAUI在Android上为此提供了一个特定的映射器,您只需修改该映射器即可。

#if ANDROID 
public class CustomWebViewClient : Android.Webkit.WebViewClient
{
// Custom implementation of WebViewClient
}
Microsoft.Maui.Handlers.WebViewHandler.ModifyMapping(nameof(WebViewClient), (handler, view) =>
{
var webViewHandler = (WebViewHandler)handler;
webViewHandler.PlatformView.SetWebViewClient(new CustomWebViewClient());
});
#endif

最新更新