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

Luk*_* Vo 2 .net android webview maui

更新:这是一个已确认的错误。请在这里投票,因为它并没有真正受到 MS 的太多关注。


我需要按照该指南重写加载应用内 HTML 内容shouldInterceptRequest的方法。WebViewClient

这是带有可重现代码的存储库:GitHub。我还从MS 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

在存储库中,我包含了 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/";
Run Code Online (Sandbox Code Playgroud)
  • 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);
    }

Run Code Online (Sandbox Code Playgroud)

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

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

Fre*_*Ali 5

我可能是错的,但是,我认为这可能与您重写的方法版本有关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;
}
Run Code Online (Sandbox Code Playgroud)

检查此 URL 以了解默认处理程序 CreatePlatform 设置:

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

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