WKWebView強大的新特性

来源:https://www.cnblogs.com/zhanggui/archive/2018/01/10/8260136.html
-Advertisement-
Play Games

iOS11對WKWebView的功能進一步完善,新增如下功能: ...


iOS11對WKWebView的功能進一步完善,新增如下功能:

  1. Manager Cookies
  2. Fileter unwanted content
  3. Provide custom resources

下麵是對各個特性的簡單介紹,詳細可參見源碼

1.Manager Cookies

iOS11新增了一個類來專門管理Cookies:WKHTTPCookieStore。它主要包含了了對Cookie的操作:刪除、添加、獲取等。
比如這種場景:
一個頁面預設登錄,當我沒有登錄的時候會彈出輸入框,輸入賬號。輸入完成之後,會提示已登錄。再次打開該頁面時,頁面會先判斷有沒有cookie,有cookie直接提示已登錄,沒有cookie則再次彈框讓用戶登錄。
但是現在有個新需求:第一次安裝APP,啟動的時候就有個預設的賬戶登錄,而不需要彈框輸入。這就用到了cookie的添加。在APP將要載入webView之前,通過HTTPCookie來初始化一個實例,將其塞到webView的configuration的數據存儲中。這樣載入WebView時就已經有cookie存在了。這樣就打熬了首次預設登錄的效果。關鍵代碼如下:

let cookie = HTTPCookie.init(properties: [
            .domain:"172.16.10.26",
            .path:"/src/p/index/index.html",
            .version:0,
            .expires:Date.init(timeIntervalSinceNow: 30*60*60),
            .name:"username",
            .value:"zhanggui33"
            ])
            
let cookieStore = myWKWebView.configuration.websiteDataStore.httpCookieStore
        
cookieStore.setCookie(cookie!) {
            
            self.myWKWebView.load(URLRequest.init(url: URL.init(string: "http://172.16.10.26:3333/src/p/index/index.html")!))
        }
        

也就是在載入網頁前,將cookie註入。更多可參見這裡源代碼

2.Fileter unwanted content

另外一個新特性就是過濾你不想要的內容。比如說你在app中載入的網頁中包含http請求,你可以根據以下規則將http資源載入之前轉換成https載入。這個是蘋果官方演示的一個規則:

let jsonString = """
            [{
                "trigger":{
                    "url-filter": ".*"
                },
                "action":{
                    "type": "make-https"
                }

            }]
            """

這裡主要用到了WKContentRuleListStore。下麵就來詳細對其進行介紹。

創建一個Trigger字典

一個trigger的字典必須要包含url-filter這個key,它指定了匹配url的模式。其他的就是可選的了,例如你可以限制指定的功能變數名稱,讓該功能變數名稱的內容不載入。例如下麵的這個trigger規則,制定了用於圖片和樣式資源的規則trigger,不包含某寫功能變數名稱上的:

"trigger": {
        "url-filter": ".*",
        "resource-type": ["image", "style-sheet"],
        "unless-domain": ["your-content-server.com", "trusted-content-server.com"]
}

除了上面提到的trigger key,還有url-filter-is-case-sensitive、is-domain、unless-domain、resource-type等。具體的詳細介紹可以參見官方解釋

創建一個Action字典

當trigger匹配到了符合條件的資源,瀏覽器便會執行與trigger相關聯的操作。當所有的trigger都被評估後,action便會按照順序執行。
Action只有兩個key:type和selector。type是必須要有的,selector可選,如果type是css-display-none,那麼selector也是必須要有的。其他的type中selector是可選的。
type的類型有:block、block-cookies、css-display-none、ignore-previous-rules、make-https。更多可以參見官方解釋
例如我想屏蔽頁面中所有圖片的載入:

 //把所有的圖片阻塞載入
        let jsonString = """
            [{
                "trigger":{
                    "url-filter": ".*",
                    "resource-type":["image"]
                },
                "action":{
                    "type":"block"
                }
            }]
            """
        WKContentRuleListStore.default().compileContentRuleList(forIdentifier: "demoRuleList", encodedContentRuleList: jsonString) { (list, error) in
            guard let contentRuleList = list else { return }
            let configuration = self.filterWebView.configuration
            configuration.userContentController.add(contentRuleList)
            self.filterWebView.load(URLRequest.init(url: URL.init(string: "http://m.baidu.com")!))
        }

