Swift —UIWebView/WKWebView的使用

UIWebView####

UIWebView功能強(qiáng)大享郊,除了能夠顯示頁面之外虹蓄,還能顯示HTML語言恤磷,CSS绘雁,PPT牧愁,Word等等,其用法也簡(jiǎn)單

//創(chuàng)建
let webView = UIWebView.init(frame:self.view.frame)

//添加
self.view.addSubview(webView)

//加載網(wǎng)頁
webView.loadRequest(NSURLRequest(url:NSURL.init(string:"http://www.reibang.com/u/1acf2b5a2f69") as! URL) as URLRequest)

//腳本注入
let jsPath =  NSBundle.mainBundle().pathForResource("app", ofType: "js")
//獲取到腳本中的內(nèi)容
var jsString :String = try! String(contentsOfFile: jsPath!, encoding: 4)
//將獲得的文本內(nèi)容后面的\n替換為空的字符串
jsString = jsString.stringByReplacingOccurrencesOfString("\n", withString: "")
//觸發(fā)腳本
 webView.stringByEvaluatingJavaScriptFromString(jsString as String)

運(yùn)行程序就能顯示出我們想看到的頁面了 红淡。不狮。


加載效果圖

有點(diǎn)時(shí)候我們加載的網(wǎng)頁頁面比較大的話 是無法的完全顯示在webView上,這個(gè)時(shí)候我們需要調(diào)節(jié)webView的scalesPageToFit屬性來實(shí)現(xiàn)頁面適應(yīng)webView區(qū)域的效果:

webView.scalesPageToFit = true
webView.scalesPageToFit = true

我們可以通過設(shè)置webView的dataDetectorTypes屬性來識(shí)別出網(wǎng)頁上的電話號(hào)碼锉屈,超鏈接荤傲,郵箱等一些特殊信息,在我們對(duì)其進(jìn)行相關(guān)操作的時(shí)候可以出發(fā)關(guān)聯(lián)事件

webView.dataDetectorTypes = .address

//dataDetectorTypes包含以下類型:
public struct UIDataDetectorTypes : OptionSet {

    public init(rawValue: UInt)

    
    public static var phoneNumber: UIDataDetectorTypes { get } // Phone number detection

    public static var link: UIDataDetectorTypes { get } // URL detection

    @available(iOS 4.0, *)
    public static var address: UIDataDetectorTypes { get } // Street address detection

    @available(iOS 4.0, *)
    public static var calendarEvent: UIDataDetectorTypes { get } // Event detection

    @available(iOS 10.0, *)
    public static var shipmentTrackingNumber: UIDataDetectorTypes { get } // Shipment tracking number detection

    @available(iOS 10.0, *)
    public static var flightNumber: UIDataDetectorTypes { get } // Flight number detection

    @available(iOS 10.0, *)
    public static var lookupSuggestion: UIDataDetectorTypes { get } // Information users may want to look up

    
    public static var all: UIDataDetectorTypes { get } // Enable all types, including types that may be added later
}

UIWebView在加載網(wǎng)頁的時(shí)候有一些對(duì)應(yīng)的狀態(tài)颈渊,我們可以進(jìn)行檢測(cè):
首先實(shí)現(xiàn)其代理:UIWebViewDelegate
然后設(shè)置其代理對(duì)象:

webView.delegate = self;

實(shí)現(xiàn)代理方法:

public protocol UIWebViewDelegate : NSObjectProtocol {

//鏈接地址發(fā)生改變的時(shí)候調(diào)用
    @available(iOS 2.0, *)
    optional public func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool

//開始加載
    @available(iOS 2.0, *)
    optional public func webViewDidStartLoad(_ webView: UIWebView)

//完成加載
    @available(iOS 2.0, *)
    optional public func webViewDidFinishLoad(_ webView: UIWebView)

//加載失敗
    @available(iOS 2.0, *)
    optional public func webView(_ webView: UIWebView, didFailLoadWithError error: Error)
}

我們還可以對(duì)webView加載狀態(tài)進(jìn)行控制,比如:停止加載终佛,繼續(xù)加載等俊嗽,其設(shè)置方法為:

//重新加載
- (void)reload;
//停止加載
- (void)stopLoading;
//返回
- (void)goBack;
//前往
- (void)goForward;

以下是UIWebView對(duì)于HTML語言,本地文件等信息的加載:

//加載HTML文本
- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;

//加載Data類型
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;

//實(shí)現(xiàn)與JS的交互
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

WKWebView####

WKWebView是蘋果在iOS 8中引入的新組件铃彰,目的是給出一個(gè)新的高性能的WebView解決方案绍豁,擺脫過去 UIWebView的老、舊牙捉、笨重竹揍,特別是內(nèi)存占用量巨大的問題,它使用Nitro JavaScript引擎邪铲,這意味著所有第三方瀏覽器運(yùn)行JavaScript將會(huì)跟safari一樣快
其使用方法和UIWebView類似芬位,但某些方面有區(qū)別。

//創(chuàng)建
let wkWebView = WKWebView()

//設(shè)置位置和大小
wkWebView.frame = self.view.frame;

//創(chuàng)建的時(shí)候就設(shè)置位置和大小
/*
    public init(frame: CGRect, configuration: WKWebViewConfiguration)
*/
let webview = WKWebView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))

//添加
self.view.addSubview(wkWebView)

//請(qǐng)求
/*
    open func load(_ request: URLRequest) -> WKNavigation?
*/

