[转]WebKit in iOS 8

标签: | 发表时间:2015-03-04 21:13 | 作者:jinglijun
出处:http://blog.csdn.net/jinglijun

让我们说说iOS 8 的WebKit吧。WWDC 2014前几天,就有人发现了苹果向WebKit开源项目提交了一些很令人兴奋的代码,暗示了OS X和iOS,特别是iOS上的WebKit架构有所变化。果不其然,WWDC上公布了iOS的新框架WebKit.framework,正式推出了新的网页浏览控件WKWebView。

曾经的UIWebView

WebKit在给人的印象,是一个浏览引擎,貌似只是和网页有关,其实在OS X和iOS上,多于一行的文字渲染,都和WebKit有关。浏览网页,在iOS上,使用的是UIKit.framework的UIWebView;在OS X上,使用的是WebKit.framework的WebView。

更多细节不讨论,但让人最不解的就是,到底受限于什么条件,苹果在推出iOS的时候,封装了一个貌似很简洁,其实功能受限、效率低下的UIWebView。我揣摩了一下苹果的小心眼,当时得出的结论是:

  • 一个高度封装、接口简单的API,很符合苹果的风(niao)格(xing):「Stay foolish!」。千万不要以为这是句激励的话,其实是说,你们这些开发者用就行了,关心那么多的细节干什么。就像对待iPhone用户一样,系统升级我都帮你们做好了,你们何必关心刷机这种无意义的事情!
  • 保持Safari的领先优势,这种优势体现在私有API和JIT上。Safari不使用UIWebView,使用的是UIWebBrowserView和UIScrollView(实际上UIWebView就是这两者的封装),但也属于UIKit.framework,在进程模型、页面渲染方面,并没有和UIWebView有本质的区别。第三方浏览器,开启JIT是无望了,但大量功能的缺失,都是通过使用私有API来弥补,实际上并无太大区别。

iOS 8 的WKWebView

Anders Carlsson,Safari以及WebKit工程师,也是这一次「Introducing the Modern WebKit API」的主讲人,一上来就说,总有开发者,特别是iOS平台上的,向他们抱怨说,开发者需要一个功能更加强大的网页浏览控件,然后,他们就推出了「The Modern WebKit API」。(「Modern」这个词,简直用得出神入化,惊天地泣鬼神,很好体现了苹果的壕气。)

具体有什么变化呢:

  1. OS X和iOS使用统一的framework和WKWebView,意味着可移植性提高了,也意味着iOS上开放了更多的API。
  2. 更好的性能,如对网页滑动的响应。
  3. 更好的JavaScript引擎。4倍?反正很少人在意苹果广告语中提到的数字。
  4. 内置前进后退手势。
  5. 更有效的JS和App的交互。
  6. 最重头的,新的多进程模型。

API

苹果终于想通了一个事情:OS X上的WebView,功能很强大,可惜没人用,第三方浏览器用的都是自己的引擎,因此无法上架AppStore,可是谁在意呢;iOS上的UIWebView,功能少得不忍直视,用自家的引擎嘛,又上不了AppStore。而在iOS平台,能否上架AppStore,可是事关生死的事情,这点连Chrome都不得不低头。

从公开的 API来看,之前开发者面对的是UIWebView只是一个头文件,现在面对的是一整个framework。大致浏览了下功能,相比于iOS的UIWebView,功能增强了一个Level;相比于OS X的WebView,功能缺失了一个Level。扯平了。

今天我用之前的Demo,将UIWebView替换成WKWebView,基本可以无缝替换。那么相比于UIWebView,WKWebView还开放了什么呢?

1、基本属性:网页加载进度(estimatedProgress加载进度条,在IOS8之前我们是通过一个假的进度条来实现)、网页标题,这些网页的最最基本的属性,终于齐了、backForwardList表示historyList、WKWebViewConfiguration *configuration;初始化webview的配置。

