uni-app x webview 如何实现 plus.webview 里的 overrideUrlLoading 拦截请求URL,以及ios uts 如何实现 delegate

发布于 1周前 作者 wuwangju 来自 Uni-App

uni-app x webview 如何实现 plus.webview 里的 overrideUrlLoading 拦截请求URL,以及ios uts 如何实现 delegate

如何 实现 wkwebview 的

optional func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse,
decisionHandler: @escaping @MainActor @Sendable (WKNavigationResponsePolicy) -> Void)

协议方法

这个闭包是没有参数的

export type VoidCallback = (WKNavigationActionPolicy : WKNavigationActionPolicy) => void
webView(webView : WKWebView, @argumentLabel("decidePolicyFor") navigationAction : WKNavigationAction, @escaping decisionHandler : VoidCallback) {
    console.log('decidePolicyFor')
    decisionHandler(WKNavigationActionPolicy.cancel)
}

或者 uni-app x webview 如何实现 plus.webview 里的 overrideUrlLoading 拦截请求 URL


3 回复

1、要想上面的代理方法生效,首先需要是你自定义的webview组件,uni-app x 内置的weview组件不对外提供拦截url的能力; 2、上面的代理方法写法有误,需要直接翻译,不用定义中间变量VoidCallback


谢谢,怪不得,有些代理,没有回调

在uni-app中使用plus.webviewoverrideUrlLoading拦截请求URL,可以通过监听webview对象的loadurl事件来实现。下面是一个示例代码,展示了如何拦截并处理URL请求。

uni-app中的plus.webview overrideUrlLoading实现

  1. 创建Webview
const webview = plus.webview.create('https://example.com', '_blank', {
    top: '0px',
    bottom: '0px'
});
  1. 监听loadurl事件
webview.addEventListener('loadurl', function(e) {
    // e.url 是加载的URL
    console.log('Loading URL:', e.url);

    // 在这里进行URL拦截处理
    if (e.url.startsWith('https://example.com/intercept')) {
        // 拦截特定URL
        plus.nativeUI.toast('URL has been intercepted!');

        // 可以选择加载另一个URL或执行其他操作
        // webview.executeScript({ code: 'window.location.href = "https://newurl.com"' });
        // 或者直接关闭webview
        // webview.close();

        // 返回false以阻止默认的URL加载行为
        return false;
    }

    // 返回true以允许默认的URL加载行为
    return true;
});
  1. 显示Webview
webview.show();

iOS UTS中的delegate实现

在iOS开发中,要实现URL请求的拦截,通常通过实现UIWebViewDelegateWKNavigationDelegate(对于WKWebView)的代理方法来完成。

UIWebViewDelegate 示例

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIWebViewDelegate>

@property (nonatomic, strong) UIWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
    self.webView.delegate = self;
    [self.view addSubview:self.webView];
    
    NSURL *url = [NSURL URLWithString:@"https://example.com"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *URL = request.URL;
    NSLog(@"Loading URL: %@", URL.absoluteString);
    
    if ([URL.absoluteString hasPrefix:@"https://example.com/intercept"]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Info" message:@"URL has been intercepted!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        
        // 拦截后重定向或其他操作
        // [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://newurl.com"]]];
        
        return NO; // 阻止加载
    }
    
    return YES; // 允许加载
}

@end

上述代码展示了如何在uni-app和iOS UTS中拦截URL请求。根据实际需求,你可以在这些拦截点执行不同的操作,如重定向、显示警告或执行其他自定义逻辑。

回到顶部