iOS_webView与JS交互

本文介绍了iOS中UIWebView的代理方法使用,并通过实例展示了如何通过代理方法控制WebView的加载行为,包括请求拦截与动态页面的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 关于交互网上方式有好多种, 万变不离其宗的就是实现delegate的方法,

那么我们来看看webView的代理.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;//已经开始加载
- (void)webViewDidFinishLoad:(UIWebView *)webView;//结束加载
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error;//请求出错

有这么4个方法。

下面三个没有返回值的就不说了,  我们来看第一个

第一个在webV每次加载前都会被调用,如果返回NO,则表示不允许加载当前请求, 所以, 我们可以把请求判断写在这个方法里

@property (nonatomic, copy) NSString * requestPath;
@property (nonatomic, copy) NSString * pageUrl;//要请求的h5地址

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setUpWebView];
}

- (void)setUpWebView
{
    NSURL * url = [NSURL URLWithString:_pageUrl];//_pageUrl
    UIWebView * webView = [[UIWebView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
    webView.scalesPageToFit = YES;
    webView.delegate = self;
    self.webView = webView;
    NSURLRequest * request =[[NSURLRequest alloc]initWithURL:url];
    [webView loadRequest:request];
    [webView setUserInteractionEnabled:YES];
    [self.view addSubview:webView];
}


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
        NSString * requestPath = request.URL.path;
    NSString * str = [request.URL absoluteString];
    NSString * requestStr = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//转码,防止有空格
    
    //判断是否为动态请求
    if ([requestPath isEqualToString:@"/"]) {
        _requestPath = requestPath;
    }
    if ([_requestPath isEqualToString:@"/"]) {
        
        return YES;
    }
    //判断是否加载
    if (![requestStr isEqualToString:_pageUrl]) {
        NSString * productStr = [[requestStr componentsSeparatedByString:@"productId="] lastObject];
        NSString * productId = [[productStr componentsSeparatedByString:@"&"] firstObject];
        //判断 productId 是否存在, 不存在则不跳转
        if ([productId isEqualToString:requestStr]) {
            return YES;
        }
        [self pushToGroupDetailWithProductId:productId];
        
        return NO;
    }
    
    return YES;
}



其中有涉及到一点点得动态请求,  顺便提一下,  主要是根据后缀来判断的, 


顺便提一句,有些请求可能链接相同, 内容是会变的, webView自带缓存, 最好在结束加载的时候清一下缓存

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    MLog(@"页面加载完毕");
    /**
     *  清除UIWebView的缓存
     */
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
}


 相同点: 都是ASCII编码,都存在HTML代码,都能包含脚本语言代码,都存在Web服务器上

不同点:静态请求页面后缀一般以.htm或者.html结尾,而动态请求网页一般以.shtm或者.shtml结尾



注: 代码中判断动态请求的代码是可以省略的,  下边的代码也是可以实现的, 只是这样写效率会比不加好一点


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值