86-Swift之WKWebView的介紹和使用

WKWebView 的介紹

WKWebView 是在Apple的WWDC 2014隨iOS 8和OS X 10.10出來的,隸屬于 WebKit 框架。它為了解決UIWebView 加載速度慢、占用內(nèi)存大的問題。

WKWebView 的特性

  • 更多的支持HTML5的特性
  • 官方宣稱的高達(dá)60fps的滾動(dòng)刷新率以及內(nèi)置手勢(shì)
  • Safari相同的JavaScript引擎
  • 將UIWebViewDelegate與UIWebView拆分成了14類與3個(gè)協(xié)議(官方文檔說明)
  • 另外用的比較多的,增加加載進(jìn)度屬性:estimatedProgress

WKWebView 的框架

784477-20161114144508482-1002417240.png

上圖個(gè)類的介紹如下:

  • WKWebViewConfiguration : 是網(wǎng)頁配置類。
  • WKPreference : 網(wǎng)頁預(yù)先先選擇配置類。
  • WKProcessPool : 網(wǎng)頁加載進(jìn)程池(資源共享)。
  • WKUserContentController: 用戶交互類(這個(gè)類主要用來做native與JavaScript的交互管理).
    *WKUserScript: 用戶腳本注冊(cè)類。
  • WKScriptMessageHandler : 用戶消息方法類(這個(gè)類專門用來處理JavaScript調(diào)用native的方法)。
    *WKNavigationDelegate:網(wǎng)頁跳轉(zhuǎn)間的導(dǎo)航管理協(xié)議,這個(gè)協(xié)議可以監(jiān)聽網(wǎng)頁的活動(dòng)。
  • WKNavigationAction :網(wǎng)頁導(dǎo)航一個(gè)按鈕。
  • WKUIDelegate: 用來處理網(wǎng)頁彈出框。
  • WKBackForwardList : 網(wǎng)頁堆棧里網(wǎng)頁列表對(duì)象。
    *WKBackForwardListItem:網(wǎng)頁節(jié)點(diǎn)對(duì)象。

WKWebView 的類的介紹

WKPreferences 的介紹

// MARK: WKPreferences 的介紹
func initializePreferences() -> WKPreferences {
    // TODO: 創(chuàng)建對(duì)象
    let preferences = WKPreferences.init()
    // TODO: 設(shè)置網(wǎng)頁的字體
    preferences.minimumFontSize  = 10
    // TODO: 設(shè)置網(wǎng)頁 JavaScript 是否可用
    preferences.javaScriptEnabled = true
    // TODO: 是否允許打開新的窗口(IOS 沒有該功能)
    preferences.javaScriptCanOpenWindowsAutomatically = false
    // TODO: 返回配置
    return preferences
}

WKUserContentController 的介紹

// MARK: WKUserContentController 的介紹
func initializeUserContentController() -> WKUserContentController {
    // TODO: 初始化
    let userContentController = WKUserContentController.init()
    // TODO: 用戶腳本的獲取
    let userScripts = userContentController.userScripts
    print(userScripts)
    // TODO: 添加腳本
    userContentController.addUserScript(WKUserScript.init(source: "腳本代碼", injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: true))
    // TODO: 刪除所有用戶的腳本
    userContentController.removeAllUserScripts()
    // TODO: 添加消息函數(shù) (發(fā)送消息的方法:window.webkit.messageHandlers.消息.postMessage(消息對(duì)象))
    userContentController.add(self as WKScriptMessageHandler, name: "消息")
    // TODO: 移除指定的添加消息
    userContentController.removeScriptMessageHandler(forName: "消息")
    // TODO: 添加內(nèi)容規(guī)則列表
    userContentController.add(WKContentRuleList.init())
    // TODO: 移除內(nèi)容規(guī)則列表
    userContentController.remove(WKContentRuleList.init())
    // TODO:移除所有的
    userContentController.removeAllContentRuleLists()
    // TODO: 返回對(duì)象
    return userContentController
}

// TODO: 發(fā)送消息的處理函數(shù)
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    
}

WKWebViewConfiguration 的介紹

