如何从 Xamarin Forms 中的 webview 拦截“重定向 URL”

Posted

技术标签:

【中文标题】如何从 Xamarin Forms 中的 webview 拦截“重定向 URL”【英文标题】:How to intercept "a redirect URL" from webview in Xamarin Forms 【发布时间】: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 解决方案并且它有效。无论如何,非常感谢您对我的耐心等待,您对我的进步帮助很大。 【参考方案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://***.com/a/45604360/8187800

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

【讨论】:

@ToolmakerSteve 的提议和您的提议是获取“重定向 URL”的 2 种不同方式? 现在的问题是如何从 xamarin.andorid 或 ios 获取价值到 xamarin.form ? @JBD "'如何从 xamarin.andorid 或 ios 中获取值到 xamarin.form" - ***.com/q/24251020/199364, docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/… docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/…

以上是关于如何从 Xamarin Forms 中的 webview 拦截“重定向 URL”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 tapGesture (Xamarin.Forms) 从应用程序中的多个标签中删除选定的标签

如何从 Xamarin.forms pcl 中的 Url 检索 json 字符串

如何从 Xamarin.forms pcl 中的 Url 检索 json 字符串

如何从解决方案中的文件加载 XML 文件,使用嵌入式资源构建?项目 > 跨平台 > Xamarin.Forms

如何从 Xamarin Forms 中的 webview 拦截“重定向 URL”

如何从 Xamarin Forms 中的自定义 ViewCell 获取 ListView 项目索引?