2、前进后退手势:在UIWebView实现过这个功能的我,深知此功能之复杂,当看到这个的时候,整个人都鸟肌了。

3、WKPreferences:对应WebView的WebViewPreference,相比UIWebView,增加了禁用JavaScript功能,但没有无图模式,差评。

4、WKUserContentController:JS通讯相关,App注入JS时,可以指定时机(加载开始或加载结束)和范围(MainFrame或所有Frame);另外内置JS Bridge。

5、WKProcessPool:和多进程模型相关,目前功能未知。

6、WKBackForwardList:前进后退列表,良心好评。

7、WKNavigationDelegate:类似于WebView里的WebFrameLoadDelegate,功能稍稍阉割了下,但基本能用。

8、WKUIDelegate:UI相关的回调。如新窗口打开、页面alert弹框等的处理回调。

9、增加初始化方法:

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

10、跳到历史的某个页面

   -(WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item;

11、相同的属性和方法

goBack、goForward、canGoBack、canGoForward、stopLoading、loadRequest、scrollView

12、被删去的属性和方法:

1、- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

在跟js交互时,我们使用这个API,目前WKWebView完档没有给出实现类似功能的API

2、无法设置缓存

在UIWebView,使用NSURLCache缓存,通过setSharedURLCache可以设置成我们自己的缓存,但WKWebView不支持NSURLCache

13、delegate方法的不同

UIWebView支持的代理是UIWebViewDelegate,WKWebView支持的代理是WKNavigationDelegate和WKUIDelegate

WKNavigationDelegate主要实现了涉及到导航跳转方面的回调方法

WKUIDelegate主要实现了涉及到界面显示的回调方法:如WKWebView的改变和js相关内容

具体来说WKNavigationDelegate除了有开始加载、加载成功、加载失败的API外,还具有额外的三个代理方法:

- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation</span>


这个代理是服务器redirect时调用

2、

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler

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

3.

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler

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


更多细节,可以查看 WebKit Objective-C Framework Reference


总的来说,苹果鼓起勇气,第一次开放了如此多的接口,但却仍然不够彻底。这些功能,在UIWebView时代,都可以用私有API解决;而使用了WKWebView之后,在某些方面,依然显得不够用的样子——比方说HTTP和HTTPS验证,仍然没有公开接口可以处理;另外WebResourceLoadDelegate的缺失,也是一大痛点。

  iOS8 beta3 更新Webkit.framework,如下:

  1. 同步调用的JS接口。和-[UIWebView stringByEvaluatingJavaScriptFromString:]相比,JS结果是异步而非同步返回的,返回结果为id而非NSString。
  2. WKNavigationDelegate增加了验证回调接口,可以解决HTTP和HTTPS验证问题

性能

待续

多进程模型

待续

效果图:


二:


源码下载

参考

WKWebView (推荐)


WebKit Objective-C Framework Reference

Introducing the Modern WebKit API

GitHub/WebKit

作者:jinglijun 发表于2015/3/4 13:13:04 原文链接
阅读:60 评论:1 查看评论

相关 [webkit in ios] 推荐:

[转]WebKit in iOS 8

- - justinjing的专栏
让我们说说iOS 8 的WebKit吧. WWDC 2014前几天,就有人发现了苹果向WebKit开源项目提交了一些很令人兴奋的代码,暗示了OS X和iOS,特别是iOS上的WebKit架构有所变化. 果不其然,WWDC上公布了iOS的新框架WebKit.framework,正式推出了新的网页浏览控件WKWebView.

反webkit之战

- - 前端观察
历史总是在某个时候重演,这部,IE6离开历史舞台(国外,市场份额不足1%了)之后,webkit内核的浏览器成了大家的心腹大患,于是各种口诛笔伐开始了,甚至比当年打击IE6更甚. 但是现在情况发生了很大的改变,IE6死了,而另一个垄断者webkit来了:. 最近几年,webkit在apple的带领下发展很快,对W3C标准的支持方面一直在和opera/firefox赛跑.

翻译:WebKit for Developers

- - TaoBaoUED
Paul Irish 大湿为我们带来了这篇开年大作,文章深入浅出的阐述了各 Webkit port 的迥异,文笔细腻,是一篇不可多得的 Webkit 入门开胃菜. 为了让大家第一时间更好的品尝这道大菜,一丝特别邀请了几位 Webkit 专业开发人士作为本文的翻译顾问,在此表示由衷的感谢. 原文链接:  http://paulirish.com/2013/webkit-for-developers/.

轮回? webkit系的滤镜

- - 博客园_Ruby's Louvre
伟大的IE5.5团队创造性地为浏览器带来N多东西,把网影打得落花流水的同时,也让微软可以有肆无恐地十年不更新IE6了. 它留下的瑰宝之一CSS滤镜,也因为自身的原因与CSS3的崛起,处境尴尬. 然而即便如此,我们也少不了它,如alpha滤镜,实现透明效果,AlphaImageLoader滤镜让IE支持png透明,blur滤镜模拟CSS3盒阴影,更NB的是其矩阵滤镜,完全可以用来实现CSS3 transform 2D!其实CSS3的许多效果何尝不是对IE滤镜的再实现.

浏览器内核WebKit编年史

- belltoy - 月光博客
  回首六年前,2005年,网络和现在完全不同. 那时,浏览器大战已告尾声,虽然Netscape战斗英勇,但微软和Internet Explorer 的地位看起来越来越稳固. 看起来互联网正要落入这个邪恶帝国手上,还有一点,地球人已经阻止不了微软了.   然后在2005年6月7日,在WWDC上,Bertrand Serlet走上讲演台推出了并不被人看好的产品——苹果的浏览器的灵魂——Safari,它是开源产品.

Webkit 下的模拟点击问题

- - 芒果小站
这几天都在抢天猫的金砖,用火狐的 console 面板,通过 setInterval 定时执行点击模拟,大家都用的很爽. 不过发现 Chrome 下并不奏效,后来发现以下问题:. input 和 button 可以使用 document.getElementById(“J_Lucky”).click(); 并且是全兼容的,支持触发通过 onclick/addEventListener/attachEvent 等形式绑定的事件.

webkit webApp 开发技术要点总结

- - ITeye博客
如果你是一名前端er,又想在移动设备上开发出自己的应用,那怎么实现呢. 幸好,webkit内核的浏览器能帮助我们完成这一切. 接触 webkit webApp的开发已经有一段时间了,现把一些技巧分享给大家 :. 对于桌面浏览器,我们都很清楚viewport是什么,就是出去了所有工具栏、状态栏、滚动条等等之后用于看网页的区域,.

微软称 WebKit 破坏 Web 标准

- - ITeye资讯频道
这可能是微软做过的最奇怪和最具有反讽意味的事情,近日 微软 警告Web开发者不要使用WebKit,它认为WebKit是新的IE6,会导致Web开放标准和创新停滞. WebKit是移动平台上最流行的浏览器核心引擎,占据了九成的市场份额. 微软Windows Phone开发者博客 指出,大多数移动网站只支持Android和iOS平台的WebKit特定前缀,以圆角为例,WebKit的CSS圆角实现需要使用属性-webkit-border-radius,而未来的标准可能采用的将是border-radius.

苹果推迟发布LGPL WebKit源代码

- Mao - Solidot
苹果在KHTML项目基础上创建了WebKit分支,它是Safari浏览器的核心渲染引擎. KHTML采用授权协议是LGPL,因此WebKit也必须在LGPL下发布源代码. 苹果过去一直认真的遵循协议的要求,在更新后及时的向社区提供源代码. 然而,过去几个月苹果却推迟公开WebKit源代码,自三月份后苹果两次更新iOS版浏览器都没有反馈源代码.