WKWebView对网页和js,css,png等资源文件的缓存机制及如何刷新缓存

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: WKWebView对网页和js,css,png等资源文件的缓存机制及如何刷新缓存

WKWebView对网页和js,css,png等资源文件都进行缓存。iOS8是采用清除js本地文件方法刷新缓存,iOS9及以后调用WKWebView清除缓存接口按照指定时间戳清楚缓存(由于是批量清除缓存可以用在用户登出清除数据,设置页面缓存数据清理)。最佳解决方案是js中对每一个网址,js,css,png等资源文件下载地址都加版本号,这样既利用了WKWebView缓存机制又实现了他们按照需要刷新。

WKWebView在独立于app进程之外的进程中执行网络请求,请求数据不经过主进程。不使用NSURLProtocol进行拦截你将看不到js,css,png文件的下载请求,也不能准确获取页面html代码(NSString *url = [NSString stringWithContentsOfURL:webView.URL encoding: NSUTF8StringEncoding error:nil];

NSLog(@“webView.URL:%@”,url);)。WKWebView 是一个多进程组件。在不注册 http(s) scheme的情况下,它都是独立运行的,作为进程它有自己的沙盒,它的缓存机制都是基于自己的沙盒进行的,但是它会在请求的不同时机回调app的代理函数,同步数据到app自己的沙盒。并且canInitWithRequest拦截到请求很少,js,cs,png等资源请求拦截不到。最显然的是fsCachedData目录下只有一个文件,而UIWebView这个文件夹下是存的绝大多书网页数据。有人说可以通过删除fsCachedData目录下的所有文件来刷新缓存,通过代码获得的html网页也都是第一微信授权的网页,当前html网页代码无法拿到。那是傻白甜,根本没有实际测试过。你想想WKWebView和app就不运行在一个进程中,网页数据也不在fsCachedData目录下,你删吧删吧,我不怕,因为我不在你家。所以你要想研究WKWebView的缓存机制,那么你就需注册 http(s) scheme。

在注册 http(s) scheme([NSURLProtocol wk_registerScheme:@“https”];具体SURLProtocol怎么用,大家在网上搜索一下吧,后期我会写一篇关于js标签图片在iOS替换的文章有相关的介绍)的情况下,app的canInitWithRequest函数会拦截该应用向服务器发送的所有https网络请求(包括js,cs,png等资源请求,注意:拦截的请求是WKWebView在HTTPHeaderField加入cookie前的请求,所以在canInitWithRequest函数打印:

NSLog(@”canInitWithRequest request.URL.absoluteString = %@,请求方式 == %@,scheme:%@,request.allHTTPHeaderFields:%@”,urlStr,request.HTTPMethod,scheme, request.allHTTPHeaderFields);

得到是null,如:

2018-08-23 14:16:51.390805+0800 ArtEnjoymentWeChatAuction[12030:1142813] canInitWithRequest request.URL.absoluteString = https://m.1-joy.com/market/product/cat/list.htm,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:(null))。

可以通过下面代码获取绝大部份网页实时的html地址(一个网页地址有两个网页地址组成网址,didFinishNavigation函数不回调,所以无法在该函数拦截html内容):

-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    
    NSString *url = [NSString stringWithContentsOfURL:webView.URL encoding: NSUTF8StringEncoding error:nil];
    NSLog(@"webView.URL:%@",url);
}

注意:不能在canInitWithRequest拦截html网页内容,否则应用卡死(NSLog(@“canInitWithRequest request.URL.absoluteString html = %@”,[NSString stringWithContentsOfURL:request.URL encoding: NSUTF8StringEncoding error:nil]);相当于挂掉)。

下面是拦截部分资源下载日志:

