天天看点

iOS 8:二、WKWebView VS UIWebView

#一、UIWebView

通过使用UIWebView控件,可以实现一个内置的浏览器(类似于Safari),而且可以直接将这个浏览器内嵌到应用的任意位置;UIWebView直接继承了UIView基类。

##1、UIWebView常用属性

  • (1)、 @property (nonatomic, assign) id < UIWebViewDelegate > delegate;
    设置遵循UIWebViewDelegate协议的代理;
               
  • (2)、 @property (nonatomic, readonly, retain) UIScrollView *scrollView NS_AVAILABLE_IOS(5_0);
    UIWebView内镶的UIScrollView控件;
               
  • (3)、 @property (nonatomic, readonly, retain) NSURLRequest *request;
    UIWebView的request请求属性;从这里可以获取Webview加载的request的一系列属性;
               
  • (4)、 - (void)reload;
    重新刷新数据;
               
  • (5)、 - (void)stopLoading;
    停止刷新数据;
               
  • (6)、 - (void)goBack;
    返回上一页;
               
  • (7)、 - (void)goForward;
    进入下一页;
               
  • (8)、 @property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;
    判断是否能够返回上一页,只读属性;
               
  • (9)、 @property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;
    判断是否能够进入下一页,只读属性;
               
  • (10)、 @property (nonatomic, readonly, getter=isLoading) BOOL loading;
    判断是否正在加载数据,只读属性;
               
  • (11)、 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
    UIWebView与JS进行交互;在webViewDidFinishLoad方法中就可以通过javascript操作界面元素了。
               

例如:

①、获取url

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

②、获取页面title

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

③、修改界面元素的值

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

④、表单提交

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSString *js_result2 = [webView stringByEvaluatingJavaScriptFromString:@"document.forms[0].submit(); "];
}
           
  • (12)、 @property (nonatomic) BOOL scalesPageToFit;
    自动对页面进行缩放以适应屏幕;默认值为NO,用户不可以放大或缩小页面;如果设置为YES,页面可以通过放大缩小去适应,用户也可以通过手势来放大和缩小;
               
  • (13)、 @property (nonatomic) BOOL detectsPhoneNumbers NS_DEPRECATED_IOS(2_0, 3_0);
    自动检测网页上的电话号码,单击可以拨打;
               
  • (14)、 @property (nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS(3_0);

该属性支持如下枚举值

typedef NS_OPTIONS(NSUInteger, UIDataDetectorTypes) {
    UIDataDetectorTypePhoneNumber   = 1 << 0,//自动检测网页上的电话号码,点击该号码就会拨号;
    UIDataDetectorTypeLink          = 1 << 1,//自动检测网页上的超链接,点击该链接就会导航到链接对应的页面;
#if __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
    UIDataDetectorTypeAddress       = 1 << 2,//自动检测网页上的地址
    UIDataDetectorTypeCalendarEvent = 1 << 3,//自动检测网页上的日历事件
#endif
    UIDataDetectorTypeNone          = 0,     //不检测网页上的任何内容
    UIDataDetectorTypeAll           = NSUIntegerMax//自动检测网页上的所有特殊内容
};
           
  • (15)、 @property (nonatomic) BOOL allowsInlineMediaPlayback NS_AVAILABLE_IOS(4_0); // iPhone Safari defaults to NO. iPad Safari defaults to YES
    默认使NO。这个值决定了用内嵌HTML5播放视频还是用本地的全屏控制。 为了内嵌视频播放,不仅仅需要在这个页面上设置这个属性,还必须的是在HTML中的video元素必须包含webkit-playsinline属性;
               
  • (16)、 @property (nonatomic) BOOL mediaPlaybackRequiresUserAction NS_AVAILABLE_IOS(4_0); // iPhone and iPad Safari both default to YES
    在iPhone和iPad上默认使YES。这个值决定了HTML5视频可以自动播放还是需要用户去启动播放;
               
  • (17)、 @property (nonatomic) BOOL mediaPlaybackAllowsAirPlay NS_AVAILABLE_IOS(5_0); // iPhone and iPad Safari both default to YES
    这个值决定了从这个页面是否可以Air Play;
               
  • (18)、 @property (nonatomic) BOOL keyboardDisplayRequiresUserAction NS_AVAILABLE_IOS(6_0); // default is YES
    这个值决定了网页内容的渲染是否在把内容全部加载到内存中再去处理。 如果设置为YES,只有网页内容加载到内存里了才会去渲染;
               

##2、UIWebView加载数据

  • (1)、 - (void)loadRequest:(NSURLRequest *)request;

    异步加载内容,可以从服务器和本地读取

①、加载本地的pdf文件

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL *url = [[NSBundle mainBundle]URLForResource:@"Book.pdf" withExtension:nil];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
}
           

