如何检测Cordova iOS WebView导航事件并获取跳转后的新URL
检测Cordova iOS WebView的链接跳转并获取新URL
嘿,我来帮你搞定这个问题!要实现检测WebView里链接跳转到外部站点并获取新URL的需求,其实可以借助原生iOS WebView的代理机制——毕竟Cordova的WebView底层就是WKWebView(现在主流用这个)或者旧版的UIWebView,我们只需要扩展CDVViewController来拦截这些导航行为就行,具体步骤如下:
1. 自定义继承自CDVViewController的控制器
首先,你需要创建一个自定义的ViewController,继承自CDVViewController并实现WebView的代理协议:
头文件(MyCDVViewController.h)
#import <Cordova/CDVViewController.h> #import <WebKit/WebKit.h> @interface MyCDVViewController : CDVViewController <WKNavigationDelegate> @end
实现文件(MyCDVViewController.m)
#import "MyCDVViewController.h" @implementation MyCDVViewController - (void)viewDidLoad { [super viewDidLoad]; // 获取Cordova封装的WKWebView,并设置当前控制器为它的导航代理 WKWebView *cordovaWebView = (WKWebView*)self.webView; cordovaWebView.navigationDelegate = self; } // 核心:拦截即将发起的导航请求,检测跳转行为 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { NSURL *targetURL = navigationAction.request.URL; NSString *targetURLString = targetURL.absoluteString; // 替换成你配置的初始content src(比如http://apache.org) NSString *initialBaseURL = @"http://apache.org"; // 判断是否跳转到了外部站点(和初始URL前缀对比) if (![targetURLString hasPrefix:initialBaseURL]) { NSLog(@"检测到跳转到外部站点:%@", targetURLString); // 可选:把新URL传递给JS端处理 CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:targetURLString]; [self.commandDelegate sendPluginResult:result callbackId:@"externalJumpCallback"]; } // 允许WebView继续加载这个请求,如果要阻止跳转就传WKNavigationActionPolicyCancel decisionHandler(WKNavigationActionPolicyAllow); } // 可选:页面加载完成后获取最终的URL - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { NSString *loadedURL = webView.URL.absoluteString; NSLog(@"当前页面加载完成,URL:%@", loadedURL); } @end
2. 兼容旧版UIWebView(如果需要)
如果你的项目还在使用UIWebView(不推荐,苹果已弃用),可以实现UIWebViewDelegate的方法来拦截:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *targetURL = request.URL; NSString *targetURLString = targetURL.absoluteString; NSString *initialBaseURL = @"http://apache.org"; if (![targetURLString hasPrefix:initialBaseURL]) { NSLog(@"检测到外部跳转:%@", targetURLString); // 同样可以传递给JS端 } return YES; // 返回YES允许加载,NO则阻止跳转 }
3. 在JS端接收跳转的URL
如果你需要在前端处理这个跳转URL,可以在Cordova的JS代码里注册回调:
document.addEventListener("deviceready", function() { // 注册Native端调用的回调函数 window.externalJumpCallback = function(url) { console.log("Native检测到外部跳转URL:", url); // 这里可以做前端逻辑,比如弹窗提示、记录日志等 }; }, false);
补充说明
为什么CDVViewController本身没直接提供这个功能?因为Cordova默认是让WebView自主处理导航行为,但它并没有封装所有原生WebView的代理能力——所以我们直接利用原生iOS的WebView代理机制,就能轻松实现跳转检测和URL获取啦。
内容的提问来源于stack exchange,提问作者bhantol
相关产品推荐
相关产品推荐