更多詞義的解釋還是看官方文檔,裡面介紹的很詳細。

3.Provide custom resources

這個特性允許你提供自定義的資源,這也可以實現離線緩存。例如你把所有的圖片都放到app裡面,然後網頁載入圖片時按照特定的scheme(比如:wk-feature://cat)來載入,然後在客戶端代碼中使用特定的SchemeHandler來解析即可。這裡主要用到了WKURLSchemeHandler和WKURLSchemeTask。
關鍵代碼如下:

    
        let configuration = WKWebViewConfiguration()
        let schemeHandler = MyCustomSchemeHandler.init(viewController: self)
        
        configuration.setURLSchemeHandler(schemeHandler, forURLScheme: "wk-feature")

實現了自己的SchemeHandler,然後對特定的Scheme進行處理。

總結

如果你還在使用UIWebView,那麼趕快更換為WKWebView吧。畢竟蘋果更傾向於WKWebView。不斷地將其功能豐富。而且經過了幾個版本迭代,使用WKWebView的坑也都逐漸填平。

附源碼

1.WKWebViewNewFeature

參考

  1. Customized Loading in WKWebView
  2. Introduction to Safari Content-Blocking Rules

轉載請註明來源:http://www.cnblogs.com/zhanggui/p/8260136.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 對於一般的資料庫系統審計可能不太會被重視,但是對於金融系統就不一樣的。金融系統對審計要求會很高,除了了記錄資料庫各種操作記錄還可能會需要開發報表來呈現這些行為數據。使用SQL Server Audit 功能,您可以對伺服器級別和資料庫級別事件組以及單個事件進行審核。 “審核”SQL Serve ...
  • System.Data.OracleClient 已經過時了。微軟不再支持它。 因此,我建議你為. NET 使用Oracle數據提供程式:ODP.Net. 你可以從以下位置下載: 版本:Release版本Release版本 Oracle Windows ( 32位 )Oracle資料庫 11g Re ...
  • 資料庫是網路應用的基礎,良好的表結構設計,對整個應用起著至關重要的作用。 資料庫設計的步驟: 1.需求分析:數據是什麼,有哪些屬性,數據和屬性的特點 2.邏輯設計:使用ER圖對資料庫進行邏輯建模 3.物理設計:選擇資料庫系統,並對邏輯設計進行轉化 4.維護優化:追加,分拆等 實例演示(電子商務網站) ...
  • 概述 擴展存儲過程是 SQL Server 實例可以動態載入和運行的 DLL。擴展存儲過程是使用 SQL Server 擴展存儲過程 API 編寫的,可直接在 SQL Server 實例的地址空間中運行。擴展存儲過程可能會產生記憶體泄漏或其他降低伺服器的性能及可靠性的問題。固定伺服器角色 sysadm ...
  • 資料庫SQL三種迴圈語句(For、While、Loop) ...
  • 學完這本書,就把精華都寫出了 ...
  • NO是常開(NORMAL OPEN),就是通常即未通電狀態下,是斷開的,通電後在電磁線圈的作用下(吸合)處於閉合狀態。NC是常閉(NORMAL CLOSE),就是通常即未通電狀態下,是閉合的,通電後在電磁線圈的作用下(吸合)處於斷開狀態。 指接觸器、繼電器等電氣開關元件輔助觸點在常態下(未通電時)的 ...
  • 背景 iPhone X 劉海機於9月13日發佈,給科技小春晚帶來一波高潮。作為開發人員卻多出來一份憂慮,iPhone X 怎麼適配?我們 App 的腦袋會不會也長一劉海出來?Tabbar 會不會被圓角?先來看一下美團 App 的表現: 圖 1.1 啟動時的 App 表現 圖 1.2 下拉刷新之後的表 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...