②、加载本地txt文件

- (void)viewDidLoad {
    [super viewDidLoad];
    //加载txt
    NSURL *url = [[NSBundle mainBundle]URLForResource:@"Book.txt" withExtension:nil];
    //设置Url
    [self.webView loadRequest:[NSURLRequest requestWithURL:url]];
}
           

③、加载Word

- (void)viewDidLoad {
    [super viewDidLoad];
    //加载Word
    NSURL *url = [[NSBundle mainBundle]URLForResource:@"Book.docx" withExtension:nil];
    //设置加载Url
    [self.webView loadRequest:[NSURLRequest requestWithURL:url]];
}
           

④、加载网络数据

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    [self.webView loadRequest:request];
}
           
  • (2)、 - (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;

加载并显示HTML字符串;

①、直接拼接Html,用UIWebView显示

- (void)viewDidLoad {
    [super viewDidLoad];
    //直接加载Html字符串
    NSString *[email protected]"<html><head><title>Html加载</title></head><body>HtmlDemo-FlyElephant</body></html>";
    [self.webView loadHTMLString:htmlStr baseURL:nil];
}
           

②、加载本地的Html网页

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Book" ofType:@"html"];
    NSString *htmlString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    [self.webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:filePath]];
}
           
  • (3)、 - (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;

①、加载pdf

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle]pathForResource:@"Book.pdf" ofType:nil];
    //以二进制的形式加载数据
    NSData *data = [NSData dataWithContentsOfFile:path];
    [self.webView loadData:data MIMEType:@"application/pdf" textEncodingName:@"UTF-8" baseURL:nil];
}
           

##3、UIWebViewDelegate协议

#pragma mark - UIWebViewDelegate
           
  • ①、- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
    该UIWebView将要开始装载指定URL对应的网页时激发该方法;
               
  • ②、- (void)webViewDidStartLoad:(UIWebView *)webView;
    该UIWebView开始加载时激发该方法;
               
  • ③、- (void)webViewDidFinishLoad:(UIWebView *)webView;
    该UIWebView加载完成时激发该方法;
               
  • ④、- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
    该UIWebView装载响应出现错误时激发该方法;
               

#二、WKWebView

webkit使用WKWebView来代替IOS的UIWebView和OSX的WebView,并且使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safari一样快。很好的解决的UIWebView存在的内存、加载速度等诸多问题;

优点:加载速度 比UIWebView提升差不多一倍的, 内存使用上面,反而还少了一半;

缺点:WKWebView 不支持缓存 和 NSURLProtocol 拦截了;

##1、WKWebView新特性

  • ①、在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度和开源中国网站时,WKWebView占用23M,而UIWebView占用85M);
  • ②、允许JacaScript的Nitro库加载并使用(UIWebView中限制);
  • ③、支持了更多的HTML5特性;
  • ④、高达60fps的滚动刷新率以及内置手势;
  • ⑤、将UIWebViewDelegate与UIWebView重构成了14类与3个协议;