2018-08-23 17:10:35.789991+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://3rd.m.1-joy.com/market/statics/framework7/css/framework7.ios.min.css?t=20170913,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "text/css,*/*;q=0.1";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.790651+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://3rd.m.1-joy.com/market/statics/framework7/css/framework7.ios.colors.min.css?t=20170913,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "text/css,*/*;q=0.1";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.793056+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://3rd.m.1-joy.com/market/statics/iconfont/iconfont.css?t=201709040,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "text/css,*/*;q=0.1";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.793356+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/css/portal/homepage.css?t=201808201,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "text/css,*/*;q=0.1";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.831559+0800 ArtEnjoymentWeChatAuction[12762:1212644] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/ad/2018-08-16/1534381323636.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.834105+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/product/cat/cat_saving.gif,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.840877+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/product/cat/success.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.841287+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/gift/agent/icon_agent1.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.842194+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/gift/agent/icon_manage0.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.843483+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/gift/agent/icon_mine.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.855106+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/js/weipaiApp.js?t=20180711,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "*/*";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:35.855898+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://3rd.m.1-joy.com/market/statics/requirejs/require.min.js,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "*/*";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:36.310192+0800 ArtEnjoymentWeChatAuction[12762:1212497] canInitWithRequest request.URL.absoluteString = https://retcode.alicdn.com/retcode/bl.js,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "*/*";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:36.348154+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://pingjs.qq.com/h5/stats.js?v2.0.4,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "*/*";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:36.375037+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-17/38420834086211791132.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:36.375668+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-17/38423043293403921636.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:36.379911+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-19/38611798295143741803.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:36.384717+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-17/38436551652203585654.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:36.387161+0800 ArtEnjoymentWeChatAuction[12762:1212645] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-19/38558784537883998985.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}
2018-08-23 17:10:36.490542+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/js/require.config.js?t=201808231,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
    Accept = "*/*";
    Referer = "https://m.1-joy.com/market/product/cat/list.htm";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
}

第一次app安装运行进入h5页面后,你几乎可以看到所有的资源请求,当页面加载完毕,再次运行发现这些请求被拦截到的很少了,当你第三次关闭应用再次进入该h5页面,你发现,这些资源请求都不发送了。只有下面这三个请求了,一个阿里云统计请求,一个微信授权相关的请求,一个html请求。拦截不到请求说明没有下载资源,第二次运行应用进入对应页面,虽然拦截到少量的请求,实际上这少量的请求也没有下载只是取本地数据,并非是拦截到请求就一定远程下载资源。当然你进入h5页面,点击进入另一个h5页面(同一个UIViewController)再返回,那么也没有拦截资源请求。

那个返回的情况,WKWebView帮你把所有资源(包括html内容),所以返回很快。只所以出现app第二次进入h5页面,有少部分资源拦截到请求,是因为app和WKWebView在同步资源,只所以出现第三次进入h5页面所有资源请求(不包括html页面内容请求)都没有发送,那是因为WKWebView的缓存机制生效,取的本地资源。

html页面被加载有一个显著标志是加载进度显示进度,但是进度条显示进度并非说向服务器发送了请求,同时显示加载进度条也是原生页面和h5页面的一个最显著标志。当进入下一个h5页面(同一个UIViewController,页面跳转由h5自己控制)再返回,显然可以看到速度飞快,可见它吧整个页面的数据都缓存了。WKWebView返回时使用的是本地数据最直接的证据,进入下一个h5页面,把手机设置成飞行模式,然后返回上一个页面,你会看到能正常返回,可以看到它缓存了访问过的数据。但是你在飞行模式下在点击进入刚才进入的页面,页面加载错误。所以WKWebView是缓存前面访问过的所有页面(包括html内容),但是不是你访问过这个页面返回了再次进入就全部取本地数据,至少html内容需要重新获取,cs,js,png等资源文件取的缓存数据。若用户从A页面进入B页面(同一个UIViewController,页面跳转由h5自己控制),在B页面操作过后想强制刷新A页面怎么办。其实你返回到A页面后调用这句话([self.wkWebView reload];)就能强制刷新A页面。真正大头的费时间费流量的不是html文件,也不是cookie,而是cs,js,png等资源文件。那么如何刷新这些资源呢?由于WKWebView的fsCachedData文件夹下只有一个文件,并且WKWebView是一个独立进程,你删除并不能清楚WKWebView的数据。经过测试在删除fsCachedData文件夹,关闭应用在此进入应用,资源请求不被重新下载,所以删除fsCachedData文件夹不能清除缓存数据。

你想清除缓存只需要删除NetworkCache文件夹及其下面的文件就能保证所有资源重新下载,我已经进行过测试。这是最低支持iOS 8的解决方案,因为iOS 9以上有针对WKWebView的清缓存API,很显然上面的方法会有弊端。。。。。。以上方法,可以删除jsp的,但是不能删除HTML静态资源的那种,不知道是什么原因,反正我测试了一下,就是无法清除静态静态资源。html和jsp的区别–静态页面和动态页面的区别 。代码如下:

