【问题标题】:How to intercept "a redirect URL" from webview in Xamarin Forms如何从 Xamarin Forms 中的 webview 拦截“重定向 URL”
【发布时间】:2021-12-18 03:19:46
【问题描述】:

我在 WebView 中显示一个 OAtuh2 HTML 页面,在单击此页面上的验证按钮后,我会返回一个重定向 URL,我想拦截该重定向 URL 以使用其中的信息。

在 XML 文件中

<ContentPage.Content>
    <WebView x:Name="browser"></WebView>
</ContentPage.Content>

在 CS 文件中

browser.Source = "https://myUrl";

我对 Xamarin 的了解并不多,因此我不知道该怎么做

感谢您的帮助

【问题讨论】:

  • WebView - Events,以及它的WebNavigatingEventArgs
  • @ToolmakerSteve 在 WebNavigatingEventArgs 上与“重定向 URL”相对应的“属性”?因为 e.Url 返回当前 URL 而不是重定向 URL。
  • 如果您在调试器中查看 e.Source,它应该包含 HTMLWebViewSourceURLWebViewSource。它是哪一个?它是否包含原始 URL?如果不是,那么在 WebView 的代码中,this.Source 包含什么? AFAIK 应该仍然是那里的原始 URL。
  • 是触发的 URLWebViewSource 只包含原始 URL。它在页面加载时触发,而不是在用户单击“按钮验证”后触发,所以当我收到“重定向 URL”时。所以我尝试了 WebNavigatedEventArgs 看看我以后是否可以,但它永远不会触发。
  • 我发现了!我做了两种解决方案,一个来自 ColeX,一个来自你,看看它是如何工作的。当你这样做时,你的解决方案不起作用。我已经删除了 ColeX 解决方案并且它有效。无论如何,非常感谢您对我的耐心等待,您对我的进步帮助很大。

标签: c# xamarin xamarin.forms


【解决方案1】:

你可以像 ToolmakerSteve 提到的那样使用WebNavigatingEventArgs

有关详细信息,您可以使用自定义渲染器在每个特定平台上实现此功能。

iOS

[assembly: ExportRenderer(typeof(WebView), typeof(MyRenderer))]
namespace FormsApp.iOS
{
    class MyRenderer : WkWebViewRenderer
    {

        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            this.NavigationDelegate = new MyDelegate();
        }
    }

    public class MyDelegate : WKNavigationDelegate
    {
        public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
        {
            if(navigationAction.NavigationType == WKNavigationType.Other)
            {
                if(navigationAction.Request.Url != null)
                {
                    //do something
                }
                decisionHandler(WKNavigationActionPolicy.Cancel);
                return;
            }
            decisionHandler(WKNavigationActionPolicy.Allow);
        }
    }
}

安卓

[assembly: ExportRenderer(typeof(Xamarin.Forms.WebView), typeof(MyRenderer))]
namespace FormsApp.Droid
{
    class MyRenderer : WebViewRenderer
    {
        public MyRenderer(Context context):base(context)
        {

        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.SetWebViewClient(new MyClient());
            }
        }
    }

    public class MyClient : WebViewClient
    {
        public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, IWebResourceRequest request)
        {
            //do something
            return true;
        }
    }
}

参考

https://stackoverflow.com/a/45604360/8187800

https://stackoverflow.com/a/4066497/8187800

【讨论】:

猜你喜欢
  • 2018-02-03
  • 2012-11-25
  • 2019-02-18
  • 2019-11-02
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多