UPDATE:这是一个已确认的错误。请在这里投赞成票,因为它并没有真正受到女士的关注
我需要重写WebViewClient
的shouldInterceptRequest
方法,以按照该指南加载应用内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的精确片段。我意识到一个问题:设置MAUIWebView
的Source
属性不再导航真正的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