一、整体介绍

UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView。通过简单的测试即可发现UIWebView占用过多内存,且内存峰值更是夸张。WKWebView网页加载速度也有提升,但是并不像内存那样提升那么多。下面列举一些其它的优势:

  • 更多的支持HTML5的特性
  • 官方宣称的高达60fps的滚动刷新率以及内置手势
  • Safari相同的JavaScript引擎
  • 将UIWebViewDelegate与UIWebView拆分成了14类与3个协议(官方文档说明)
  • 另外用的比较多的,增加加载进度属性:estimatedProgress

二、UIWebView使用说明

1 举例:简单的使用

UIWebView使用非常简单,可以分为三步,也是最简单的用法,显示网页

  1. - (void)simpleExampleTest {
  2. // 1.创建webview,并设置大小,"20"为状态栏高度
  3. UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height - )];
  4. // 2.创建请求
  5. NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.cnblogs.com/mddblog/"]];
  6. // 3.加载网页
  7. [webView loadRequest:request];
  8.  
  9. // 最后将webView添加到界面
  10. [self.view addSubview:webView];
  11. }

2 一些实用函数

  • 加载函数。
  1. - (void)loadRequest:(NSURLRequest *)request;
  2. - (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
  3. - (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;

UIWebView不仅可以加载HTML页面,还支持pdf、word、txt、各种图片等等的显示。下面以加载mac桌面上的png图片:/Users/coohua/Desktop/bigIcon.png为例

  1. // 1.获取url
  2. NSURL *url = [NSURL fileURLWithPath:@"/Users/coohua/Desktop/bigIcon.png"];
  3. // 2.创建请求
  4. NSURLRequest *request=[NSURLRequest requestWithURL:url];
  5. // 3.加载请求
  6. [self.webView loadRequest:request];
  • 网页导航刷新有关函数
  1. // 刷新
  2. - (void)reload;
  3. // 停止加载
  4. - (void)stopLoading;
  5. // 后退函数
  6. - (void)goBack;
  7. // 前进函数
  8. - (void)goForward;
  9. // 是否可以后退
  10. @property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;
  11. // 是否可以向前
  12. @property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;
  13. // 是否正在加载
  14. @property (nonatomic, readonly, getter=isLoading) BOOL loading;

3 代理协议使用:UIWebViewDelegate

一共有四个方法

  1. /// 是否允许加载网页,也可获取js要打开的url,通过截取此url可与js交互
  2. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  3.  
  4. NSString *urlString = [[request URL] absoluteString];
  5. urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  6.  
  7. NSArray *urlComps = [urlString componentsSeparatedByString:@"://"];
  8. NSLog(@"urlString=%@---urlComps=%@",urlString,urlComps);
  9. return YES;
  10. }
  11. /// 开始加载网页
  12. - (void)webViewDidStartLoad:(UIWebView *)webView {
  13. NSURLRequest *request = webView.request;
  14. NSLog(@"webViewDidStartLoad-url=%@--%@",[request URL],[request HTTPBody]);
  15. }
  16. /// 网页加载完成
  17. - (void)webViewDidFinishLoad:(UIWebView *)webView {
  18. NSURLRequest *request = webView.request;
  19. NSURL *url = [request URL];
  20. if ([url.path isEqualToString:@"/normal.html"]) {
  21. NSLog(@"isEqualToString");
  22. }
  23. NSLog(@"webViewDidFinishLoad-url=%@--%@",[request URL],[request HTTPBody]);
  24. NSLog(@"%@",[self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]);
  25. }
  26. /// 网页加载错误
  27. - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
  28. NSURLRequest *request = webView.request;
  29. NSLog(@"didFailLoadWithError-url=%@--%@",[request URL],[request HTTPBody]);
  30.  
  31. }

4 与js交互

