WKWebView

Posted 孤独的菜鸟----

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WKWebView相关的知识,希望对你有一定的参考价值。

WKWebView 是ios8新增的 Web 浏览视图,因而都是对比UIWebView !!

WKWebView新特性

  • 在性能、稳定性、功能方面有很大提升(占有内存比WebView小, 缺点:不支持缓存和NSURLProtocol);
  • 允许javascript的Nitro库加载并使用(UIWebView中限制); 支持了更多的html5特性;
  • 高达60fps的滚动刷新率以及内置手势;
  • 增加estimatedProgress加载进度条;
  • 将UIWebViewDelegate与UIWebView重构成了14类与3个协议(官方文档);

创建方法

1 首先引入

#import <WebKit/WebKit.h>

2 初始化

- (instancetype)initWithFrame:(CGRect)frame;
- (instancetype)initWithFrame:(CGRect)frame 
configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;

PS:2)是WKWebView的新增属性,通过这个方法,设置 configuration 让WKWebView知道一些缓存的状态,
configuration 可以通过已有的Cookie进行设置,也可以通过保存上一次的configuration进行设置。

3 创建UI

    _webShow = [[WKWebView alloc]initWithFrame:CGRectMake(0, 64, 320, 400)];
    _webShow.navigationDelegate = self;
    NSURL *url = [[NSURL alloc]initWithString:@"http://www.360doc.com/showWeb/0/0/512349271.aspx"];
    [_webShow loadRequest:[[NSURLRequest alloc]initWithURL:url]];

WKNavigationDelegate

该代理提供的方法,可以用来追踪加载过程(页面开始加载、加载完成、加载失败)、决定是否执行跳转。

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation  
// 类似UIWebView的 -webViewDidStartLoad:页面开始加载时调用
    NSLog(@"didStartProvisionalNavigation");  
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;  
  

- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation   
//内容开始返回时调用
    NSLog(@"didCommitNavigation");  
  

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation 
 // 类似 UIWebView 的 -webViewDidFinishLoad:  页面加载完成时调用
    NSLog(@"didFinishNavigation");  
    [self resetControl];  
    if (webView.title.length > 0)   
        self.title = webView.title;  
      
  

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation 
withError:(NSError *)error   
 // 类似 UIWebView 的- webView:didFailLoadWithError:页面加载失败时调用
    NSLog(@"didFailProvisionalNavigation");      
  


- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse 
decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler   
//这个代理方法表示当客户端收到服务器的响应头,根据response相关信息,可以决定这次跳转是否可以继续进行
    decisionHandler(WKNavigationResponsePolicyAllow);  
  

- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:
(WKNavigation *)navigation

//接收到服务器跳转请求之后调用

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:
(WKNavigationAction *)navigationAction 
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler   
// 类似 UIWebView 的 -webView: shouldStartLoadWithRequest: navigationType: 
 在发送请求之前,决定是否跳转  
    NSLog(@"4.%@",navigationAction.request);   
    NSString *url = [navigationAction.request.URL.absoluteString 
stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    decisionHandler(WKNavigationActionPolicyAllow);  

  
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler   

以上是关于WKWebView的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView使用

iOS WKWebView 那些坑

WKWebView的介绍

IOS进阶之WKWebView

刷新或关闭时调用onbeforeunload

刷新页面时调用RowDataBound事件