Xamarin.iOS WebView如何捕获URL变化?替代Android的ShouldOverrideUrlLoading
Xamarin.iOS 捕获WebView URL变化并检查QueryString的解决方案
在Xamarin.iOS中,对应Android里ShouldOverrideUrlLoading的功能,根据你使用的WebView组件不同,有两种主流实现方式,优先推荐苹果官方主推的WKWebView:
使用WKWebView(推荐)
通过设置WKNavigationDelegate并重写DecidePolicy方法,可以拦截所有导航请求(包括重定向过程中的URL),从而检查QueryString字段:
1. 初始化WKWebView并设置代理
using WebKit; public class LoginViewController : UIViewController { private WKWebView _webView; public override void ViewDidLoad() { base.ViewDidLoad(); // 配置WKWebView参数 var webConfig = new WKWebViewConfiguration(); _webView = new WKWebView(View.Bounds, webConfig); // 设置自定义导航代理 _webView.NavigationDelegate = new CustomWKNavigationDelegate(); // 加载目标登录页面 var loginUrl = new NSUrl("https://samplelogin.com"); _webView.LoadRequest(new NSUrlRequest(loginUrl)); View.AddSubview(_webView); } }
2. 自定义WKNavigationDelegate处理URL检查
public class CustomWKNavigationDelegate : WKNavigationDelegate { public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler) { // 获取当前请求的完整URL string currentUrl = navigationAction.Request.Url.ToString(); // 检查URL中的目标QueryString字段 if (currentUrl.Contains("loginok")) { // 此处添加你的业务逻辑,比如解析参数、处理登录成功逻辑等 } // 允许WebView继续加载该URL,若需阻止则传入WKNavigationActionPolicy.Cancel decisionHandler(WKNavigationActionPolicy.Allow); } }
使用旧版UIWebView(不推荐,已弃用)
如果仍在使用已被苹果弃用的UIWebView,可以通过重写UIWebViewDelegate的ShouldStartLoad方法实现:
public class CustomUIWebViewDelegate : UIWebViewDelegate { public override bool ShouldStartLoad(UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType) { string currentUrl = request.Url.ToString(); if (currentUrl.Contains("loginok")) { // 处理业务逻辑 } // 返回true允许加载,返回false则阻止当前URL加载 return true; } }
说明
WKWebView的DecidePolicy方法会在每次导航(包括重定向跳转)前触发,完全覆盖你在Android中ShouldOverrideUrlLoading的需求场景,且性能更优。- 处理完URL检查逻辑后,必须调用
decisionHandler来告知WebView是否允许继续加载当前请求。
内容的提问来源于stack exchange,提问作者Amazon
相关产品推荐
相关产品推荐

