首页 > 白话Cocoa > 浏览器开发第一篇,NSWebView的基本介绍与使用

浏览器开发第一篇,NSWebView的基本介绍与使用

WebKit是开源的Web浏览器引擎,苹果的Safari是基于这个框架来开发的。

下面用一个demo来说明一下主要的api接口,demo如下图所示。该demo已经包含了基本的功能,前进,后退,刷新,回车访问url,点击Go按钮访问url,在标题栏显示网站的title等

0b054a222f57a8227815c392dd682903

实现该demo,

一、首先要引入WebKit.framework。并且在头文件引入#import <WebKit/WebKit.h>

二、从Library面板拉一个web view控件,在程序创建该web view控件的object,比如名字为webView,并通过IBOutlet关联起来。通过发送下面的消息让web view控件加载一个网页。
[[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlText]]];
至此,web view控件就可以展示网页了。也就是说只要一行代码就可以简单实现一个浏览器展示页面的功能。

三、跟踪web view整个loading的过程,用到WebFrameLoadDelegate

1、加载过程:
在一个访问一个网页的的整个过程,包括开始加载,加载标题,加载结束等。webkit都会发送相应的消息给WebFrameLoadDelegate 。

  • webView:didStartProvisionalLoadForFrame:—开始加载,我们可以在这里获取加载的url,并展示出来;
  • webView:didReceiveTitle:forFrame:—获取到网页标题
  • webView:didFinishLoadForFrame:—加载完成,我们可以在这里设置前进后退按钮的状态

2、错误的处理:
另外,加载的过程当中,有可能会发生错误。错误的消息也会发送给WebFrameLoadDelegate 。我们可以在这两个函数里面对错误信息进行处理

  • webView:didFailProvisionalLoadWithError:forFrame: 这个错误发生在请求数据之前,最常见是发生在无效的URL或者网络断开无法发送请求
  • webView:didFailLoadWithError:forFrame: 这个错误发生在请求数据之后

3、显示loading状态:
另外,网页只有在加载完成后,才会被展示出来。加载过程如果很久的话,会一片空白然后才出来网页。为了让我们的网页更加人性化,可以在webView:didStartProvisionalLoadForFrame:加一些loading的状态

四、处理加载策略,用到WebPolicyDelegate

webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener: 在safari浏览器,对于网页里面有target=_blank的链接,默认行为是点击后会弹出新的标签窗口。如果在我们的webView控件里面点击此类链接的时候,会触发该消息并会发送给WebPolicyDelegate,然后我们可以在这里控制对该事件的处理。比如我们可以使用我们自定义的控件打开该url。

另外:前进,后退,刷新等按钮的事件,可以直接绑定到webview控件的事件,而不需要我们自己写事件去处理

f4895acac71b460c67e58d2213ffb8ed

源代码:

https://github.com/helloitworks/NSWebView

上面讲到的内容非常地基础跟简单,想要了解更多的内容,请看参考资料。

参考资料:
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DisplayWebContent/DisplayWebContent.html%23//apple_ref/doc/uid/10000164-SW1
https://developer.apple.com/library/mac/documentation/cocoa/Reference/WebKit/Classes/WebView_Class/Reference/Reference.html

(转载本站文章请注明出处 www.helloitworks.com ,请勿用于任何商业用途)

分类: 白话Cocoa 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.