// MARK: WKWebViewConfiguration 的介紹
func initializeConfiguration() -> WKWebViewConfiguration {
    // TODO: 初始化對(duì)象
    let configuration = WKWebViewConfiguration.init()
    // TODO: 創(chuàng)建WebView的內(nèi)容進(jìn)程池
    configuration.processPool = WKProcessPool.init()
    // TODO: 網(wǎng)頁首選的設(shè)置項(xiàng)
    configuration.preferences =  WKPreferences.init()
    // TODO: 將用戶內(nèi)容控制器與webView關(guān)聯(lián)起來
    configuration.userContentController = WKUserContentController.init()
    // TODO: 設(shè)置網(wǎng)頁數(shù)據(jù)緩存到內(nèi)存中在顯示
    configuration.suppressesIncrementalRendering = true
    // TODO: 網(wǎng)頁請(qǐng)求頭部 UserAgent 的設(shè)置 (User Agent中文名為用戶代理,簡稱 UA,它是一個(gè)特殊字符串頭,使得服務(wù)器能夠識(shí)別客戶使用的操作系統(tǒng)及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等)
    configuration.applicationNameForUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7"
    // TODO: 是否允許播放 AirPlay
    configuration.allowsAirPlayForMediaPlayback = true
    // TODO: 媒體播放的類型 (audio/video)
    configuration.mediaTypesRequiringUserActionForPlayback = .video
    // TODO: 媒體播放是否可以全屏控制
    configuration.allowsInlineMediaPlayback = true
    // TODO: 設(shè)置用戶在WebView 中選擇內(nèi)容的級(jí)別 (dynamic 、 character  )
    configuration.selectionGranularity = .character
    // TODO: 設(shè)置是否支持播視頻窗口浮動(dòng)(畫中畫視頻播放就將視頻播放窗口化,然后浮動(dòng)在屏幕上)
    configuration.allowsPictureInPictureMediaPlayback = true
    // TODO: 是否指示數(shù)據(jù)監(jiān)測(cè)類型 (監(jiān)測(cè)手機(jī)號(hào))
    configuration.dataDetectorTypes = .phoneNumber
    // TODO: 判斷網(wǎng)頁是否始終允許頁面的縮放
    configuration.ignoresViewportScaleLimits = false
    // TODO: 處理自定義的 ‘URL Scheme’
    configuration.setURLSchemeHandler(self as WKURLSchemeHandler, forURLScheme: "AppOpen")
    // TODO: 返回已經(jīng)注冊(cè)的 "URL Scheme" 處理對(duì)象
    let urlSchemeObject = configuration.urlSchemeHandler(forURLScheme: "AppOpen")
    print(urlSchemeObject)
    // TODO: 返回配置對(duì)象
    return configuration
}

// TODO: 處理自定的 ‘URL scheme’
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
    // 開始
}
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
    // 結(jié)束
}

WKWebView 的兩個(gè)代理的介紹

WKNavigationDelegate 的介紹

// MARK:WKNavigationDelegate 代理介紹
// TODO: 決定導(dǎo)航的動(dòng)作,通常處理跨域連接能否導(dǎo)航。
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
     
}

// TODO: 臨時(shí)導(dǎo)航創(chuàng)建時(shí)調(diào)用該方法
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    
}

// TODO: 網(wǎng)頁加載完成時(shí)
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    
}

// TODO: 導(dǎo)航網(wǎng)頁加載失敗時(shí),調(diào)用此函數(shù)
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
    
}

// TODO: 導(dǎo)航網(wǎng)頁內(nèi)容到達(dá)時(shí),調(diào)用該函數(shù)
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
    
}

// TODO: 臨時(shí)導(dǎo)航創(chuàng)建失敗時(shí),調(diào)用此函數(shù)
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
    
}


// TODO: 網(wǎng)絡(luò)身份認(rèn)證
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    
}


//TODO: 當(dāng)網(wǎng)頁內(nèi)容進(jìn)程終止時(shí),調(diào)用該函數(shù)
func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
    
}

// TODO:當(dāng)主服務(wù)器接收到服務(wù)器重定向時(shí)調(diào)用。重定向(redirection)是Web編程中的一個(gè)重要的技術(shù)。運(yùn)用重定向,你可以把控件發(fā)送到另一個(gè)servlet/JSP頁面,或?qū)eb瀏覽器(用戶)重定向到一個(gè)新的URL。
func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
    
}


// TODO: 決定是否接受響應(yīng),通過導(dǎo)航的描述信息是否允許網(wǎng)頁顯示
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    
}

WKUIDelegate 的介紹

// MARK:WKUIDelegate

// TODO: 創(chuàng)建一個(gè)WebView
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
     return WKWebView.init(frame: self.view.frame)
}

// TODO: 網(wǎng)頁移除時(shí)調(diào)用該函數(shù)
func webViewDidClose(_ webView: WKWebView) {
    
}

// TODO: 顯示一個(gè)JavaScript警告面板。如果不實(shí)現(xiàn)該方法默認(rèn)用戶選擇“OK”
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
    
}

