WKWebView概述

来源:互联网 发布:用java编写计算器程序 编辑:程序博客网 时间:2024/05/29 04:34
一、概述

1.iOS 8 SDK中发布了新的WebView框架----WebKit.framework。
2.WebKit使用WKWebView来代替IOS的UIWebView和OSX的NSWebView,并且使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safari一样快。
3.内存问题:
(1)UIWebView类的内存问题一直广受诟病,现在问题终于解决了,使用WKWebView,我们APP的内存情况基本上不会因为使用了WebView而有多少变化。
(2)通过观察设备内存变化,发现WKWebView的内存被分配到了com.apple.WebKit进程,WebView里面消耗的内存不再属于我们App的进程啦。
(3)观察Safari的内存使用情况,内存情况是一样的。看来苹果把Safari的内核开放给开发者用了。
(4)但是com.apple.WebKit的内存也一直在涨,也会堆积很多,不知道有实质上的变化没。

二、WKWebView增加的属性和方法

1.增加的属性:
(1)estimatedProgress:加载进度条,在IOS8之前我们是通过一个假的进度条来实现
(2)backForwardList:表示historyList,是只读的。
(3)WKWebViewConfiguration *configuration; 初始化webview的配置

2.增加的方法:
(1)初始化:
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration 

(2)跳到历史的某个页面
-(WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item; 

三、相同的属性和方法
goBack、goForward、canGoBack、canGoForward、stopLoading、loadRequest、scrollView

四、被删去的属性和方法:
1、主动调用JS的方法:
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
替换为:
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *))completionHandler;

2、无法设置缓存
1.在UIWebView,使用NSURLCache,可以设置我们自己的缓存,但WKWebView不支持NSURLCache。NSURLCache完全拦截不到WKWebView的任何请求。
2.UIWebView也可以使用NSURLProtocol来实现离线缓存,在WKWebView中一样不适用。和NSURLCache不一样的是,在WKWebView中,NSURLProtocol能拦截到最初始的网页链接,比如使用LoadReqeust方法加载的网页地址或者内部自动的页面跳转。
3.唯一实现离线缓存的方法就是使用HTML5的离线缓存机制了,需要浏览器和服务器配合来实现,WKWebView支持H5离线缓存。另外不需要写任何关于离线缓存的代码。

3.类似于PhoneGap实现网页调用native界面的拦截入口没有了
(1)根据上面第2点的表述,可以使用NSURLProtocol来拦截。类似于PhoneGap实现网页调用,一般都不是HTTP协议,一般都自定义协议名称,比如callnative。要想拦截这样的协议,则不能实现以下两个方法:decidePolicyForNavigationAction、decidePolicyForNavigationResponse。
(2)可以使用WKUIDelegate的runJavaScriptAlertPanelWithMessage方法来实现传递调用,网页端调用alert方法,并且将调用链接作为message参数。然后就会被runJavaScriptAlertPanelWithMessage方法拦截到,就可以获取到调用链接了,而alert的UI现实交由我们处理,我们不做处理,只获取Message来处理页面调用。

五、需要提出的一些不同的地方:(国外文章摘录:https://github.com/ShingoFukuyama/WKWebViewTips
1.file:///协议只能打开tmp目录下的文件。
2.在Storyboard和IB中,不能使用WKWebView。
3.JavaScript中的alert, confirm, prompt调用需要实现WKUIDelegate。
4.Cookie, Cache, Credential, WebKit data不能很容易的删除。可以综合使用以下的方法:
(1)和使用UIWebView一样,使用NSURLCache和NSHTTPCookie删除cookie和缓存。如果你使用了WKProccessPool,重新初始化它。
(2)删除Library目录中的Cookies, Caches, WebKit子文件夹。
(3)移除所有的WKWebViews。。
5.WKWebView不能和iOS7及以下系统的UIWebView共存。
  如果你想发布一个同时支持WKWebView和UIWebView的应用,iOS7以下使用UIWebView,iOS8使用WKWebView,苹果会拒绝你的发布。也就是说,如果你想使用WKWebView,就必须抛弃iOS8以下的系统。

六、delegate方法的不同

1.代理方法概述:
 UIWebView支持的代理是UIWebViewDelegate,WKWebView支持的代理是WKNavigationDelegate和WKUIDelegate。WKNavigationDelegate主要实现了涉及到导航跳转方面的回调方法。WKUIDelegate主要实现了涉及到界面显示的回调方法:如WKWebView的改变和js相关内容。
  
2.所有代理方法:

#pragma mark - WKUIDelegate


//WKWebVie截获JS的输入框,交由本地控件来实现,最后将输入结果通过block回调给网页

- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt

    defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame

    completionHandler:(void (^)(NSString *result))completionHandler

{

    completionHandler(@"返回结果");

}


//WKWebVie截获JS的选择框,交由本地控件来实现,最后将选择结果通过block回调给网页

- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message

  initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler

{

    completionHandler(YES);

}


//WKWebVie截获JS的确认框,交由本地控件来实现,最后将确认点击结果通过block回调给网页

- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message

  initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler

{

    completionHandler();

}


//网页要跳转到新的窗口来展示网页,WKWebView拦截,有我们来确定显示。

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration

   forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures

{

    return nil;

}


#pragma mark - WKNavigationDelegate


//这个代理方法表示当客户端收到服务器的响应头,根据response相关信息,可以决定这次跳转是否可以继续进行。

- (void)webView:(WKWebView *)webView

  decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse

  decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler

{

    decisionHandler(WKNavigationResponsePolicyAllow);

}


//根据webViewnavigationAction相关信息决定这次跳转是否可以继续进行,这些信息包含HTTP发送请求,如头部包含User-Agent,Accept

- (void)webView:(WKWebView *)webView

  decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction

  decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler

{

    decisionHandler(WKNavigationActionPolicyAllow);

}


//一个Main Frame开始显示时调用

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

{

    

}


//Main Frame收到服务器的重定向请求是调用

- (void)webView:(WKWebView *)webView

    didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation

{

    

}


//Main Frame开始加载数据,发生错误时调用

- (void)webView:(WKWebView *)webView

    didFailProvisionalNavigation:(WKNavigation *)navigation

    withError:(NSError *)error

{

    

}


//Main Frame的内容开始到达时调用

- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{

    

}


//当完成一个Main Frame加载时调用

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{

    

}


//当一个完成加载的MainFrame发生错误时调用

- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error

{

    

}


//处理证书相关的东西

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

{

    

}


部分内容转自:http://blog.csdn.net/cyforce/article/details/37657009
0 0
原创粉丝点击