Android WebViewClient ShouldInterceptRequest никогда не вызывается в MAUI WebView

Мне нужно переопределить shouldInterceptRequest метод WebViewClient, чтобы загружать HTML-контент в приложении, следуя этому руководству.

Вот репо с воспроизводимым кодом: 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;
    }

}

В репозиторий я включил 2 пользовательских обработчика:

  • ProblemHandler2 — это точный фрагмент MSFT. Я понял проблему: установка свойства WebView MAUI 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
        });
0
0
163
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я могу ошибаться, но я думаю, что это может быть связано с вашей переопределенной версией метода 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

Также не используйте контекст приложения в обработчиках, у обработчиков есть собственное свойство Context, которое вы можете использовать.

Спасибо за ответ. К сожалению, я не смогу проверить это до понедельника. Однако в одном из моих обработчиков я использовал результат base.CreatePlatformView и просто изменил клиента на SetWebViewClient, поэтому, пока я буду тестировать в понедельник, я думаю, что это маловероятно.

Luke Vo 29.10.2022 10:10

Ясно, тогда это может быть ошибка, и нам, возможно, придется поднять ее на Maui Git, я мог бы помочь вам с этим, если это необходимо :)

FreakyAli 30.10.2022 11:41

Поскольку это подтвержденная ошибка, я присуждаю вам вознаграждение, чтобы оно не было потрачено впустую :) Отчет об ошибке создается сотрудником MSFT.

Luke Vo 04.11.2022 08:43
Ответ принят как подходящий

Да, это так, как вы сказали.

И я создал новую проблему для этой проблемы, вы можете следить за ней здесь: https://github.com/dotnet/maui/issues/11004.

Спасибо за вашу поддержку и отзыв о maui.

С уважением.

Спасибо за подтверждение. Есть ли какой-нибудь обходной путь, который я могу использовать в то же время?

Luke Vo 31.10.2022 08:26

Извините за неудобства, нам остается только терпеливо ждать выхода новой версии.

Jessie Zhang -MSFT 02.11.2022 08:43

Другие вопросы по теме