在 MAUI 中捕获 Blazor WASM 页面的 Web 视图中的内容更改

问题描述 投票:0回答:1

有一个 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 框架

webview navigation maui blazor-webassembly
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.