主要有两方面:js执行OC代码、oc调取写好的js代码

  • js执行OC代码:js是不能执行oc代码的,但是可以变相的执行,js可以将要执行的操作封装到网络请求里面,然后oc拦截这个请求,获取url里面的字符串解析即可,这里用到代理协议的- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType函数。
  • oc调取写好的js代码:这里用到UIwebview的一个方法。示例代码一个是网页定位,一个是获取网页title:
  1. // 实现自动定位js代码, htmlLocationID为定位的位置(由js开发人员给出),实现自动定位代码,应该在网页加载完成之后再调用
  2. NSString *javascriptStr = [NSString stringWithFormat:@"window.location.href = '#%@'",htmlLocationID];
  3. // webview执行代码
  4. [self.webView stringByEvaluatingJavaScriptFromString:javascriptStr];
  5.  
  6. // 获取网页的title
  7. NSString *title = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"];
  • 与js交互的实例

很多时候,我们要对网页做一些编辑,比如加载一个网页后,个别原因,我们不想显示新闻的来源,如下图的新闻来源“新华网”,网页的链接如下:http://op.inews.qq.com/mcms/h5/default/detail?id=NEW2016103101306200&refer=100000050(可能已经失效)

那我们就可以使用js代码将这个标签去掉,且只留下时间。js代码的编写,根据火狐浏览器查看它的标签名称,然后做处理,如上图,具体代码如下:

  1. - (void)deleteNewsSource {
  2. // 1.去掉页面标题
  3. NSMutableString *str = [NSMutableString string];
  4. // 去掉导航页,如果想把“腾讯新闻”导航栏一并去掉,就打开注释
  5. // [str appendString:@"document.getElementsByClassName('g-header')[0].style.display = 'none';"];
  6. // 来源
  7. [str appendString:@"if(document.getElementsByClassName('g-wrapper-author')[0].innerHTML.indexOf(' ') == -1){document.getElementsByClassName('g-wrapper-author')[0].innerHTML = document.getElementsByClassName('g-wrapper-author')[0].innerHTML}else{document.getElementsByClassName('g-wrapper-author')[0].innerHTML = document.getElementsByClassName('g-wrapper-author')[0].innerHTML.split(' ')[1];}"];
  8. // 执行js代码
  9. [_webView stringByEvaluatingJavaScriptFromString:str];
  10. }

代码执行的时机,一般情况下是等待网页加载完成- (void)webViewDidFinishLoad:(UIWebView *)webView里面执行,比较合理,但是有延迟,我们会发现刚开始有来源,然后突然又没有了,即js代码执行有延迟。

这样的话,我们可以在- (void)webViewDidStartLoad:(UIWebView *)webView网页开始加载里面开启一个定时器,比如定时0.2秒(根据需要自己设定),在定时器里面不停的调用- (void)deleteNewsSource方法即可解决。然后在- (void)webViewDidFinishLoad:(UIWebView *)webView里面关掉定时器。另外定时器容易引起循环引用,一定要注意释放。比如可以在viewDidDisappear方法里释放定时器。。。

  1. - (void)webViewDidStartLoad:(UIWebView *)webView {
  2. // 1.去掉页面来源标签,时间根据需要自己设置,定时器在这里开启具有一定危险性
  3. NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(deleteNewsSource) userInfo:nil repeats:YES];
  4. [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
  5. self.timer = timer;
  6. }

三、WKWebView使用说明

1 简单使用

与UIWebview一样,仅需三步:

  1. - (void)simpleExampleTest {
  2. // 1.创建webview,并设置大小,"20"为状态栏高度
  3. WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height - )];
  4. // 2.创建请求
  5. NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.cnblogs.com/mddblog/"]];
  6. // 3.加载网页
  7. [webView loadRequest:request];
  8.  
  9. // 最后将webView添加到界面
  10. [self.view addSubview:webView];
  11. }

