Мне нужно переопределить 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
});
Я могу ошибаться, но я думаю, что это может быть связано с вашей переопределенной версией метода 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 обработчиков по умолчанию:
Также не используйте контекст приложения в обработчиках, у обработчиков есть собственное свойство Context, которое вы можете использовать.
Ясно, тогда это может быть ошибка, и нам, возможно, придется поднять ее на Maui Git, я мог бы помочь вам с этим, если это необходимо :)
Поскольку это подтвержденная ошибка, я присуждаю вам вознаграждение, чтобы оно не было потрачено впустую :) Отчет об ошибке создается сотрудником MSFT.
Да, это так, как вы сказали.
И я создал новую проблему для этой проблемы, вы можете следить за ней здесь: https://github.com/dotnet/maui/issues/11004.
Спасибо за вашу поддержку и отзыв о maui.
С уважением.
Спасибо за подтверждение. Есть ли какой-нибудь обходной путь, который я могу использовать в то же время?
Извините за неудобства, нам остается только терпеливо ждать выхода новой версии.
Спасибо за ответ. К сожалению, я не смогу проверить это до понедельника. Однако в одном из моих обработчиков я использовал результат
base.CreatePlatformView
и просто изменил клиента наSetWebViewClient
, поэтому, пока я буду тестировать в понедельник, я думаю, что это маловероятно.