亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift使用WKWebView在iOS應用中調用Web的方法詳解

2020-03-09 17:48:42
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Swift使用WKWebView在iOS應用中調用Web的方法詳解,使用WKWebView便等于使用和Safari中相同的JavaScript解釋器,用來替代過去的UIWebView,需要的朋友可以參考下
 

自從iOS8開始,Apple引入了WKWebView欲代替UIWebView。相比而言,WKWebView消耗內從更少,功能也更加強大。讓我們來看看WKWebView怎么使用吧!

0.初始化
(1)首先需要引入WebKit庫

復制代碼代碼如下:

#import <WebKit/WebKit.h>

(2)初始化方法分為以下兩種
復制代碼代碼如下:

// 默認初始化
- (instancetype)initWithFrame:(CGRect)frame;
// 根據對webview的相關配置,進行初始化
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;

(3)加載網頁與HTML代碼的方式與UIWebView相同,代碼如下:
復制代碼代碼如下:

WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:webView];

 

1. WKWebView的代理方法
(1) WKNavigationDelegate
該代理提供的方法,可以用來追蹤加載過程(頁面開始加載、加載完成、加載失?。?、決定是否執行跳轉。

復制代碼代碼如下:

// 頁面開始加載時調用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// 當內容開始返回時調用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 頁面加載完成之后調用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 頁面加載失敗時調用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;

頁面跳轉的代理方法有三種,分為(收到跳轉與決定是否跳轉兩種)
復制代碼代碼如下:

// 接收到服務器跳轉請求之后調用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
// 在收到響應后,決定是否跳轉
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
// 在發送請求之前,決定是否跳轉
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;

(2)WKUIDelegate
復制代碼代碼如下:

// 創建一個新的WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;

剩下三個代理方法全都是與界面彈出提示框相關的,針對于web界面的三種提示框(警告框、確認框、輸入框)分別對應三種代理方法。下面只舉了警告框的例子。
復制代碼代碼如下:

/**
 *  web界面中有彈出警告框時調用
 *
 *  @param webView           實現該代理的webview
 *  @param message           警告框中的內容
 *  @param frame             主窗口
 *  @param completionHandler 警告框消失調用
 */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler;

(3)WKScriptMessageHandler
這個協議中包含一個必須實現的方法,這個方法是提高App與web端交互的關鍵,它可以直接將接收到的JS腳本轉為OC或Swift對象。(當然,在UIWebView也可以通過“曲線救國”的方式與web進行交互,著名的Cordova框架就是這種機制)
復制代碼代碼如下:

// 從web界面中接收到一個腳本時調用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;

 

2.修改Info.plist
注意從iOS9開始,凡是涉及到網絡操作的,都要在Info.plist中加入:

Swift,WKWebView,iOS應用

 

3.加載網頁
先要在ViewController 導入WebKit:

復制代碼代碼如下:

import WebKit

然后:
復制代碼代碼如下:

var webview = WKWebView()
override func viewDidLoad() {
  super.viewDidLoad()
    //創建wkwebview
    let webview = WKWebView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))
    //創建網址
    let url = NSURL(string: "http://www.jianshu.com/users/040395b7230c/latest_articles")
    //創建請求
    let request = NSURLRequest(URL: url!)
    //加載請求
    webview.loadRequest(request)
    //添加wkwebview
    self.view.addSubview(webview)
}

運行效果如圖:

 

Swift,WKWebView,iOS應用

 

4.獲取網頁標題
為了顯示標題,首先給ViewController嵌入一個NavigationController。有了導航欄后,我們要調整一下webview的y軸位置,防止導航欄遮住網頁上面部分,在viewDidLoad()里寫上:

復制代碼代碼如下:

//獲取導航欄高度
let navHeight = self.navigationController?.navigationBar.frame.height
//獲取狀態欄高度
let statusHeight = UIApplication.sharedApplication().statusBarFrame.height
webview = WKWebView(frame: CGRectMake(0, statusHeight+navHeight!,self.view.frame.width, self.view.frame.height))

