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
我們可以通過設(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 }