Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios WKWebView没有';不要使用URLCache_Ios_Swift_Wkwebview_Nsurlcache_Urlcache - Fatal编程技术网

Ios WKWebView没有';不要使用URLCache

Ios WKWebView没有';不要使用URLCache,ios,swift,wkwebview,nsurlcache,urlcache,Ios,Swift,Wkwebview,Nsurlcache,Urlcache,我有一个应用程序,它使用UIWebView显示一些本地内容。我还有一个自定义的URLCache,用于拦截请求并用本地内容替换它们: 类LocalWebViewCache:URLCache{ 打开覆盖函数cachedResponse(对于请求:URLRequest)->CachedURLResponse{ 如果url.absoluteString.range(共:http://localhost)=零{ 返回cacheDelegate?.HandlerRequest(请求) } 归零 } } 我

我有一个应用程序,它使用
UIWebView
显示一些本地内容。我还有一个自定义的
URLCache
,用于拦截请求并用本地内容替换它们:

类LocalWebViewCache:URLCache{
打开覆盖函数cachedResponse(对于请求:URLRequest)->CachedURLResponse{
如果url.absoluteString.range(共:http://localhost)=零{
返回cacheDelegate?.HandlerRequest(请求)
}
归零
}
}
我在
AppDelagate
中将此缓存注册为:

var cache:LocalWebViewCache=LocalWebViewCache(内存容量:20*1024*1024,
磁盘容量:100*1024*1024,
磁盘路径:无)
URLCache.shared=cache
现在一切正常但是苹果拒绝了新版本的应用程序,因为我使用的是
UIWebView
,而且它已经被弃用了,所以我用
WKWebView
替换了
UIWebView
,而webkit似乎不尊重共享缓存(
URLCache.shared

我试图用
URLProtocol
WKURLSchemeHandler
截取
WKWebView
请求,但没有成功

如有任何帮助或建议,我将不胜感激。

URLProtocol
code:

在Appdelagate中:

URLProtocol.registerClass(MyProtocol.self)
类MyProtocol:URLProtocol{
重写类func canInit(带有请求:URLRequest)->Bool{
打印(“canInit:\(字符串(描述:request.url)))
返回真值
}
重写init(请求:URLRequest,cachedResponse:CachedURLResponse?,客户端:URLProtocolClient?){
打印(“init:\(字符串(描述:request.url)))
init(请求:请求,缓存响应:缓存响应,客户端:客户端)
}
重写类func canonicalRequest(对于请求:URLRequest)->URLRequest{
打印(“canonicalRequest:\(字符串(描述:request.url)))
退货申请
}
覆盖函数加载(){
打印(“惊人的加载:\(字符串(描述:request.url)))
}
}
在所有这些方法中,只调用了
canInit(带request:URLRequest)
,这不是很有帮助

WKURLSchemeHandler
code:

类MySchemeHandler:NSObject,WKURLSchemeHandler{
func webView(webView:WKWebView,start urlSchemeTask:WKURLSchemeTask){
打印(“开始:\(字符串(描述:urlSchemeTask.request.url?.absoluteString)))
}
func webView(webView:WKWebView,stop-urlSchemeTask:WKURLSchemeTask){
打印(“停止:\(字符串(描述:urlSchemeTask.request.url?.absoluteString)))
}
}
webkit.configuration.setURLSchemeHandler(MySchemeHandler(),forURLScheme:“localhost”)
加载(url)请求(url:url(字符串):localhost://google.com")!))
但是
webView(webView:WKWebView,start urlSchemeTask:wkurschemetask)和
webView(webView:WKWebView,stop urlSchemeTask:wkurschemetask)
都没有被调用


编辑1:通过在url开头附加
localhost://
加载本地资源,并通过
WKURLSchemeHandler
进行处理:

让testStr=”“”
这是一个段落

这是另一段

"""
lazy-var-webView:WKWebView={
让webConfiguration=WKWebViewConfiguration()
网络配置
.setURLSchemeHandler(MySchemeHandler(),forURLScheme:“localhost”)
让webView=WKWebView(帧:.0,配置:webConfiguration)
webView.translatesAutoresizingMaskIntoConstraints=false
返回webView
}()
webView.loadHTMLString(testStr,baseURL:URL(字符串:“localhost”))
类MySchemeHandler:NSObject,WKURLSchemeHandler{
让testCss=“”
@字体{
字体系列:“特殊”;
字体大小:正常;
字体风格:普通;
src:url(../font/special.ttf);
}
.test_class1{
字体大小:粗体;
颜色:#007D6E;
字体系列:“特殊”!重要;
文本对齐:居中!重要;
}
.2级考试{
字体大小:粗体;
颜色:#FF7D6E;
文本对齐:居中!重要;
}
"""
func webView(uuwkwebview,启动urlSchemeTask:wkurschemetask){
打印(“开始:\(字符串(描述:urlSchemeTask.request.url?.absoluteString)))
guard let url=urlSchemeTask.request.url else{
返回
}
如果url.absoluteString.contains(“style.css”){
让数据=数据(testCss.utf8)
urlSchemeTask.didReceive(url:url,
mimeType:“文本/css”,
expectedContentLength:数据
计数
text编码名称:nil)
urlSchemeTask.didReceive(数据)
urlSchemeTask.didfish()
}
}
func webView(uuwkwebview,停止urlSchemeTask:wkurschemetask){
打印(“停止:\(字符串(描述:urlSchemeTask.request.url?.absoluteString)))
}
}
在日志中,我可以看到本地资源触发了
start
方法:

start: Optional("localhost://../styles/style.css")
start: Optional("localhost://../fonts/special.ttf")
但是如果我从
start
方法根本不会被触发let webview: WKWebView let config = WKWebViewConfiguration() config.setValue(true, forKey: "_setOfflineApplicationCacheIsEnabled") webview = WKWebView(frame: .zero, configuration: config)
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    // you may need to use .linkActivated depending on how users are navigating
    if navigationAction.navigationType == .other  {
        if let request = navigationAction.request.url {
            if request.absoluteString.hasPrefix("https://somePrefix") {
                // for test
               // guard let localRedirect = URL.init(string: "https://google.com") else {
                guard let localRedirect = URL.init(string: "localhost://someUrl") else {
                    decisionHandler(.allow)
                    return
                }
                decisionHandler(.cancel)
                // for test
                // webView.load(URLRequest.init(url: URL.init(string: "https://www.google.com")!))
                webView.loadFileURL(localRedirect, allowingReadAccessTo: localRedirect.deletingLastPathComponent()) // delete last path component if you have other things that the page will load in that directory, like images or css
                return
            }
        }
    }
    decisionHandler(.allow)
}
self.schemeHandler = MySchemeHandler()
self.webview = WKWebView(frame: .zero, configuration: {
    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.setURLSchemeHandler(self.schemeHandler, 
                                         forURLScheme: "localhost")
    return webConfiguration
}())