2 一些实用函数

  • 加载网页函数
    相比UIWebview,WKWebView也支持各种文件格式,并新增了loadFileURL函数,顾名思义加载本地文件,不要用loadRequest来加载本地HTML,另外,加载网页显示属于UI,所以应在主线程里面执行加载网页函数,不过即使在其它线程执行了加载网页函数,也没关系,苹果已做了处理,保证UI在主线程更新。
  1. /// 模拟器调试加载mac本地文件
  2. - (void)loadLocalFile {
  3. // 1.创建webview,并设置大小,"20"为状态栏高度
  4. WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height - )];
  5. // 2.创建url userName:电脑用户名
  6. NSURL *url = [NSURL fileURLWithPath:@"/Users/userName/Desktop/bigIcon.png"];
  7. // 3.加载文件
  8. [webView loadFileURL:url allowingReadAccessToURL:url];
  9. // 最后将webView添加到界面
  10. [self.view addSubview:webView];
  11. }
  12.  
  13. /// 其它三个加载函数
  14. - (WKNavigation *)loadRequest:(NSURLRequest *)request;
  15. - (WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
  16. - (WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL;
  • 网页导航刷新相关函数
    和UIWebview几乎一样,不同的是有返回值,WKNavigation(已更新),另外增加了函数reloadFromOrigingoToBackForwardListItem

    • reloadFromOrigin会比较网络数据是否有变化,没有变化则使用缓存,否则从新请求。
    • goToBackForwardListItem:比向前向后更强大,可以跳转到某个指定历史页面
  1. @property (nonatomic, readonly) BOOL canGoBack;
  2. @property (nonatomic, readonly) BOOL canGoForward;
  3. - (WKNavigation *)goBack;
  4. - (WKNavigation *)goForward;
  5. - (WKNavigation *)reload;
  6. - (WKNavigation *)reloadFromOrigin; // 增加的函数
  7. - (WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item; // 增加的函数
  8. - (void)stopLoading;
  • 一些常用属性

    • allowsBackForwardNavigationGestures:BOOL类型,是否允许左右划手势导航,默认不允许
    • estimatedProgress:加载进度,取值范围0~1
    • title:页面title
    • .scrollView.scrollEnabled:是否允许上下滚动,默认允许
    • backForwardList:WKBackForwardList类型,访问历史列表,可以通过前进后退按钮访问,或者通过goToBackForwardListItem函数跳到指定页面
  • 执行js代码

  1. /// jsStr为要执行的js代码,字符串形式
  2. [webView evaluateJavaScript:jsStr completionHandler:^(id item, NSError * _Nullable error) {
  3. // 执行结果回调
  4. }];

3 代理协议使用

一共有三个代理协议:

  • WKNavigationDelegate:最常用,和UIWebViewDelegate功能类似,追踪加载过程,有是否允许加载、开始加载、加载完成、加载失败。下面会对函数做简单的说明,并用数字标出调用的先后次序:1-2-3-4-5

三个是否允许加载函数:

  1. /// 接收到服务器跳转请求之后调用 (服务器端redirect),不一定调用
  2. - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
  3. /// 3 在收到服务器的响应头,根据response相关信息,决定是否跳转。decisionHandler必须调用,来决定是否跳转,参数WKNavigationActionPolicyCancel取消跳转,WKNavigationActionPolicyAllow允许跳转
  4. - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
  5. /// 1 在发送请求之前,决定是否跳转
  6. - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;

追踪加载过程函数:

  1. /// 2 页面开始加载
  2. - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
  3. /// 4 开始获取到网页内容时返回
  4. - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
  5. /// 5 页面加载完成之后调用
  6. - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
  7. /// 页面加载失败时调用
  8. - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
  • WKScriptMessageHandler:必须实现的函数,是APP与js交互,提供从网页中收消息的回调方法,即js可以调用app的方法

当然需要对webview做一些特殊处理,创建的时候调用initWithFrame:configuration:做一些配置,configurationWKWebViewConfiguration类型,具体不再详述,代理方法如下:

  1. /// message: 收到的脚本信息.
  2. - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
  1. 当然,app也可以执行js代码,如下:
  1. /// jsStr为要执行的js代码,字符串形式
  2. [webView evaluateJavaScript:jsStr completionHandler:^(id item, NSError * _Nullable error) {
  3. // 执行结果回调
  4. }];
  • WKUIDelegate:UI界面相关,原生控件支持,三种提示框:输入、确认、警告。首先将web提示框拦截然后再做处理。
  1. /// 创建一个新的WebView
  2. - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
  3. /// 输入框
  4. - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler;
  5. /// 确认框
  6. - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
  7. /// 警告框
  8. - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;

四、示例代码

  • 代码可以实现一般网络显示,加载本地文件(pdf、word、txt、图片等等)
  • 搜索框搜索界面,搜索框输入file://则加载本地文件,http://则加载网络内容,如果两者都不是则搜索输入的关键字。
  • 下部网络导航,后退、前进、刷新、用Safari打开链接四个按钮

  1. /// 控件高度
  2. #define kSearchBarH 44
  3. #define kBottomViewH 44
  4.  
  5. /// 屏幕大小尺寸
  6. #define kScreenWidth [UIScreen mainScreen].bounds.size.width
  7. #define kScreenHeight [UIScreen mainScreen].bounds.size.height
  8.  
  9. #import "ViewController.h"
  10. #import <WebKit/WebKit.h>
  11.  
  12. @interface ViewController () <UISearchBarDelegate, WKNavigationDelegate>
  13.  
  14. @property (nonatomic, strong) UISearchBar *searchBar;
  15. /// 网页控制导航栏
  16. @property (weak, nonatomic) UIView *bottomView;
  17.  
  18. @property (nonatomic, strong) WKWebView *wkWebView;
  19.  
  20. @property (weak, nonatomic) UIButton *backBtn;
  21. @property (weak, nonatomic) UIButton *forwardBtn;
  22. @property (weak, nonatomic) UIButton *reloadBtn;
  23. @property (weak, nonatomic) UIButton *browserBtn;
  24.  
  25. @property (weak, nonatomic) NSString *baseURLString;
  26.  
  27. @end
  28.  
  29. @implementation ViewController
  30.  
  31. - (void)viewDidLoad {
  32. [super viewDidLoad];
  33. // [self simpleExampleTest];
  34.  
  35. [self addSubViews];
  36. [self refreshBottomButtonState];
  37.  
  38. [self.wkWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.cnblogs.com/mddblog/"]]];
  39.  
  40. }
  41. - (void)simpleExampleTest {
  42. // 1.创建webview,并设置大小,"20"为状态栏高度
  43. WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height - )];
  44. // 2.创建请求
  45. NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.cnblogs.com/mddblog/"]];
  46. // // 3.加载网页
  47. [webView loadRequest:request];
  48. // [webView loadFileURL:[NSURL fileURLWithPath:@"/Users/userName/Desktop/bigIcon.png"] allowingReadAccessToURL:[NSURL fileURLWithPath:@"/Users/userName/Desktop/bigIcon.png"]];
  49. // 最后将webView添加到界面
  50. [self.view addSubview:webView];
  51. }
  52. /// 模拟器加载mac本地文件
  53. - (void)loadLocalFile {
  54. // 1.创建webview,并设置大小,"20"为状态栏高度
  55. WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height - )];
  56. // 2.创建url userName:电脑用户名
  57. NSURL *url = [NSURL fileURLWithPath:@"/Users/userName/Desktop/bigIcon.png"];
  58. // 3.加载文件
  59. [webView loadFileURL:url allowingReadAccessToURL:url];
  60. // 最后将webView添加到界面
  61. [self.view addSubview:webView];
  62. }
  63. - (void)addSubViews {
  64. [self addBottomViewButtons];
  65.  
  66. [self.view addSubview:self.searchBar];
  67.  
  68. [self.view addSubview:self.wkWebView];
  69. }
  70.  
  71. - (void)addBottomViewButtons {
  72. // 记录按钮个数
  73. int count = ;
  74. // 添加按钮
  75. UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  76. [button setTitle:@"后退" forState:UIControlStateNormal];
  77. [button setTitleColor:[UIColor colorWithRed: / 255.0 green: / 255.0 blue: / 255.0 alpha:1.0] forState:UIControlStateNormal];
  78. [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
  79. [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
  80. [button.titleLabel setFont:[UIFont systemFontOfSize:]];
  81. button.tag = ++count; // 标记按钮
  82. [button addTarget:self action:@selector(onBottomButtonsClicled:) forControlEvents:UIControlEventTouchUpInside];
  83. [self.bottomView addSubview:button];
  84. self.backBtn = button;
  85.  
  86. button = [UIButton buttonWithType:UIButtonTypeCustom];
  87. [button setTitle:@"前进" forState:UIControlStateNormal];
  88. [button setTitleColor:[UIColor colorWithRed: / 255.0 green: / 255.0 blue: / 255.0 alpha:1.0] forState:UIControlStateNormal];
  89. [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
  90. [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
  91. [button.titleLabel setFont:[UIFont systemFontOfSize:]];
  92. button.tag = ++count;
  93. [button addTarget:self action:@selector(onBottomButtonsClicled:) forControlEvents:UIControlEventTouchUpInside];
  94. [self.bottomView addSubview:button];
  95. self.forwardBtn = button;
  96.  
  97. button = [UIButton buttonWithType:UIButtonTypeCustom];
  98. [button setTitle:@"重新加载" forState:UIControlStateNormal];
  99. [button setTitleColor:[UIColor colorWithRed: / 255.0 green: / 255.0 blue: / 255.0 alpha:1.0] forState:UIControlStateNormal];
  100. [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
  101. [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
  102. [button.titleLabel setFont:[UIFont systemFontOfSize:]];
  103. button.tag = ++count;
  104. [button addTarget:self action:@selector(onBottomButtonsClicled:) forControlEvents:UIControlEventTouchUpInside];
  105. [self.bottomView addSubview:button];
  106. self.reloadBtn = button;
  107.  
  108. button = [UIButton buttonWithType:UIButtonTypeCustom];
  109. [button setTitle:@"Safari" forState:UIControlStateNormal];
  110. [button setTitleColor:[UIColor colorWithRed: / 255.0 green: / 255.0 blue: / 255.0 alpha:1.0] forState:UIControlStateNormal];
  111. [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
  112. [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
  113. [button.titleLabel setFont:[UIFont systemFontOfSize:]];
  114. button.tag = ++count;
  115. [button addTarget:self action:@selector(onBottomButtonsClicled:) forControlEvents:UIControlEventTouchUpInside];
  116. [self.bottomView addSubview:button];
  117. self.browserBtn = button;
  118. // 统一设置frame
  119. [self setupBottomViewLayout];
  120. }
  121. - (void)setupBottomViewLayout
  122. {
  123. int count = ;
  124. CGFloat btnW = ;
  125. CGFloat btnH = ;
  126.  
  127. CGFloat btnY = (self.bottomView.bounds.size.height - btnH) / ;
  128. // 按钮间间隙
  129. CGFloat margin = (self.bottomView.bounds.size.width - btnW * count) / count;
  130.  
  131. CGFloat btnX = margin * 0.5;
  132. self.backBtn.frame = CGRectMake(btnX, btnY, btnW, btnH);
  133.  
  134. btnX = self.backBtn.frame.origin.x + btnW + margin;
  135. self.forwardBtn.frame = CGRectMake(btnX, btnY, btnW, btnH);
  136.  
  137. btnX = self.forwardBtn.frame.origin.x + btnW + margin;
  138. self.reloadBtn.frame = CGRectMake(btnX, btnY, btnW, btnH);
  139.  
  140. btnX = self.reloadBtn.frame.origin.x + btnW + margin;
  141. self.browserBtn.frame = CGRectMake(btnX, btnY, btnW, btnH);
  142. }
  143. /// 刷新按钮是否允许点击
  144. - (void)refreshBottomButtonState {
  145. if ([self.wkWebView canGoBack]) {
  146. self.backBtn.enabled = YES;
  147. } else {
  148. self.backBtn.enabled = NO;
  149. }
  150.  
  151. if ([self.wkWebView canGoForward]) {
  152. self.forwardBtn.enabled = YES;
  153. } else {
  154. self.forwardBtn.enabled = NO;
  155. }
  156. }
  157. /// 按钮点击事件
  158. - (void)onBottomButtonsClicled:(UIButton *)sender {
  159. switch (sender.tag) {
  160. case :
  161. {
  162. [self.wkWebView goBack];
  163. [self refreshBottomButtonState];
  164. }
  165. break;
  166. case :
  167. {
  168. [self.wkWebView goForward];
  169. [self refreshBottomButtonState];
  170. }
  171. break;
  172. case :
  173. [self.wkWebView reload];
  174. break;
  175. case :
  176. [[UIApplication sharedApplication] openURL:self.wkWebView.URL];
  177. break;
  178. default:
  179. break;
  180. }
  181. }
  182.  
  183. #pragma mark - WKWebView WKNavigationDelegate 相关
  184. /// 是否允许加载网页 在发送请求之前,决定是否跳转
  185. - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
  186.  
  187. NSString *urlString = [[navigationAction.request URL] absoluteString];
  188.  
  189. urlString = [urlString stringByRemovingPercentEncoding];
  190. // NSLog(@"urlString=%@",urlString);
  191. // 用://截取字符串
  192. NSArray *urlComps = [urlString componentsSeparatedByString:@"://"];
  193. if ([urlComps count]) {
  194. // 获取协议头
  195. NSString *protocolHead = [urlComps objectAtIndex:];
  196. NSLog(@"protocolHead=%@",protocolHead);
  197. }
  198. decisionHandler(WKNavigationActionPolicyAllow);
  199. }
  200.  
  201. #pragma mark - searchBar代理方法
  202. /// 点击搜索按钮
  203. - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
  204. // 创建url
  205. NSURL *url = nil;
  206. NSString *urlStr = searchBar.text;
  207.  
  208. // 如果file://则为打开bundle本地文件,http则为网站,否则只是一般搜索关键字
  209. if([urlStr hasPrefix:@"file://"]){
  210. NSRange range = [urlStr rangeOfString:@"file://"];
  211. NSString *fileName = [urlStr substringFromIndex:range.length];
  212. url = [[NSBundle mainBundle] URLForResource:fileName withExtension:nil];
  213. // 如果是模拟器加载电脑上的文件,则用下面的代码
  214. // url = [NSURL fileURLWithPath:fileName];
  215. }else if(urlStr.length>){
  216. if ([urlStr hasPrefix:@"http://"]) {
  217. url=[NSURL URLWithString:urlStr];
  218. } else {
  219. urlStr=[NSString stringWithFormat:@"http://www.baidu.com/s?wd=%@",urlStr];
  220. }
  221. urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  222. url=[NSURL URLWithString:urlStr];
  223.  
  224. }
  225. NSURLRequest *request=[NSURLRequest requestWithURL:url];
  226.  
  227. // 加载请求页面
  228. [self.wkWebView loadRequest:request];
  229. }
  230. #pragma mark - 懒加载
  231. - (UIView *)bottomView {
  232. if (_bottomView == nil) {
  233. UIView *view = [[UIView alloc] initWithFrame:CGRectMake(, kScreenHeight - kBottomViewH, kScreenWidth, kBottomViewH)];
  234. view.backgroundColor = [UIColor colorWithRed:/255.0 green:/255.0 blue:/255.0 alpha:];
  235. [self.view addSubview:view];
  236. _bottomView = view;
  237. }
  238. return _bottomView;
  239. }
  240. - (UISearchBar *)searchBar {
  241. if (_searchBar == nil) {
  242. UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(, , kScreenWidth, kSearchBarH)];
  243. searchBar.delegate = self;
  244. searchBar.text = @"http://www.cnblogs.com/mddblog/";
  245. _searchBar = searchBar;
  246.  
  247. }
  248. return _searchBar;
  249. }
  250.  
  251. - (WKWebView *)wkWebView {
  252. if (_wkWebView == nil) {
  253. WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(, + kSearchBarH, kScreenWidth, kScreenHeight - - kSearchBarH - kBottomViewH)];
  254. webView.navigationDelegate = self;
  255. // webView.scrollView.scrollEnabled = NO;
  256.  
  257. // webView.backgroundColor = [UIColor colorWithPatternImage:self.image];
  258. // 允许左右划手势导航,默认允许
  259. webView.allowsBackForwardNavigationGestures = YES;
  260. _wkWebView = webView;
  261. }
  262.  
  263. return _wkWebView;
  264. }
  265.  
  266. @end

五、github代码下载

UIWebView下载

WKWebView下载

iOS网络3—UIWebView与WKWebView使用详解的更多相关文章

  1. iOS UIWebView与WKWebView使用详解

    一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且 ...

  2. UIWebView、WKWebView使用详解及性能分析

    http://www.cnblogs.com/junhuawang/p/5759224.html

  3. 【iOS 使用github上传代码】详解

    [iOS 使用github上传代码]详解 一.github创建新工程 二.直接添加文件 三.通过https 和 SSH 操作两种方式上传工程 3.1https 和 SSH 的区别: 3.1.1.前者可 ...

  4. Linux网络状态工具ss命令使用详解【转】

    ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...

  5. Linux 网络流量实时监控工具之ntopng详解

    大纲一.前言二.ntopng 简介三.ntopng 功能说明 四.ntopng 安装详解五.ntopng 配置详解 六.ntopng 使用详解注,操作系统 CentOS 5.5 X86_64,软件版本 ...

  6. (转)Linux网络状态工具ss命令使用详解

    Linux网络状态工具ss命令使用详解 原文:http://www.landui.com/help/show-5991.html ss 是 socket statistics 的缩写.顾名思义,ss ...

  7. iOS开发——UI篇OC篇&UICollectionView详解+实例

    UICollectionView详解+实例 实现步骤: 一.新建两个类 1.继承自UIScrollView的子类,比如HMWaterflowView * 瀑布流显示控件,用来显示所有的瀑布流数据 2. ...

  8. 【iOS自定义键盘及键盘切换】详解

    [iOS自定义键盘]详解 实现效果展示: 一.实现的协议方法代码 #import <UIKit/UIKit.h> //创建自定义键盘协议 @protocol XFG_KeyBoardDel ...

  9. Linux 网络编程三(socket代码详解)

    //网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

随机推荐

  1. 【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ce8068d4d44a246f72baf2 Dev Club 是一个交流移动 ...

  2. ubuntu 14.10 lts 64-bits环境下使用Android Studio

    距离google发布android studio 1.0正式版已经两个月左右了.由于一直习惯使用eclipse+ADT的模式,而且曾在windows下试用一次Android Studio预览版,感觉卡 ...

  3. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  4. [转] STM32各种时钟的区别

    [原创]:http://m.oschina.net/blog/129357 我在原创的基础又从另一位博主处引用了一些内容. 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是 ...

  5. 配置文件Java读写

    今天把配置文件的Bug修复了,总结一下Java配置文件如何读写 配置文件的格式 以.properties后缀结尾,内容不出现空格和双引号 //config.properties Driver=com. ...

  6. backup4:数据库自动备份,自动删除备份文件

    一:手写TSQL 脚本 1,自动备份 每周进行一次Database 的 Full Backup,设置 Schedule Interval 为Weekly use master go ) )+N'.ba ...

  7. 6.LibSVM核函数

    libsvm的核函数类型(svmtrain.c注释部分): "-t kernel_type : set type of kernel function (default 2)\n" ...

  8. iOS开发之"省市"二级联动的数据组织(PHP版)以及PickerView的实现与封装

    之所以要发表这篇博客,还源于最近的开发工作所实现的一个小的Demo, 当然这个Demo不会涉及工作中App的一些内容,下方要实现的Demo是通用的.因为项目需求的迭代,要求在银行卡绑定中添加支行所在的 ...

  9. 移动端web开发的那些坑

    1.为非a列表项添加触感样式 通过js注册touchstart和touchend事件,添加触感class的方式, 有个坑,低版本的Android浏览器,经常触发不到touchend,需要再额外注册一个 ...

  10. 打造android偷懒神器———ListView的万能适配器

    如果你去做任何一个项目,我相信你都会跟我有一样的经历,最最普遍的就是列表显示ListView,当然,写N个自定义的适配器也是情理之中.虽说程序员本身就是搬砖,做这些枯燥无味的重复的事情也是理所当然,但 ...