一、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