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