SwiftWKWebView詳細闡述

一、WKWebView概述

WKWebView是一個在iOS8及以上版本中推出的基於WebKit引擎的Web視圖控件,它可以顯示網頁,並且支持網頁交互。它是在UIWebView的基礎上進行了大量改進,比如提高了渲染速度、內存佔用更小、JavaScript執行速度更快、支持了WebKit的新特性等。WKWebView主要提供了以下功能:

1、加載Web頁面,並且支持顯示HTML、CSS、JavaScript等網頁內容;

2、通過JavaScript交互,實現Web頁面與原生代碼的雙向通信;

3、可以進行縮放、前進、後退、刷新等基本的Web導航操作;

4、可以顯示PDF、圖片等非HTML格式的內容。

二、WKWebView常用操作

1、加載網頁

    if let url = URL(string: "https://www.example.com") {
        let request = URLRequest(url: url)
        webView.load(request)
    }

使用URL初始化一個URLRequest對象,然後通過load函數將URLRequest傳入WebView中,即可加載網頁。

2、JavaScript交互

// 將函數注入到JavaScript環境中
webView.configuration.userContentController.add(self, name: "myFunction")
    
// 在加載完成的代理方法中注入JavaScript代碼
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    let js = "function myFunction() { /*代碼實現*/ }"
    webView.evaluateJavaScript(js, completionHandler: nil)
}

// 通過JavaScript調用原生代碼
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "myFunction" {
        //獲取傳入的參數
        if let dict = message.body as? [String:Any] {
           //處理數據
        }
    }
}

使用add函數將原生代碼中的函數名注入到JavaScript環境中,然後在加載完成的代理方法中通過evaluateJavaScript函數將JavaScript代碼注入到WebView中,在JavaScript中可以通過window.webkit.messageHandlers.myFunction.postMessage()調用原生代碼中的函數。

3、前進、後退、刷新

// 前進
webView.goForward()

// 後退
webView.goBack()
    
// 刷新
webView.reload()

使用goForward、goBack、reload函數即可進行基本的導航操作。

三、WKWebView高級操作

1、JavaScript與原生數據交互

// 在JS中調用window.webkit.messageHandlers.getData.postMessage("parameter");
let config = WKWebViewConfiguration()
let userContentController = WKUserContentController()
let script = WKUserScript(source: "window.webkit.messageHandlers.getData.postMessage('parameter');", injectionTime: .atDocumentEnd, forMainFrameOnly: true)
userContentController.add(self, name: "getData")
userContentController.addUserScript(script)
config.userContentController = userContentController
let webView = WKWebView(frame: .zero, configuration: config)
    
// 在原生代碼中處理數據
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "getData" {
        //獲取傳入的參數
        if let dict = message.body as? [String:Any] {
            //處理數據
            let parameter = dict["parameter"] as? String
            // 返回數據
            let javascript = "yourFunction('\(result)')"
            webView.evaluateJavaScript(javascript, completionHandler: nil)
        }
    }
}

在JS中調用window.webkit.messageHandlers.方法名.postMessage(‘參數’)來觸發原生代碼中的方法,原生代碼中通過WKScriptMessage的body屬性來獲取傳入的參數,處理數據後通過evaluateJavaScript函數返回數據。

2、WebView截圖

webView.takeSnapshot(with: nil) { (image, error) in
    if let snapshotImage = image {
        //處理截圖
    }
}

使用takeSnapshot函數進行WebView截圖操作,通過回調函數獲取截取到的圖片,可以進行後續的處理。

3、網頁離線緩存

let url = URL(string: "https://www.example.com")
let config = WKWebViewConfiguration()
let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
let fullPath = cachePath + "/myCache"
let cache = URLCache(memoryCapacity: 4 * 1024 * 1024, diskCapacity: 20 * 1024 * 1024, diskPath: fullPath)
config.urlCache = cache
if let webView = WKWebView(frame: self.view.bounds, configuration: config) {
    let request = URLRequest(url: url!, cachePolicy: .returnCacheDataElseLoad, timeoutInterval: 15.0)
    webView.load(request)
    view.addSubview(webView)
}