##2、WKWebView基本属性

  • (1)、 @property (nonatomic, readonly, copy) WKWebViewConfiguration *configuration;
    初始化webView的配置;
               
  • (2)、@property (nonatomic, weak) id < WKNavigationDelegate > navigationDelegate;
    设置遵循WKNavigationDelegate协议的代理;
               
  • (3)、 @property (nonatomic, weak) id UIDelegate;
    设置遵循WKUIDelegate协议的代理;
               
  • (4)、 - (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
    根据webView的相关配置,进行初始化;
               
  • (5)、 - (WKNavigation *)loadRequest:(NSURLRequest *)request;
    同UIWebView,异步加载内容,可以从服务器和本地读取;
               
  • (6)、 - (WKNavigation *)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;
    同UIWebView,加载并显示HTML字符串;
               
  • (7)、 - (WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item;
    跳转到某个历史页面;
               
  • (8)、 @property (nonatomic, readonly, copy) NSString *title;
    获取WKWebView的标题,只读属性;
               
  • (9)、 @property (nonatomic, readonly, copy) NSURL *URL;
    获取WKWebView加载的url,只读属性;
               
  • (10)、 @property (nonatomic, readonly, getter=isLoading) BOOL loading;
    判断是否正在加载,只读属性;
               
  • (11)、 @property (nonatomic, readonly) double estimatedProgress;
    数据加载进度条,只读属性;
               
  • (12)、 @property (nonatomic, readonly) BOOL canGoBack;
    判断是否能够返回上一页;
               
  • (13)、 @property (nonatomic, readonly) BOOL canGoForward;
    判断是否能够进入下一页;
               
  • (14)、 - (WKNavigation *)goBack;
    返回上一页;
               
  • (15)、 - (WKNavigation *)goForward;
    进入下一页;
               
  • (16)、 - (WKNavigation *)reload;
    重新加载数据;
               
  • (17)、 - (void)stopLoading;
    停止加载页面;
               
  • (18)、 - (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *))completionHandler;

    执行脚本,其中参数为:

    • ①、javaScriptString:调用js的方法,并传值;
    • ②、completionHandler:如果调用js代码出错,可以在此处处理;

##3、WKNavigationDelegate

  • (1)、页面跳转的代理,方法有三种,分为(收到跳转与决定是否跳转两种)
    • ①、- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
      在发送请求之前,决定是否跳转;
                 
    • ②、 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
      在收到响应后,决定是否跳转;
                 
    • ③、 - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
      接收到服务器跳转请求之后调用;
                 
  • (2)、追踪加载过程(页面开始加载、加载完成、加载失败)
    • ①、 - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
      页面开始加载时调用;
                 
    • ②、 - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error;
      页面加载失败时调用;
                 
    • ③、 - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
      当内容开始返回时调用;
                 
    • ④、 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
      页面加载完成时调用;
                 

##4、WKUIDelegate协议

  • ①、 - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
    创建一个新的webView;
               
  • ②、 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler;
    web界面中有弹出警告框时调用;
      /**
      	 *  web界面中有弹出警告框时调用
      	 *
      	 *  @param webView          实现该代理的webview
      	 *  @param message          警告框中的内容
      	 *  @param frame              主窗口
      	 *  @param completionHandler 警告框消失调用
       */
               
  • ③、 - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
    /**
      	 *  web界面中有弹出确认框时调用
      	 *
      	 *  @param webView          实现该代理的webview
      	 *  @param message          警告框中的内容
      	 *  @param frame            主窗口
      	 *  @param completionHandler 确认框消失调用
       */
               
  • ④、 - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *result))completionHandler;
    /**
      	 *  web界面中有弹出输入框时调用
      	 *
      	 *  @param webView          实现该代理的webview
      	 *  @param prompt           输入框内容
      	 *  @param defaultText      输入框内容
      	 *  @param frame            主窗口
      	 *  @param completionHandler 输入框消失调用
       */
               

继续阅读