WKWebView概述

一、概述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CoreData 自定义数据类型

在CoreData中,Entity中Attribute的类型只有固定的几种可选。如下图: 如果我们要想直接存放UIImage到数据库,如何做? 1.在coredata中新建的attribute中类形选择Transformable. 意思表示这个字段是自定义的类型。 2.在生成的NSMana…

XMLDictionary iOS的XML处理包

1.概述:XMLDictionary 提供一种简单的方法实现 iOS 和 Mac OS X 下解析和生成 XML 的方法。XMLDictionary 将 XML 转成 NSDictionary ,也可以将 NSDictionary 装成 XML 结构的字符串。2.实现原理:XMLDictionary 使用 NSXMLParser 类解析XML,使…

CoreData并发操作模式简介

iOS5.0中,苹果为CoreData的并发处理添加了两个内容。一、首先介绍第一个内容:CoreData框架中的NSManagedObjectContext类增加新的初始化方法:initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct;1.参数方法介绍:…

java图片的导出,并压缩

java图片的导出,并压缩 java 压缩包jar包使用的是commons-compress-1.6.jar /*** 导出图片* param request* param response*/RequestMapping("/exportPicture")public void exportPicture(HttpServletRequest request,HttpServletResponse response) throws Exce…

【Linux系统基础】(3)在Linux上部署运维监控Zabbix和Grafana

目录 运维监控Zabbix部署简介安装安装前准备 - Mysql安装Zabbix Server 和 Zabbix Agenta. 安装Zabbix yum库b. 安装Zabbix Server、前端、Agentc. 初始化Mysql数据库d. 为Zabbix Server配置数据库e. 配置Zabbix的PHP前端 配置zabbix 前端(WEB UI) 运维监…

Pods简介

每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如 Java 语言的 Maven,nodejs 的 npm。随着 iOS 开发者的增多,业界也出现了为 iOS 程序提供依赖管理的工具,它的名字叫做:CocoaPods。 CocoaPods项目…

HashMap源码解释

HashMap 前言: 本文的hashMap是基于jdk1.7的hashMap. 关于jdk1.8的hashMap在另一篇中,那里将会介绍与1.7的差异与优势 首先基础知识介绍: 1.HashMap的成员变量   int DEFAULT_INITIAL_CAPACITY 16&#xff1a;默认的初始容量为2 ^ 4   int MAXIMUM_CAPACITY 1 <<…

MagicRecord For IOS 简介

一、概述 MagicalRecord 灵感来自于简洁的Ruby语言中 Rails Active Record 查询方式. MagicalRecord 这个开源库的核心思想是: 1.清除 Core Data 相关的代码2.简洁的清除,简单的一行搜索记录的功能3.当然允许使用NSFetchRequest,当存在着复杂的搜索条件时 二、使用 1. 导入框架…

对象引用 String引用 基本类型引用 差别

最近遇到一个线上问题,原因是忽略的引用的一些语法,导致出错,现在记录一下: Testpublic void testList(){List<String> list new ArrayList<String>();list.add("1");list.add("2");list.add("3");List<String> list2 new …

Mantle For iOS

Mantle可以很方便的去书写一个模型层的代码。 使用它可以很方便的去反序列化JSON或者序列化为JSON(需要在MTLModel子类中实现<MTLJSONSerializing>协议) 使用一个解释器MTLJSONAdapter去转换模型对象。 NSError *error nil; MyObject *myObject [MTLJSONAdapter modelO…

String的split方法的使用

1.引言 split方法很常用,记得我入职公司的时候,第一道笔试题就是关于字符串的拆分拼装等,这也足以说明,大公司对这些方法的重视程度. 其实我们平时一般用到的都是这些方法最简单的用法,但如果你不了解他的实现原理,碰到某些特殊问题终究是会被卡住的,于是就产生了所谓的bug,而…

ReactiveCocoa入门

概述 为什么要使用RAC&#xff1f;一个怪怪的东西&#xff0c;从Demo看也没有让代码变得更好、更短&#xff0c;相反还造成理解上的困难&#xff0c;真的有必要去学它么&#xff1f;相信这是大多数人在接触RAC时的想法。RAC不是单一功能的模块&#xff0c;它是一个Framework&am…

[前台]---input标签中的hidden,浏览器差异问题

前言: 这是一个比较简单的问题,也有人犯过这样的错误,如果你是一个人在编码,并且没有专门的去测试浏览器差异,这个或许会坑到你 问题描述: 用input标签的时候,需要把这个input隐藏掉,于是先这样做: <input hidden id"xxx" value"xxx"/> 这行代码…

C++和Objective-C混编(官方文档翻译)

苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C和Objective-C&#xff0c;混编后的语言叫Objective-C。有了它&#xff0c;你就可以在Objective-C应用程序中使用已有的C类库。 Build Setting中要设定编译文件类型设置&#xff0c;如下图&#xff1a;Objectiv…

SpringMVC获取response的问题

SpringMVC获取response的问题: 关于用以下这种方式获取response的一些问题: ((ServletWebRequest) RequestContextHolder.getRequestAttributes()).getResponse(); 网上对于这种方式获取response的描述很多,我用的是jar包版本是3.2.9.release web.xml中肯定也是加了Request…

BigDecimal的个人总结

前言: 互联网公司,对于BigDecimal的使用,还是较为频繁的,那么就会涉及到关于这个类型的种种问题. 1:为什么使用BigDecimal 首先java八大基本类型真的很基本,4个整型搞不了小数,double和float搞的了小数,但搞不好,关键时刻就调链子,当然这也和他们存储方式有关(二进制无法精确的…

MagicRecord For IOS API深层解析

一、NSManagedObjectContext创建和获取1.默认上下文(每种只存在一个)&#xff08;1&#xff09;MR_rootSavingContext&#xff1a;此方法返回的上下文类型为NSPrivateQueueConcurrencyType(后台线程)&#xff0c;直接关联持久化协调器&#xff0c;对此上下文对象执行保存方法&a…

BeanUtils.copyProperties(对象A,对象B)

对于两个实例的复制,如果属性名字相同,则可以通过这个方法来操作,但是在使用的时候,一定要注意BeanUtils用的是哪个包的,因为常用的两个包,都有这个类和对应的方法,而复制方向却相反,所以一定要注意自动导包时选择的包!!!!!! 1.import org.springframework.beans.BeanUtils 这…

Xcode中的-ObjC和-all_load

有时候使用第三方库的时候&#xff0c;需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志。 之所以使用该标志&#xff0c;和Objective-C的一个重要特性&#xff1a;类别&#xff08;category)有关。根据这里的解释&#xff0c;Unix的标准静态库实现和Object…

[前台]---ajax返回200成功,却进入error函数的解决方法

最近碰到一个问题,就是如题目所说,ajax在调用的时候,明明返回成功了,但js代码却走到了error中,最后发现是我返回的json格式不对,jQuery在1.4后,对ajax返回的json格式有了很强的限制,所以一定要用严格的JSON格式返回. 先上代码: jQuery.ajax({type: "POST",async: tr…