如何从 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,它应该包含 HTMLWebViewSource
或 URLWebViewSource
。它是哪一个?它是否包含原始 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