其次,這里要用到WKNavigationDelegate,所以在viewDidLoad()里加上
復制代碼代碼如下:

self.webview.navigationDelegate = self

注意網頁標題要在網頁加載完成后才能獲取,否則為空,于是我們用到'處理網頁加載完成'這個方法:
復制代碼代碼如下:

func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
    self.navigationItem.title = self.webview.title
  }

運行效果如圖:

 

Swift,WKWebView,iOS應用

 

5.前進和后退
首先我們要在navgationBar上添加前進和后退按鈕:

復制代碼代碼如下:

var btnBack = UIBarButtonItem()
var btnForward = UIBarButtonItem()
func setNavBar() {
  btnBack = UIBarButtonItem(title: "后退", style: UIBarButtonItemStyle.Plain, target: self, action: "toBack")
  btnForward = UIBarButtonItem(title: "前進", style: UIBarButtonItemStyle.Plain, target: self, action: "toForward")
  self.navigationItem.leftBarButtonItem = btnBack
  self.navigationItem.rightBarButtonItem = btnForward
  }

然后我們用到了goBack()和goForward()方法,在前進或后退之前我們要判斷一下網頁是否能夠前進或后退:
復制代碼代碼如下:

func toBack() {
   if self.webview.canGoBack {
     self.webview.goBack()
    }
  }

 

func toForward() {
  if self.webview.canGoForward {
    self.webview.goForward()
    }
}


最后在viewDidLoad()里加上調用setNavBar()方法:
復制代碼代碼如下:

setNavBar()

運行效果如圖:

 

Swift,WKWebView,iOS應用

 

6.修改網頁配置
現在,一個看似很簡單的瀏覽器完成了,但如果我們把網址換成:
http://csol2.tiancity.com/homepage/article/Class_1166_Time_1.html
即在viewDidLoad()里修改:

復制代碼代碼如下:

let url = NSURL(string: "http://csol2.tiancity.com/homepage/article/Class_1166_Time_1.html")

我們會發現網頁上列表里的文字,包括頂欄上的文字點擊了沒反應,問題出在哪里呢?這是因為系統阻止了不安全的連接。怎么解決呢?我們就要用到WKUIDelegate中的createWebViewWithConfiguration()這個方法讓其允許導航,首先我們要設置自身代理,在viewDidLoad()里加上:
復制代碼代碼如下:

self.webview.UIDelegate = self

其次:
復制代碼代碼如下:

func webView(webView: WKWebView, createWebViewWithConfiguration configuration: WKWebViewConfiguration, forNavigationAction navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
     //如果目標主視圖不為空,則允許導航
  if !(navigationAction.targetFrame?.mainFrame != nil) {
    self.webview.loadRequest(navigationAction.request)
    }
  return nil
  }

運行一下,發現點擊跳轉了!

 

7.處理js的提示框
現在把網址修改為

http://evt.tiancity.com/csol2/1565/home/index.php
即在viewDidLoad()里修改:

復制代碼代碼如下:

let url = NSURL(string: "http://evt.tiancity.com/csol2/1565/home/index.php")

往下拉,點擊'立即領取',本應該出現提示框,卻發現什么也沒發生。為此,我們要處理一下js的提示框事件。還記得一開始提到的那個方法吧,如下:
復制代碼代碼如下:

func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: () -> Void) {
  let alert = UIAlertController(title: nil, message: message, preferredStyle: .Alert)
  alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (_) -> Void in
    completionHandler()
    }))
   self.presentViewController(alert, animated: true, completion: nil)
  }

這里要創建一個警告框來顯示,現在再運行一下看看?!

 

Swift,WKWebView,iOS應用

 

8.添加進度條
我們知道UIWebView是無法獲取網頁加載的進度的,于是也就無法創建進度條了,當然我們可以以某種算法模擬網頁加載,自己設置進度條的值。而WKWebView卻提供了獲取網頁加載進度的方法,支持KVO,也就是estimatedProgress。另外還有loading是否正在加載和title頁面標題。
我們得創建一個進度條:

復制代碼代碼如下:

