Ios 如何阻止外部资源加载到WKWebView?

Ios 如何阻止外部资源加载到WKWebView?,ios,ios8,wkwebview,Ios,Ios8,Wkwebview,我有一个加载网页的应用程序,但阻止下载图像、字体、Java脚本等。为此,我实现了一个NSURLProtocol子类,它与UIWebView配合得非常好 然而,我正在迁移到WKWebview,并意识到我精心设计的NSURLProtocol类不再能够过滤掉这些资源 有人知道如何实现过滤/阻止吗 如果你想知道我是如何进行迁移的,我从这篇文章开始:从iOS 9.0开始,没有办法拦截网络对WKWebView的请求。您可以通过JavaScript以有限的方式实现这一点 请提交WebKit错误或Apple错误

我有一个加载网页的应用程序,但阻止下载图像、字体、Java脚本等。为此,我实现了一个
NSURLProtocol
子类,它与UIWebView配合得非常好

然而,我正在迁移到
WKWebview
,并意识到我精心设计的
NSURLProtocol
类不再能够过滤掉这些资源

有人知道如何实现过滤/阻止吗


如果你想知道我是如何进行迁移的,我从这篇文章开始:

从iOS 9.0开始,没有办法拦截网络对
WKWebView的请求。您可以通过JavaScript以有限的方式实现这一点


请提交WebKit错误或Apple错误以请求此功能。我们中的许多人都需要这些挂钩。

自从iOS 11以来,您可以使用
WKContentRuleList

首先,创建一个内容规则或列表。每个规则由一个触发器和一个操作组成。看见

这是一个创建示例,阻止所有图像和样式表内容,但允许通过忽略前面的规则以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)
这是你的电话号码

祝你好运


我创建了一个示例项目

,以防其他人对仅脱机的
WKWebView感兴趣:以下方法是对@dequin答案的修改。它使用内容阻止规则阻止对远程资源的所有请求(不以
文件开头的URL://
):

导入可可粉
导入WebKit
//阻止所有URL,但以“file://”开头的URL除外
让区块规则=”“
[
{
“触发器”:{
“url筛选器”:“*”
},
“行动”:{
“类型”:“块”
}
},
{
“触发器”:{
“url筛选器”:“文件://.*”
},
“行动”:{
“类型”:“忽略以前的规则”
}
}
]
"""
/`WKWebView`只允许加载本地资源
离线WebView类:WKWebView{
重写初始化(帧:CGRect,配置:WKWebViewConfiguration){
WKContentRuleListStore.default().compileContentRuleList(
forIdentifier:“ContentBlockingRules”,
EncodedContentureList:块规则
){contentRuleList,出现错误
如果let error=error{
//处理错误
}如果让contentRuleList=contentRuleList,则为else{
configuration.userContentController.add(contentRuleList)
}否则{
//处理错误
}
}
init(帧:帧,配置:配置)
}
}

我想说这不是一个WebKit bug。安卓已经有相当长的一段时间能够做到这一点。阻止图像加载(以及其他许多事情)从一开始就存在。苹果根本没有公开这些功能。提交一个bug是让苹果知道这是我们可以访问的功能的最好方式。@StefanArentz关于如何在iOS<11上实现它的任何提示?@NicholasAllio只是一个想法:也许你可以在网页开始加载资源之前,将内容安全策略元标签插入到网页中。在WKUserScripts的帮助下,您可能会对适用于iOS<11的实现提出任何建议?抱歉,目前还没有。在iOS 11之前找不到任何API如何阻止外部资源在iOS 10的WKWebView上加载?据我所知,iOS 11之前没有阻止资源