iOS 中的UIWebView 和webkit 的联系使用

 1. 0 目录       

  WebKit在给人的印象,是一个浏览引擎,貌似只是和网页有关,其实在OS X和iOS上,多于一行的文字渲染,都和WebKit有关。浏览网页,在iOS上,使用的是UIKit.framework的UIWebView;在OS X上,使用的是WebKit.framework的WebView。 uivebView 对webKit 经一部的进行封装。UIWebVIew 是webkit 和JavaScript的分装

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

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

 2.0  在UIWebView中调用 JavaScript

 UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS中与UIWebView中的网页元素交互。

stringByEvaluatingJavaScriptFromString

    使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用。我们在界面上拖放一个UIWebView控件。在Load中将google mobile加载到这个控件中,代码如下:

- (void)viewDidLoad
{
[super viewDidLoad];
webview.backgroundColor
= [UIColor clearColor];
webview.scalesPageToFit
=YES;
webview.
delegate =self;
NSURL
*url =[[NSURL alloc] initWithString:@"http://www.google.com.hk/m?gl=CN&hl=zh_CN&source=ihp"];

NSURLRequest
*request = [[NSURLRequest alloc] initWithURL:url];
[webview loadRequest:request];
}

我们在webViewDidFinishLoad方法中就可以通过javascript操作界面元素了。

1、获取当前页面的url。

- (void)webViewDidFinishLoad:(UIWebView *)webView {  
NSString
*currentURL = [webView stringByEvaluatingJavaScriptFromString:@"document.location.href"];
}

2、获取页面title:

- (void)webViewDidFinishLoad:(UIWebView *)webView {  
NSString
*currentURL = [webView stringByEvaluatingJavaScriptFromString:@"document.location.href"];

NSString
*title = [webview stringByEvaluatingJavaScriptFromString:@"document.title"];
}

3、修改界面元素的值。

    NSString *js_result = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByName('q')[0].value='朱祁林';"];

4、表单提交:

        NSString *js_result2 = [webView stringByEvaluatingJavaScriptFromString:@"document.forms[0].submit(); "];

这样就实现了在google搜索关键字:“朱祁林”的功能。

5、插入js代码

上面的功能我们可以封装到一个js函数中,将这个函数插入到页面上执行,代码如下:

         [webView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');"  
"script.type = 'text/javascript';"
"script.text = \"function myFunction() { "
"var field = document.getElementsByName('q')[0];"
"field.value='朱祁林';"
"document.forms[0].submit();"
"}\";"
"document.getElementsByTagName('head')[0].appendChild(script);"];

[webView stringByEvaluatingJavaScriptFromString:
@"myFunction();"];

看上面的代码:

a、首先通过js创建一个script的标签,type为'text/javascript'。

b、然后在这个标签中插入一段字符串,这段字符串就是一个函数:myFunction,这个函数实现google自动搜索关键字的功能。

c、然后使用stringByEvaluatingJavaScriptFromString执行myFunction函数。

 iOS8 产生了新的MKWebview

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. 基本属性:网页加载进度、网页标题,这些网页的最最基本的属性,终于齐了。
  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弹框等的处理回调。

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

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

2014.7.8 iOS8 beta3 更新Webkit.framework,如下:

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

性能

待续

多进程模型

待续

参考

WebKit Objective-C Framework Reference

Introducing the Modern WebKit API

GitHub/WebKit

原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

转载请注明出处:http://www.hotobear.com/

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值