使用URLCache可以實現網頁離線緩存,提高用戶的瀏覽體驗。可以通過設置URLCache的memoryCapacity(內存緩存大小)、diskCapacity(磁盤緩存大小)等屬性來控制緩存的大小。在加載網頁時,使用URLRequest的cachePolicy屬性來設置緩存策略。

四、WKWebView問題處理

1、WebKit內存泄露

在長時間運行的情況下,WKWebView可能會產生內存泄露的問題,一些資源無法釋放,導致內存佔用越來越高。這時可以通過手動釋放資源,以及設置緩存大小等方式來減少內存泄露的風險。

2、JavaScript交互問題

在進行JavaScript交互時,容易出現數據傳輸錯誤、JS環境沒加載完就調用函數等問題。可以通過設置WKUserContentController的scriptMessageHandler屬性來避免出現這些問題。

3、WKWebView加載失敗

在加載過程中,可能會出現因為網絡等原因導致WebView無法加載頁面的問題。可以通過設置config對象的preferences屬性的minimumFontSize等屬性、request對象的timeoutInterval等屬性來提高網頁加載成功率。

五、總結

通過以上的闡述,我們可以看到WKWebView是一個功能強大的Web控件。它具備良好的交互性能、高效的渲染速度、完善的JavaScript支持等特點,可以滿足多種場景的需求。在使用過程中,需注意處理內存泄露、合理設置緩存、處理好JS交互等問題,以達到更好的用戶體驗。

原創文章,作者:FCZPY,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/360745.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FCZPY的頭像FCZPY
上一篇 2025-02-24 00:33
下一篇 2025-02-24 00:33

相關推薦

  • index.html怎麼打開 – 詳細解析

    一、index.html怎麼打開看 1、如果你已經擁有了index.html文件,那麼你可以直接使用任何一個現代瀏覽器打開index.html文件,比如Google Chrome、…

    編程 2025-04-25
  • Resetful API的詳細闡述

    一、Resetful API簡介 Resetful(REpresentational State Transfer)是一種基於HTTP協議的Web API設計風格,它是一種輕量級的…

    編程 2025-04-25
  • 關鍵路徑的詳細闡述

    關鍵路徑是項目管理中非常重要的一個概念,它通常指的是項目中最長的一條路徑,它決定了整個項目的完成時間。在這篇文章中,我們將從多個方面對關鍵路徑做詳細的闡述。 一、概念 關鍵路徑是指…

    編程 2025-04-25
  • neo4j菜鳥教程詳細闡述

    一、neo4j介紹 neo4j是一種圖形數據庫,以實現高效的圖操作為設計目標。neo4j使用圖形模型來存儲數據,數據的表述方式類似於實際世界中的網絡。neo4j具有高效的讀和寫操作…

    編程 2025-04-25
  • AXI DMA的詳細闡述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基於AMBA…

    編程 2025-04-25
  • c++ explicit的詳細闡述

    一、explicit的作用 在C++中,explicit關鍵字可以在構造函數聲明前加上,防止編譯器進行自動類型轉換,強制要求調用者必須強制類型轉換才能調用該函數,避免了將一個參數類…

    編程 2025-04-25
  • HTMLButton屬性及其詳細闡述

    一、button屬性介紹 button屬性是HTML5新增的屬性,表示指定文本框擁有可供點擊的按鈕。該屬性包括以下幾個取值: 按鈕文本 提交 重置 其中,type屬性表示按鈕類型,…

    編程 2025-04-25
  • Vim使用教程詳細指南

    一、Vim使用教程 Vim是一個高度可定製的文本編輯器,可以在Linux,Mac和Windows等不同的平台上運行。它具有快速移動,複製,粘貼,查找和替換等強大功能,尤其在面對大型…

    編程 2025-04-25
  • crontab測試的詳細闡述

    一、crontab的概念 1、crontab是什麼:crontab是linux操作系統中實現定時任務的程序,它能夠定時執行與系統預設時間相符的指定任務。 2、crontab的使用場…

    編程 2025-04-25
  • 網站測試工具的詳細闡述

    一、測試工具的概述 在軟件開發的過程中,測試工具是一個非常重要的環節。測試工具可以快速、有效地檢測軟件中的缺陷,提高軟件的質量和穩定性。與此同時,測試工具還可以提高軟件開發的效率,…

    編程 2025-04-25

發表回復

登錄後才能評論