- (void)clearWbCache{
    //    (NSHomeDirectory)/Library/Caches/(current application name, [[NSProcessInfo processInfo] processName])
    // 清除缓存
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];
    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
    // 清除磁盘(上面两句就是已经执行好了,下面只是一个思路)  路径来源可以看上面的图(不过这里)
    /*
    NSString *libraryDir = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask, YES)[0];
    NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
    NSString *webkitFolderInLib = [NSString stringWithFormat:@"%@/WebKit",libraryDir];
    NSString *webKitFolderInCaches = [NSString stringWithFormat:@"%@/Caches/%@/WebKit",libraryDir,bundleId];
    NSError *error;
    [[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCaches error:&error];
    [[NSFileManager defaultManager] removeItemAtPath:webkitFolderInLib error:nil];
    */
    }
iOS 9之后有了新的API

// 清除部分,可以自己设置
// NSSet *websiteDataTypes= [NSSet setWithArray:types];

// 清除所有
NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];

     Date from

    NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];

     Execute

    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{

        // Done
        NSLog(@"清楚缓存完毕");

    }];

URL更新的时候带上版本号

其实每次你URL没有更新,但是你的内容已经更新了,由于缓存的原因,你还是只能读取缓存,这个时候你让地址都带上版本号,就能区别统一url下缓存了。

由于苹果就是以网页的url和资源的url来缓存数据。至于url和文件名的对应关系我测试很多编码方式也没有试出来,苹果也没有公开这种加密方法。

该方法适用于网页的url地址和cs,js,png等资源的缓存与刷新标准。所以想对资源进行刷新,只需要发布js网页时修改资源地址对应的版本号就可以。最好对所有js页面设置管理页面,把每个网页和资源都对应一个版本号,这样可以直观的管理。发布页面时修改对应的版本号,不需要在代码中找到对应的网址加上版本号,特别时多个地方使用同一个资源时,若一个一个改即麻烦而且容易漏掉,还是做一个管理页面比较好。cs,js,png等资源文件一般都比html文件大的多,现在手机动不动4000万像素的摄像头,一张图片达到10兆不在话下,何况单反的超大分辨率(该类图片采用非尺寸压缩后仍然达到2兆以上也很正常,具体见文站《图像的压缩算法–尺寸压缩、格式压缩和品质压缩》)。所以cs,js,png等资源文件的下载地址加版本号是空前必须。

WKWebView从A页面进入B页面,再返回它取缓存的数据,不重新加载A页面的数据。那么如何重新加载A页面呢?只是这种必须不取缓存,必须重新加载页面的情况比较少,可以特别处理,当这类的页面换回时调用[self.wkWebView reload];来重新刷新页面。当每次进入一个页面或加载一个图片地址时都重新获取,只需要app端对它们的下载地址加上时间戳(精确到毫秒)就可以实现不取缓存数据实时加载数据。至于cs,js,png等资源文件想前面的地址不变,想根据需要实时刷新资源,那么只有js的代码给他们的资源加上版本号或时间戳(我提倡使用时间戳,因为它没有物理意义。更不提倡每次js发版本都对是否需要更新都加上最新时间戳(这是破坏WKWebView缓存机制),最好是加版本号)。至于阿里云的图片地址,我们的应用是采用和每次生成新生成的uuid相关的图片上传地址,没有重复的,所以可以对这类不重复的png等图片地址不加版本号。

至于cookie的缓存,由于WKWebView是多进程组件,每一个WKWebView页面控制器刚建立时Cookies.binarycookies文件为空,苹果没有可用的接口给它传递上个控制器的cookie,你就时加入请求的head里也在建立新WKWebView进程时被清空。所以采用多WKWebView控制器的方式实现cookie共享是没有办法的。当从WKWebView页面进入另一个控制器里发送普通https请求在消息头了加入cookie是可以的。具体参照文章《多个WKWebView页面的cookie不共享问题及解决方案》。

下面是对js的缓存文件的分析,如何获这些目录见文章《如何在不越狱的情况下,获取app中的所有常用文件和文件夹》:

