You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:04:16