// TODO:顯示一個(gè)JavaScript確認(rèn)面板。如果不實(shí)現(xiàn)該方法默認(rèn)用戶選擇取消
func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
     
}

// TODO: 顯示一個(gè)JavaScript文本輸入面板
func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
     
}

// TODO: 允許您的應(yīng)用程序確定給定元素是否應(yīng)該顯示預(yù)覽
func webView(_ webView: WKWebView, shouldPreviewElement elementInfo: WKPreviewElementInfo) -> Bool {
     return true
}

// TODO:允許你的應(yīng)用程序彈出到它創(chuàng)建的視圖控制器
func webView(_ webView: WKWebView, commitPreviewingViewController previewingViewController: UIViewController) {
     
}

//TODO:允許您的應(yīng)用程序提供自定義視圖控制器,以便在給定的元素被預(yù)覽時(shí)顯示
func webView(_ webView: WKWebView, previewingViewControllerForElement elementInfo: WKPreviewElementInfo, defaultActions previewActions: [WKPreviewActionItem]) -> UIViewController? {
    return UIViewController.init()
}

WKWebView 的創(chuàng)建和屬性和方法介紹

// TODO: WKWebView 是繼承與 UIView
// TODO: WKWebView 有兩個(gè)代理 WKNavigationDelegate 和 WKUIDelegate
// TODO: 網(wǎng)頁的初始化
let wkWebView = WKWebView.init(frame: self.view.frame, configuration: self.initializeConfiguration())
// TODO: 為一個(gè)請(qǐng)求創(chuàng)建一個(gè)新的導(dǎo)航
var navigation = wkWebView.load(URLRequest.init(url: URL.init(string: "")!))
// TODO: 加載本地連接
navigation = wkWebView.loadFileURL(URL.init(fileURLWithPath: " "), allowingReadAccessTo: URL.init(fileURLWithPath: ""))
// TODO: 加載 'XML'
navigation = wkWebView.loadHTMLString("", baseURL: URL.init(fileURLWithPath: ""))
// TODO: 加載二進(jìn)制數(shù)據(jù)
navigation = wkWebView.load(Data.init(), mimeType: "text/html", characterEncodingName: "UTF-8", baseURL: URL.init(string: "")!)
// TODO: 網(wǎng)頁跳轉(zhuǎn)
navigation = wkWebView.go(to: wkWebView.backForwardList.forwardList.first!)
// TODO: 獲取網(wǎng)頁的 ‘title’
let title = wkWebView.title
print(title!)
// TODO: 網(wǎng)頁加載的網(wǎng)址
let url = wkWebView.url
print(url!)
// TODO: 網(wǎng)頁是否在加載
let isload = wkWebView.isLoading
print(isload)
// TODO: 網(wǎng)頁加載進(jìn)度的獲取
let progress = wkWebView.estimatedProgress
print(progress)
// TODO: 判斷網(wǎng)頁資源是否安全加載
let isSecure = wkWebView.hasOnlySecureContent
print(isSecure)
// TODO: 獲取當(dāng)前提交的驗(yàn)證規(guī)則
let st = wkWebView.serverTrust
print(st!)
// TODO: 判斷網(wǎng)頁是否可以返回
let isCanBack = wkWebView.canGoBack
print(isCanBack)
navigation = wkWebView.goBack()
// TODO: 判斷網(wǎng)頁是否可以前進(jìn)
let isForw = wkWebView.canGoForward
print(isForw)
navigation = wkWebView.goForward()
// TODO: 網(wǎng)頁的刷新
navigation = wkWebView.reload()
// TODO: 考慮緩存情況重新加載
navigation = wkWebView.reloadFromOrigin()
// TODO: 停止網(wǎng)頁加載
wkWebView.stopLoading()
// TODO: 執(zhí)行js
wkWebView .evaluateJavaScript("js函數(shù)") { (any, error) in
    // 結(jié)果返回
}
// TODO: 是否支持手勢(shì)返回
wkWebView.allowsBackForwardNavigationGestures = true
// TODO: 設(shè)置代理字符串
wkWebView.customUserAgent = ""
// TODO: 設(shè)置是否支持連接預(yù)覽
wkWebView.allowsLinkPreview = true
// TODO: 獲取網(wǎng)頁的 ScrollView
let scrollView = wkWebView.scrollView
print(scrollView)
// TODO: 判斷網(wǎng)頁是否處理給定的 ‘URL scheme’
let isURLScheme = WKWebView.handlesURLScheme("AppOpen")
print(isURLScheme)
// TODO: 獲取網(wǎng)頁的所有證書
let isCertificateChain = wkWebView.certificateChain
print(isCertificateChain)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容