wkWebView.load(NSURLRequest(url: NSURL(string:"http://www.baidu.com") as! URL) as URLRequest)

運(yùn)行以上代碼 可以實(shí)現(xiàn)請(qǐng)求:



WKWebView的代理方法:
WKNavigationDelegate
通過WKNavigationDelegate提供的代理方法带到,我們可以追蹤WKWebView加載的過程

//頁面開始加載時(shí)調(diào)用
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)

// 頁面加載失敗時(shí)調(diào)用
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error)

// 當(dāng)內(nèi)容開始返回時(shí)調(diào)用
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!)

// 頁面加載完成之后調(diào)用
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)

頁面跳轉(zhuǎn)的代理方法有三種昧碉,分為(收到跳轉(zhuǎn)與決定是否跳轉(zhuǎn)兩種)

// 接收到服務(wù)器跳轉(zhuǎn)請(qǐng)求之后調(diào)用
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!)

// 在發(fā)送請(qǐng)求之前,決定是否跳轉(zhuǎn)
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void)

// 在收到響應(yīng)后,決定是否跳轉(zhuǎn)
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Swift.Void)


//web內(nèi)容視圖被終止的時(shí)候觸發(fā)
    @available(iOS 9.0, *)
    optional public func webViewWebContentProcessDidTerminate(_ webView: WKWebView)

WKUIDelegate

// 創(chuàng)建一個(gè)新的WebView
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView?

web界面的三種提示框(警告框被饿、確認(rèn)框四康、輸入框)分別對(duì)應(yīng)三種代理方法

/**
 *  web界面中有彈出警告框時(shí)調(diào)用
 *  @param webView           實(shí)現(xiàn)該代理的webview
 *  @param message           警告框中的內(nèi)容
 *  @param frame             主窗口
 *  @param completionHandler 警告框消失調(diào)用
 */
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Swift.Void)

/**
 *  web界面中有彈出確認(rèn)框時(shí)調(diào)用
 *  @param webView           實(shí)現(xiàn)該代理的webview
 *  @param message           確認(rèn)框中的內(nèi)容
 *  @param frame             主窗口
 *  @param completionHandler 確認(rèn)框消失調(diào)用
 */
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Swift.Void)

/**
 *  web界面中有彈出輸入框時(shí)調(diào)用
 *  @param webView           實(shí)現(xiàn)該代理的webview
 *  @param message           輸入框中的內(nèi)容
 *  @param frame             主窗口
 *  @param completionHandler 輸入框消失調(diào)用
 */
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Swift.Void)

WKScriptMessageHandler

    @available(iOS 8.0, *)
    public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)

這個(gè)方法是WKscriptMessageHandler協(xié)議中必須實(shí)現(xiàn)的方法,是提高App與web端交互的關(guān)鍵狭握,它可以直接將接收到的JS腳本轉(zhuǎn)為OC或Swift對(duì)象闪金。

獲取網(wǎng)頁標(biāo)題
需要遵守WKNavigationDelegate協(xié)議并設(shè)置:webview.navigationDelegate = self
網(wǎng)頁加載完的時(shí)候我們能獲取網(wǎng)頁的標(biāo)題,所以這個(gè)步驟應(yīng)該寫在網(wǎng)頁狀態(tài)加載完成的方法里面:

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

獲取當(dāng)前網(wǎng)頁的url

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction:WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) ->Void) {
         
var urlString:NSString! = navigationAction.request.URL?.absoluteString

decisionHandler(WKNavigationActionPolicy.Allow)//一定要加上這一句代碼不然會(huì)出異常          
}

前進(jìn)论颅,后退哎垦,停止。嗅辣。撼泛。
WKWebView想U(xiǎn)IWebView一樣,可以獲取一些狀態(tài)澡谭,以及進(jìn)行對(duì)應(yīng)操作

open func reload()//重新加載

open func stopLoading()//停止加載
    
open func goBack()//返回

open func goForward()//前進(jìn)
 
//能不能后退 前往 加載
open var canGoBack: Bool { get }

open var canGoForward: Bool { get }

open var isLoading: Bool { get }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愿题,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛙奖,更是在濱河造成了極大的恐慌潘酗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雁仲,死亡現(xiàn)場(chǎng)離奇詭異仔夺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)攒砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門缸兔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吹艇,你說我怎么就攤上這事惰蜜。” “怎么了受神?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵抛猖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鼻听,道長(zhǎng)财著,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任撑碴,我火速辦了婚禮撑教,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灰羽。我一直安慰自己驮履,他們只是感情好鱼辙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玫镐,像睡著了一般倒戏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恐似,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天杜跷,我揣著相機(jī)與錄音,去河邊找鬼矫夷。 笑死葛闷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的双藕。 我是一名探鬼主播淑趾,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼忧陪!你這毒婦竟也來了扣泊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤嘶摊,失蹤者是張志新(化名)和其女友劉穎延蟹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叶堆,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阱飘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虱颗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沥匈。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忘渔,靈堂內(nèi)的尸體忽然破棺而出咐熙,到底是詐尸還是另有隱情,我是刑警寧澤辨萍,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站返弹,受9級(jí)特大地震影響锈玉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜义起,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一拉背、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧默终,春花似錦椅棺、人聲如沸犁罩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽床估。三九已至,卻和暖如春诱渤,著一層夾襖步出監(jiān)牢的瞬間丐巫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工勺美, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留递胧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓赡茸,卻偏偏與公主長(zhǎng)得像缎脾,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子占卧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容