有一个 Blazor WebAssembly 网站,我需要存储用户在 MAUI 应用程序的 Web 视图中显示的最新 url。
我创建了一个 WebViewRenderer 并通过 SetWebViewClient 方法提供了一个新的自定义 webviewclient。但不幸的是,WebViewclient 中没有任何方法被触发/命中。
应用程序点击 ConnectHandler,这意味着我可以成功连接到处理程序。无论如何,我给了你我的代码,但不确定它是否真的有帮助。
[assembly: ExportRenderer(typeof(Microsoft.Maui.Controls.WebView), typeof(MyWebViewRenderer))]
namespace MiniApp.Platforms.Android
{
public class MyWebViewRenderer : WebViewHandler
{
CustomWebViewClient webclient;
public MyWebViewRenderer()
{
webclient = new CustomWebViewClient();
}
protected override void ConnectHandler(global::Android.Webkit.WebView platformView)
{
//platformView.SetWebViewClient(new CustomWebViewClient());
base.ConnectHandler(platformView);
}
protected override global::Android.Webkit.WebView CreatePlatformView()
{
var platformView = base.CreatePlatformView();
platformView.SetWebViewClient(webclient);
return platformView;
}
}
public class CustomWebViewClient : WebViewClient
{
public override void OnPageStarted(global::Android.Webkit.WebView? view, string? url, Bitmap? favicon)
{
base.OnPageStarted(view, url, favicon);
}
public override void DoUpdateVisitedHistory(global::Android.Webkit.WebView? view, string? url, bool isReload)
{
base.DoUpdateVisitedHistory(view, url, isReload);
}
public override void OnFormResubmission(global::Android.Webkit.WebView? view, Message? dontResend, Message? resend)
{
base.OnFormResubmission(view, dontResend, resend);
}
public override void OnLoadResource(global::Android.Webkit.WebView? view, string? url)
{
base.OnLoadResource(view, url);
}
public override void OnPageCommitVisible(global::Android.Webkit.WebView? view, string? url)
{
base.OnPageCommitVisible(view, url);
}
public override void OnPageFinished(global::Android.Webkit.WebView? view, string? url)
{
base.OnPageFinished(view, url);
}
public override void OnReceivedClientCertRequest(global::Android.Webkit.WebView? view, ClientCertRequest? request)
{
base.OnReceivedClientCertRequest(view, request);
}
public override bool OnRenderProcessGone(global::Android.Webkit.WebView? view, RenderProcessGoneDetail? detail)
{
return base.OnRenderProcessGone(view, detail);
}
public override bool ShouldOverrideUrlLoading(global::Android.Webkit.WebView? view, IWebResourceRequest? request)
{
return base.ShouldOverrideUrlLoading(view, request);
}
public override bool ShouldOverrideUrlLoading(global::Android.Webkit.WebView? view, string? url)
{
return base.ShouldOverrideUrlLoading(view, url);
}
public override void OnUnhandledInputEvent(global::Android.Webkit.WebView? view, InputEvent? e)
{
base.OnUnhandledInputEvent(view, e);
}
public override void OnScaleChanged(global::Android.Webkit.WebView? view, float oldScale, float newScale)
{
base.OnScaleChanged(view, oldScale, newScale);
}
public override void OnSafeBrowsingHit(global::Android.Webkit.WebView? view, IWebResourceRequest? request, [GeneratedEnum] SafeBrowsingThreat threatType, SafeBrowsingResponse? callback)
{
base.OnSafeBrowsingHit(view, request, threatType, callback);
}
}
}
有没有办法在用户导航时捕获 url?
PS:我使用 vs 2022 和 .net 8.0 框架
我创建了一个新项目并重现了您的问题。这似乎是.net 8.0 中的一个新问题。您可以在 github 上将其报告为新问题。
此外,您可以尝试在页面的 OnHandlerChanged 方法中使用自定义处理程序作为解决方法。
在xaml中:
<Webview x:Name="webview" Source=""/>
在后面的代码中:
protected override void OnHandlerChanged()
{
base.OnHandlerChanged();
#if ANDROID
(webview.Handler.PlatformView as Android.Webkit.WebView).SetWebViewClient(new Platforms.Android.MyClient());
#endif
}
还有 WebViewClent 类:
namespace MauiApp.Platforms.Android
{
public class MyClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading(global::Android.Webkit.WebView? view, IWebResourceRequest? request)
{
var url = request.Url.ToString();
// this is the url
return base.ShouldOverrideUrlLoading(view, request);
}
}
}
此外,
[assembly: ExportRenderer(typeof(Microsoft.Maui.Controls.WebView), typeof(MyWebViewRenderer))]
应该删除,因为它用于xamarin.forms而不是maui。