iOS_webView与JS交互

来源:互联网 发布:自学java多久能就业 编辑:程序博客网 时间:2024/05/17 07:01

 关于交互网上方式有好多种, 万变不离其宗的就是实现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结尾



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


0 0