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 那些坑》。

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
25天前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
30天前
|
存储 JavaScript 前端开发
使用JavaScript构建动态交互式网页:从基础到实践
【10月更文挑战第12天】使用JavaScript构建动态交互式网页:从基础到实践
69 1
|
13天前
|
前端开发 JavaScript
如何在 JavaScript 中访问和修改 CSS 变量?
【10月更文挑战第28天】通过以上方法,可以在JavaScript中灵活地访问和修改CSS变量,从而实现根据用户交互、页面状态等动态地改变页面样式,为网页添加更多的交互性和动态效果。在实际应用中,可以根据具体的需求和场景选择合适的方法来操作CSS变量。
|
4天前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。
|
4天前
|
前端开发 JavaScript
用HTML CSS JS打造企业级官网 —— 源码直接可用
必看!用HTML+CSS+JS打造企业级官网-源码直接可用,文章代码仅用于学习,禁止用于商业
30 1
|
9天前
|
前端开发 JavaScript 安全
HTML+CSS+JS密码灯登录表单
通过结合使用HTML、CSS和JavaScript,我们创建了一个带有密码强度指示器的登录表单。这不仅提高了用户体验,还帮助用户创建更安全的密码。希望本文的详细介绍和代码示例能帮助您在实际项目中实现类似功能,提升网站的安全性和用户友好性。
19 3
|
13天前
|
前端开发 JavaScript UED
如何使用 JavaScript 动态修改 CSS 变量的值?
【10月更文挑战第28天】使用JavaScript动态修改CSS变量的值可以为页面带来更丰富的交互效果和动态样式变化,根据不同的应用场景和需求,可以选择合适的方法来实现CSS变量的动态修改,从而提高页面的灵活性和用户体验。
|
12天前
|
JavaScript
js实现简洁实用的网页计算器功能源码
这是一款使用js实现简洁实用的网页计算器功能源码。可实现比较基本的加减乘除四则运算功能,界面简洁实用,是一款比较基本的js运算功能源码。该源码可兼容目前最新的各类主流浏览器。
21 2
|
1月前
|
存储 JavaScript 前端开发
【JavaScript】网页交互的灵魂舞者
本文介绍了 JavaScript 的三种引入方式(行内、内部、外部)和基础语法,包括变量、数据类型、运算符、数组、函数和对象等内容。同时,文章还详细讲解了 jQuery 的基本语法和常用方法,如 `text()`、`html()`、`val()`、`attr()` 和 `css()` 等,以及如何插入和删除元素。通过示例代码和图解,帮助读者更好地理解和应用这些知识。
15 1
【JavaScript】网页交互的灵魂舞者
|
19天前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
69 6

热门文章

最新文章