var progBar = UIProgressView()
//以下代碼添加到viewDidLoad()
progBar = UIProgressView(frame: CGRectMake(0, 0, self.view.frame.width, 30))
  progBar.progress = 0.0
  progBar.tintColor = UIColor.redColor()
  self.webview.addSubview(progBar)

然后給網頁添加監聽進度,同樣在viewDidLoad()里:
復制代碼代碼如下:

self.webview.addObserver(self, forKeyPath: "estimatedProgress", options: NSKeyValueObservingOptions.New, context: nil)

再處理KVO:
復制代碼代碼如下:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
  if keyPath == "estimatedProgress" {
    self.progBar.alpha = 1.0
    progBar.setProgress(Float(webview.estimatedProgress), animated: true)
         //進度條的值最大為1.0
     if(self.webview.estimatedProgress >= 1.0) {
      UIView.animateWithDuration(0.3, delay: 0.1, options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in
        self.progBar.alpha = 0.0
        }, completion: { (finished:Bool) -> Void in
          self.progBar.progress = 0
        })
      }
    }
}

這里設置進度條的值很重要,因為我們發現,其實進度條的值總比網頁加載的實際值慢一些,兩者并不同步。如果你不添加動畫使進度條加載完成后消失,你會發現進度條還沒到最右邊中途就不見了。所以我們要用個動畫來實現。此外,如果把self.progBar.progress = 0這句語句,即清零的功能放到別的方法中去,比如說放到開始導航的時候來清零,你會發現進度條的動畫有問題,會來回轉。總之,怎么處理進度條的動畫很講究,我試了好多次發現這個方法相對來說穩定一些。所以我建議大家可以換個進度條的樣式,即不依賴于值的顯示,如可以轉圈圈等等?,F在有好多第三方庫可以使用,大家可以上cocoapods去查找。

 

還有一點別忘了,對于KVO模式,有add一定要remove,否則會崩潰。我們可以在視圖消失的時候添加remove:

復制代碼代碼如下:

override func viewWillDisappear(animated: Bool) {
  webview.removeObserver(self, forKeyPath: "estimatedProgress")
  }
 

大家可以換些網址試試!

 

9.最終效果圖

Swift,WKWebView,iOS應用

10.總結
WKWebView的簡單使用就介紹到這里了!大家有興趣可以為其添加更多功能!如果喜歡本文的話別忘了點擊喜歡哦!

后記
既然說WKWebView相比UIWebView消耗的內存更少,那么我們就來實際對比一下,我們讓它們加載同一個網站,結果如圖
(左為UIWebView,右為WKWebView):

Swift,WKWebView,iOS應用

 
 

