iOS 原生控件和HTML5的交互

来源:互联网 发布:淘宝订单处理 编辑:程序博客网 时间:2024/05/21 10:27

其实在写这篇文章的时候也不是特别的明白,还是有点模糊的,但是我写出来梳理一下思路,也可以为别人提供一下借鉴。

在iOS 开发中用到网页就必须知道UIWebView。下面先介绍一下UIWebView

    UIWebView *webView = [[UIWebViewalloc]initWithFrame:[UIScreenmainScreen].bounds];

    webView.backgroundColor = [UIColorwhiteColor];

    webView.delegate =self;

    [webView loadRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:@"https://www.baidu.com"]]];

    [self.viewaddSubview:webView];

遵守UIWebView的代理 UIWebViewDelegate  代理里有四个方法:

// 每次加载网页都会调用

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

  NSString *strUrl = request.URL.absoluteString;//在这个方法里可以获取每次刷新网页的绝对字符串,可以根据字符串进行你需要的操作。


}

// 网页开始加载

- (void)webViewDidStartLoad:(UIWebView *)webView;

// 网页加载完成

- (void)webViewDidFinishLoad:(UIWebView *)webView;

// 网页加载错误

- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullableNSError *)error;

// ---------------------- 开始代码实现监听网页内容 ------------------------

在@interface 接口文件里添加属性

@property (nonatomic,strong)JSContext *context;

在头文件导入 #import <JavaScriptCore/JavaScriptCore.h>


// 在网页加载完成的代理方法里实现

-(void)webViewDidFinishLoad:(UIWebView *)webView{


    // htmltitle导航栏的 title

    self.title = [webViewstringByEvaluatingJavaScriptFromString:@"document.title"];


   //监听整个js里面的内容

    self.context = [webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];


    //打印异常

    self.context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue){


        NSLog(@"%@",exceptionValue);

    

    };


    // block的形式要避免循环引用 object

    __blocktypeof(self) loginview =self;

    self.context[@"starupLogin"] = ^(NSString *str){// @"starupLogin" 这是网页和iOS端开发约定的字段,一旦发现就触发方法

        [[NSOperationQueuemainQueue]addOperationWithBlock:^{


        [loginview login]; // 在 - (void)login{} 方法里实现调用原生控件的登录操作。

        }];

    };

    

}


// 在上面实现网页和原生控件的交互,但是在实际的开发中我们会遇到点击网页控件会刷新网页,在我们返回的时候可能需要返回网页刷新后的上一页,这个时候我们就不能仅仅操作原生控件返回了,因为webView还是同一个,只是网页刷新了。在这里 OC语言给我们封装好了方法我们只用直接调用就可以了。

        if (webView.canGoBack) { 

            [webViewgoBack];

        }else{

            

            [self.navigationControllerpopViewControllerAnimated:YES]; 

        }


// canGoBack 是否可以返回,如果返回YES则可以返回,如果返回NO则不可以返回;调用[webView goBack]方法返回网页的上一次刷新。

// canGoForward 是否可以前进,如果返回YES则可以前进,如果返回NO则不可以前进;调用[webView goForward]方法进入到上次返回的页面。


在网页里一般都会有缓存 [NSURLCachesharedURLCache]removeAllCachedResponses]; 此方法可以清除网页的缓存。

以上就是我开发应用,用到的网页和原生控件交互的总结,希望能对你有所启发!





0 0