采用[NSURLProtocol wk_registerScheme:@“https”];拦截后,经过分析/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/com.yixiang.agent/fsCachedData目录下的文件28个,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/WebKit/NetworkCache/Version 12/Blobs目录下的文件22个,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/WebKit/NetworkCache/Version 12/Records/44235F1B08CDC79B63B58D6BC4CDD688AB5A0A1D/Resource目录下的文件54个。其中目录fsCachedData下存放的是敏感的数据(在https协议拦截,对所有请求打印日志情况下),如:F3ACCC0B-6963-4390-8D07-1F4E2BB62457文件存储的是js注入的WKWebView代码(js和WKWebView互调的代码),3EF36A7A-A565-4418-983E-BA362C39F120是其中的一个html代码。

不采用https拦截的,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/com.yixiang.agent/fsCachedData目录下的文件1个,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/WebKit/NetworkCache/Version 12/Blobs目录下的文件23个,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/WebKit/NetworkCache/Version 12/Records/73C8324CFCDD81F3D3BA81939DAA4F7F42E34E56/Resource目录下的文件54个。其中Blobs目录下存放的是最核心的数据,5BD40BA5EFBAF3F10186DE4D2EF04FDABE2682CC是其中的一个html代码。

参考文章:《【腾讯Bugly干货分享】WKWebView 那些坑》。

目录
相关文章
|
3天前
|
XML 前端开发 JavaScript
前端简介(HTML+CSS+JS)
前端简介(HTML+CSS+JS)
|
5天前
|
前端开发 JavaScript
js遍历添加栏目类添加css,再点击其它删除css
该文章介绍了使用JavaScript遍历添加和删除CSS类的方法。示例代码展示了如何在点击时为当前元素添加类,同时移除其他元素的类。其中包含两个示例:一是遍历`.radio-group .ckselect`并处理点击事件,二是实现点击`.zu-top-nav-userinfo`显示/隐藏`.peoples`层,并处理文档点击以关闭层。代码适用于网页交互效果的实现。
6 0
|
6天前
|
前端开发 安全 数据安全/隐私保护
Web实战丨基于django+html+css+js的在线博客网站
Web实战丨基于django+html+css+js的在线博客网站
13 2
|
6天前
|
数据库 数据安全/隐私保护 Python
Web实战丨基于django+html+css+js的电子商务网站
Web实战丨基于django+html+css+js的电子商务网站
19 3
|
11天前
|
移动开发 前端开发 JavaScript
[初学者来练]用html+css+javascript个人博客作业需求
【6月更文挑战第3天】该项目旨在通过HTML、CSS和JavaScript创建一个响应式个人博客网站,提升前端开发技术理解与实践能力。主要包括设计简洁页面布局、实现主页展示、文章列表、详情页及评论功能。技术要求使用HTML5/CSS3/JavaScript,可选前端框架,强调代码质量和可维护性。提交内容需包括完整网站、开发文档和测试过的代码。评分标准涉及设计、功能实现、技术应用和文档质量。
14 0
|
13天前
|
前端开发 JavaScript
保存网页中的css和js文件,网站保存,复制网站不可复制的文字,网站抠图
保存网页中的css和js文件,网站保存,复制网站不可复制的文字,网站抠图
|
3天前
|
存储 缓存 NoSQL
Redis缓存的运用
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请 求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
10 1
|
17天前
|
缓存 监控 NoSQL
redis 缓存穿透 击穿 雪崩 的原因及解决方法
redis 缓存穿透 击穿 雪崩 的原因及解决方法
|
7天前
|
缓存 NoSQL Java
Java一分钟之-Spring Data Redis:使用Redis做缓存
【6月更文挑战第10天】Spring Data Redis是Spring框架的一部分,简化了Java应用与Redis的集成,支持多种数据结构操作。本文介绍了其基本使用,包括添加依赖、配置Redis连接及使用RedisTemplate。还讨论了常见问题,如序列化、缓存穿透和雪崩,并提供解决方案。通过实战示例展示了缓存与数据库读写分离的实现,强调了Spring Data Redis在提升系统性能中的作用。
33 0
|
8天前
|
存储 消息中间件 缓存
Redis:内存数据存储与缓存系统的技术探索
**Redis 概述与最佳实践** Redis,全称Remote Dictionary Server,是流行的内存数据结构存储系统,常用于数据库、缓存和消息中介。它支持字符串、哈希、列表等数据结构,并具备持久化、主从复制、集群部署及发布/订阅功能。Redis适用于缓存系统、计数器、消息队列、分布式锁和实时系统等场景。最佳实践包括选择合适的数据结构、优化缓存策略、监控调优、主从复制与集群部署以及确保安全配置。
14 3

热门文章

最新文章