注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日av在线播放中文不卡| 久久久久国产精品一区| 久久中文字幕在线| 国产欧美日韩91| 久久精品电影一区二区| 亚洲人成网站色ww在线| 国产99久久精品一区二区永久免费| 欧美日韩在线另类| 亚洲系列中文字幕| 国产精品视频区1| 国产综合视频在线观看| 精品成人国产在线观看男人呻吟| 亚洲欧美一区二区激情| 成人看片人aa| 午夜精品久久久久久久99热| 国产精品精品国产| 日韩专区在线播放| 国产亚洲aⅴaaaaaa毛片| 亚洲国语精品自产拍在线观看| 日韩精品在线观看视频| 亚洲国产欧美一区二区丝袜黑人| 成人黄色免费在线观看| 欧美一区第一页| 性欧美xxxx视频在线观看| 亚洲精品理论电影| 奇米成人av国产一区二区三区| 欧美韩日一区二区| 北条麻妃一区二区三区中文字幕| 欧美亚洲视频一区二区| 国产成人精品在线| 福利一区视频在线观看| 精品av在线播放| 不卡在线观看电视剧完整版| 日韩av高清不卡| 中文字幕日韩av综合精品| 久久在线免费观看视频| 成人免费在线网址| 精品国产一区二区三区久久狼黑人| 日本久久久久久| 国产日韩欧美夫妻视频在线观看| 一个人看的www欧美| 欧美国产乱视频| 欧洲日本亚洲国产区| 日韩精品中文在线观看| 国产精品一区专区欧美日韩| 国产精品三级美女白浆呻吟| 亚洲国产99精品国自产| 一区二区欧美亚洲| 中文字幕亚洲综合| 欧美黄色片免费观看| 97视频国产在线| 性欧美暴力猛交69hd| 欧美成人性色生活仑片| 日韩精品在线第一页| www.欧美免费| 日韩欧美一区二区三区久久| 欧美性色19p| 亚洲精品美女久久久久| 欧美一区二区三区免费观看| 欧美在线欧美在线| 国产97在线观看| 日韩小视频在线| 日韩理论片久久| 亚洲视频精品在线| 国内精品久久久久久| 欧美亚洲一级片| 精品国产一区二区三区久久| 亚洲性猛交xxxxwww| 国产九九精品视频| 国产丝袜一区二区三区| 国产精品欧美亚洲777777| 精品视频—区二区三区免费| 久久久久久久久久婷婷| 2018日韩中文字幕| 亚洲欧美中文日韩在线v日本| 精品综合久久久久久97| 日韩成人中文电影| 久久精品久久久久久国产 免费| 日韩激情视频在线| 久久精品青青大伊人av| 欧美日韩国产麻豆| 久久九九全国免费精品观看| 中文字幕av一区中文字幕天堂| 日韩欧美一区二区在线| 亚洲高清在线观看| 亚洲免费av网址| 国产成人精品在线视频| 久久久99免费视频| 欧美亚洲另类制服自拍| 97欧美精品一区二区三区| 成人精品福利视频| 久久影视电视剧免费网站清宫辞电视| 久久精品亚洲精品| 亚洲美女性生活视频| 高清欧美一区二区三区| 久久精品国产亚洲一区二区| 最近2019年日本中文免费字幕| 日韩中文字幕网址| 亚洲国产日韩欧美综合久久| 亚洲成人国产精品| 日韩美女免费视频| 欧美精品久久久久a| 欧美在线亚洲一区| 精品一区二区三区四区在线| 91sao在线观看国产| 日本欧美黄网站| 久久成人综合视频| 中日韩美女免费视频网址在线观看| 亚洲男人天堂手机在线| 成人福利在线观看| 国产日产亚洲精品| 91久久综合亚洲鲁鲁五月天| 国产精品久久久久久久午夜| 国产91精品高潮白浆喷水| 亚洲国产小视频| 午夜精品久久久久久久99热浪潮| 一级做a爰片久久毛片美女图片| 精品国产精品自拍| 日韩亚洲欧美成人| 国产精品jizz在线观看麻豆| 成人字幕网zmw| 精品国产91久久久| 啊v视频在线一区二区三区| 一区国产精品视频| 国产精品视频yy9099| 在线观看视频99| 成人免费看黄网站| 欧美一级电影在线| 日韩视频永久免费观看| 欧美成人精品xxx| 国产日韩在线亚洲字幕中文| 91欧美精品成人综合在线观看| 51精品国产黑色丝袜高跟鞋| 久久精品成人一区二区三区| 最近的2019中文字幕免费一页| 欧美日韩国产一区在线| 深夜成人在线观看| 久久影视电视剧免费网站| 亚洲性夜色噜噜噜7777| 亚洲国产一区自拍| 亚洲精品98久久久久久中文字幕| 深夜福利日韩在线看| 亚洲最大的av网站| 久久噜噜噜精品国产亚洲综合| 欧美电影电视剧在线观看| 欧美性猛交xxxx免费看| 青青草国产精品一区二区| 亚洲人午夜精品| 亚洲精品有码在线| 国产成人综合一区二区三区| 国产成人一区二区在线| 韩日欧美一区二区| 亚洲男女自偷自拍图片另类| 在线电影av不卡网址| 国产91色在线| 欧美高跟鞋交xxxxhd| 国产亚洲一级高清| 中文字幕国产日韩| 亚洲成人久久久| 日韩精品中文字幕在线观看| 欧美激情中文字幕在线| 国产精品伦子伦免费视频| 性色av一区二区咪爱| 久久精品人人爽|