亚洲香蕉成人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
該代理提供的方法,可以用來追蹤加載過程(頁面開始加載、加載完成、加載失?。?、決定是否執(zhí)行跳轉。

復制代碼代碼如下:

// 頁面開始加載時調用
- (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;
// 在發(fā)送請求之前,決定是否跳轉
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;

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

// 創(chuàng)建一個新的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
這個協(xié)議中包含一個必須實現的方法,這個方法是提高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()
    //創(chuàng)建wkwebview
    let webview = WKWebView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))
    //創(chuàng)建網址
    let url = NSURL(string: "http://www.jianshu.com/users/040395b7230c/latest_articles")
    //創(chuàng)建請求
    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
//獲取狀態(tài)欄高度
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")

我們會發(fā)現網頁上列表里的文字,包括頂欄上的文字點擊了沒反應,問題出在哪里呢?這是因為系統(tǒng)阻止了不安全的連接。怎么解決呢?我們就要用到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
  }

運行一下,發(fā)現點擊跳轉了!

 

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")

往下拉,點擊'立即領取',本應該出現提示框,卻發(fā)現什么也沒發(fā)生。為此,我們要處理一下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)
  }

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

 

Swift,WKWebView,iOS應用

 

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

復制代碼代碼如下:

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)

然后給網頁添加監(jiān)聽進度,同樣在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
        })
      }
    }
}

