2015-08-20 63 views
2

我有一個加載網頁的應用程序,但可以阻止圖像,字體,JavaScript等的下載。爲此,我實現了一個NSURLProtocol子類,它與UIWebView非常相配。如何阻止外部資源加載WKWebView?

但是我正在遷移到WKWebview,並意識到我製作的NSURLProtocol類不再能夠過濾掉這些資源。

有沒有人瞭解如何實現過濾/阻塞?

如果你想知道我怎麼做遷移,我開始與這個職位:http://floatlearning.com/2014/12/uiwebview-wkwebview-and-tying-them-together-using-swift/

回答

1

由於iOS的11你可以使用WKContentRuleList

首先,創建內容規則或列表。每條規則都由一個觸發器和一個動作組成。見 Apple's Documentation on Content Rule creation

這是一個創建實例,阻止所有圖像和樣式表的內容,但允許通過忽略以前的規則的方式對JPEG的結束:

 let blockRules = """ 
     [{ 
      "trigger": { 
       "url-filter": ".*", 
       "resource-type": ["image"] 
      }, 
      "action": { 
       "type": "block" 
      } 
     }, 
     { 
      "trigger": { 
       "url-filter": ".*", 
       "resource-type": ["style-sheet"] 
      }, 
      "action": { 
       "type": "block" 
      } 
     }, 
     { 
      "trigger": { 
       "url-filter": ".*.jpeg" 
      }, 
      "action": { 
       "type": "ignore-previous-rules" 
      } 
     }] 
     """   

有規則清單,你可以將它們添加到ContentRuleListStore

import WebKit 
    @IBOutlet weak var wkWebView: WKWebView! 

    let request = URLRequest(url: URL(string: "https://yourSite.com/")!) 

    WKContentRuleListStore.default().compileContentRuleList(
     forIdentifier: "ContentBlockingRules", 
     encodedContentRuleList: blockRules) { (contentRuleList, error) in 

      if let error = error { 
       return 
      } 

      let configuration = self.webView.configuration 
      configuration.userContentController.add(contentRuleList!) 

      self.wkWwebView.load(self.request) 
    } 

如果以後要刪除所有的規則,請致電:

self.wkWebView.configuration.userContentController.removeAllContentRuleLists() 
    self.wkWebView.load(self.request) 

這裏是2017 WWDC video

最佳盧克斯的!

我創建了一個示例項目on Github WKContentRuleExample

3

由於iOS的9.0的,沒有辦法攔截的WKWebView網絡請求。您可以通過有限的方式使用JavaScript來做到這一點。

請提交WebKit錯誤或Apple錯誤以請求此功能。我們很多人都需要這些鉤子。

+0

我會說這不是WebKit的錯誤。 Android已經有相當長的一段時間了。阻止圖像加載(以及其他許多事情)從一開始就一直存在。蘋果公司根本沒有公開這些功能。 – Russ

+1

提交錯誤是讓蘋果知道這是我們可以訪問的功能的最佳方式。 –