這里設置進度條的值很重要,因為我們發(fā)現,其實進度條的值總比網頁加載的實際值慢一些,兩者并不同步。如果你不添加動畫使進度條加載完成后消失,你會發(fā)現進度條還沒到最右邊中途就不見了。所以我們要用個動畫來實現。此外,如果把self.progBar.progress = 0這句語句,即清零的功能放到別的方法中去,比如說放到開始導航的時候來清零,你會發(fā)現進度條的動畫有問題,會來回轉??傊?怎么處理進度條的動畫很講究,我試了好多次發(fā)現這個方法相對來說穩(wěn)定一些。所以我建議大家可以換個進度條的樣式,即不依賴于值的顯示,如可以轉圈圈等等?,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教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产精品∨欧美精品v日韩精品| 国产精品美女久久久久久久网站| 国产精品亚洲第一| 久久草av在线| 友田真希在线| 婷婷视频一区二区三区| 中文字幕一区二区三区四区免费看| 欧美日韩国产不卡| 亚洲一区二区三区在线| 制服丝袜中文字幕一区| 日本男人天堂网| 免费人成网ww777kkk手机| 麻豆视频传媒入口| 日韩免费观看av| mm131丰满少妇人体欣赏图| 精品国产91久久久久久久妲己| 午夜免费啪视频观看视频| 婷婷激情综合网| 九九热国产视频| 久久一本综合| 色呦呦在线免费观看| 精品国产福利| 在线中文字幕不卡| 精品国产鲁一鲁一区二区张丽| 中文字幕一区二区三区电影| 人与动性xxxxx免费视频| 中文字幕在线字幕中文| 亚洲国产综合色| 国产传媒欧美日韩成人精品大片| h视频免费网站| 精品少妇人妻一区二区黑料社区| 国产精品115| 国产精品久久久久久久久免费看| 国产精品v欧美精品v日韩| 天堂√中文最新版在线| 国产蜜臀av在线一区二区三区| 1区2区3区在线| 国产精品国产精品国产专区| 亚洲精品成人久久| 亚洲精品无码久久久久久| a级片在线视频| 亚洲国产免费| 日美av在线| 中国字幕a在线看韩国电影| 韩国三级大全久久网站| 欧美交换配乱吟粗大25p| 色噜噜狠狠永久免费| 狠狠色丁香婷婷综合影院| 日韩中文字幕免费在线观看| 国产日韩一区二区在线观看| 国产又粗又猛又黄又爽| 亚洲国产一二三区| 被下部羞羞漫画| 亚洲一区二区自偷自拍| 国产精品美女www爽爽爽| 国产在线第一页| 香蕉97视频观看在线观看| 蜜桃传媒一区二区| 日本在线免费网| 日韩av不卡在线播放| 男女av免费观看| 美女一区二区三区视频| 国产成人免费视频| 天堂√中文在线| 91在线丨porny丨国产| 噜噜噜在线观看播放视频| 麻豆乱码国产一区二区三区| www.久久精品视频| 综合在线影院| 日韩久久久久久久久久| 免费黄色成年网站| 九九热这里只有精品免费看| 成人av影院在线| 欧美日韩xxx| 99久久夜色精品国产亚洲96| 97在线观看视频免费| 99视频有精品高清视频| 91视频精品| 成人av一区二区三区| 成人性做爰aaa片免费看不忠| 黄色毛片免费| 色呦呦一区二区| 国产网站无遮挡| 136av视频导航| 男人的天堂www| 天天色天天操天天做| 国产午夜福利一区二区| 激情中文字幕| 国产亚洲精品女人久久久久久| 色婷婷国产精品综合在线观看| 欧美激情护士| 亚洲欧美制服丝袜| 亚洲人线精品午夜| 日韩精品一区二区在线| 日本一区二区免费在线观看| 91网站在线观看免费| 亚洲国模精品一区| 性xxxx欧美老肥妇牲乱| a天堂视频在线观看| 九色|91porny| 在线观看h视频| 97av视频在线| 亚洲色图在线播放| 午夜无码国产理论在线| 精品国产亚洲av麻豆| 中文字幕av网址| 97caopron在线视频| 国产日产亚洲系列最新| 狠狠擦狠狠操| 黄黄的网站在线观看| 99在线精品视频免费观看20| 另类一区二区| 久久亚洲春色中文字幕久久久| 99精品欧美一区二区三区| 日韩美女视频一区| 日本一道高清亚洲日美韩| 国产福利视频一区二区三区| 26uuu精品一区二区| 丰满大乳少妇在线观看网站| 亚洲在线观看免费视频| 精品视频在线看| 精品久久久无码中文字幕| h视频免费在线观看| 亚洲欧洲精品一区| 欧美丝袜丝交足nylons| 欧美老肥妇做.爰bbww| 久久国产精品亚洲人一区二区三区| 国内偷自视频区视频综合| 特级西西444www高清大视频| 国产精品麻豆| 男人操女人的视频在线观看欧美| a级在线观看视频| 日韩a级片在线观看| 久久久久成人黄色影片| 成人在线观看www| 国产伦精品一区二区三区高清版禁| 天天想你在线观看完整版电影免费| 国产精品丝袜黑色高跟鞋| 亚洲精品一区二区18漫画| 国产亚洲一区二区三区四区| 2019亚洲日韩新视频| 天天色综合4| 国产精品2020| 视频一区视频二区视频| 亚洲男人天堂视频| 国产亚洲a∨片在线观看| 国产精品99久久久| 亚洲自拍偷拍网址| 欧美日韩久久精品| 国产精品久久久久久久久久99| 国产综合福利在线| 色香色香欲天天天影视综合网| 日本aa大片在线播放免费看| 亚洲成人蜜桃| 91九色国产在线| 欧美日韩中文字幕一区二区三区| 3d动漫一区二区三区| 国产成人无码精品久久久性色| 日韩美女视频一区二区| 日本一区二区三区视频| 久久久久久亚洲| 日韩五码电影| 3d黄动漫网站| 亚欧成人精品| 6080日韩午夜伦伦午夜伦| 欧美丝袜自拍制服另类| www.伊人久久| 婷婷综合电影| 插插插亚洲综合网| 亚洲丝袜自拍清纯另类| av超碰免费在线| 免费久久精品| www国产视频| 国产精品久久久久久久久久直播| 中文字幕成人在线| 一区二区不卡在线视频 午夜欧美不卡在| 欧美 日韩 国产 成人 在线 91| 国产精品一区av| 熟妇高潮精品一区二区三区| 国产97色在线 | 日韩| 国产麻豆a毛片| 国产电影一区二区在线观看| 国产精品久久久久999| 最新国产在线拍揄自揄视频| 日韩一本大道| 一本在线免费视频| 亚洲高清国产拍精品26u| 欧美一区二区三区成人片在线| 日韩精品美女| 四虎在线观看| 日韩欧美中文字幕一区二区三区| 日本中文字幕不卡| 香蕉视频在线网址| 亚洲 欧美 国产 另类| wwwwww99| 999精品视频在线观看| **毛片在线网站| 在线观看免费亚洲| 国产中文一区二区| 山东少妇露脸刺激对白在线| 91丨九色丨蝌蚪丨老版| 国产成人精品亚洲777人妖| 韩国精品免费视频| 亚洲黄一区二区三区| 国产aaaaaaaaa| 国产精品综合网站| 日韩一区中文字幕| 日韩在线卡一卡二| 亚洲一区二区av电影| 久久精品二区三区| 日本精品入口免费视频| 丰满的亚洲女人毛茸茸| 日本在线视频www| av免费在线观| 天堂电影一区| 男女午夜刺激视频| 欧美日韩精品二区| 国产一区二区亚洲| 91精品国产品国语在线不卡| 亚洲熟妇国产熟妇肥婆| 欧美一区二区三区免费大片| 国产精品视频播放| 欧美性videos高清精品| 国产精品久久久久久久久久久久| 国产911网站| 欧美一区二区在线免费观看| 9色在线观看| 在线网址91| 日本在线免费观看视频| 国产精品久久久久久久久鸭| 最近中文字幕在线免费观看| 亚洲av无码乱码国产精品久久| 国产精品久久久久久久龚玥菲| 春意影院午夜免费入口| 亚洲激情自拍偷拍| 国产精品密蕾丝袜| 久久不见久久见国语| 日韩情涩欧美日韩视频| 欧美性视频精品| 亚洲性av在线| 男人本色网站| 国产精品日韩二区| av小说天堂网| 国户精品久久久久久久久久久不卡| 色老板在线视频| 久久99久国产精品黄毛片入口| 欧美经典一区二区三区| 日本不卡不码高清免费观看| 伦理片一区二区| 91精品人妻一区二区| 欧美日韩一二| 欧美另类交视频| 欧美成人第一区| 中文字幕人妻熟女人妻a片| 青青青在线视频免费观看| 久久精品亚洲热| 国产成人精品自线拍| 97成人精品视频在线观看| 色婷婷激情久久| 亚洲激情av在线| 欧美人妻精品一区二区免费看| 精品一性一色一乱农村| 91九色成人| 91国偷自产一区二区三区的观看方式| 超碰在线播放97| 国产亚洲欧美日韩在线一区| 在线免费观看黄色网址| 色婷婷精品大视频在线蜜桃视频| 亚洲综合伊人久久大杳蕉| 香港伦理在线| 三级av在线播放| 国产又黄又猛又粗又爽的视频| 色综合中文字幕| 亚瑟在线精品视频| 国产精品一区二区三区在线免费观看| 国产欧美一区二区三区在线观看视频| 稀缺小u女呦精品呦| 视频三区在线| 神马影院我不卡午夜| 新狼窝色av性久久久久久| 色吧亚洲视频| 精品亚洲欧美一区| 亚洲黄色成人| 中文字幕在线国产精品| 国产又粗又爽视频| 亚洲夫妻av| 国产精品无码99re| 午夜视频在线播放| 俄罗斯xxxx性全过程| 一区二区日韩欧美| 蜜桃久久精品一区二区| 女同互添互慰av毛片观看| 国产精品视频久久久久| 春意影院普通入口| 五月婷婷色丁香| 国产一区二区免费在线观看| 91麻豆成人久久精品二区三区| 欧美日韩国产一区在线| 羞羞的视频在线看| 国产伦精品一区二区三区千人斩| 久久激情综合网| 欧美日韩亚洲精品一区二区三区| 中文字幕不卡在线| 日韩亚洲天堂| 中文字幕在线播放视频| 超碰人人在线| 久久精品国产亚洲高清剧情介绍| 三年中文高清在线观看第6集| 国产一级精品在线| 成人av电影免费在线播放| 中文字幕22页| 国产成人精品三级麻豆| 亚洲男人第一天堂| 久久综合影视| av影院午夜一区| 国产欧美日韩激情| 国产乱女淫av麻豆国产| 99视频热这里只有精品免费| 国产精品入口麻豆原神| 三妻四妾完整版在线观看电视剧| 午夜精品一区二区三区电影天堂| 印度美女freesex性hd| 欧美日韩精品一本二本三本| 日韩美女国产精品| 亚洲毛片一区二区| 国产尤物视频在线观看| 69xxxx视频| 亚洲国产欧美日韩|