iOS WebView加载url缓存问题
来源:互联网 发布:幽浮2知乎 编辑:程序博客网 时间:2024/06/03 18:51
在做青海展厅项目时,将本应放在触摸屏的h5放在iPad pro上,于是做了个APP,写了个webView来load url request。但是由于在调试阶段,做h5的童鞋经常修改,然后发布到服务器上,我们发现,有时候修改,iPad会同步,有时候却不会,尤其上他修改了加载vedio的部分,重启APP也不好使。然后我发现,ios:设置加载的网络请求不采用本地缓存和远程缓存
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:_urlString]];[self.webView loadRequest:request];
PS:设置上面的只是仅仅可以保证html文件每次从服务器中获取,不从缓存文件中拿,而对于外联CSS JS图片等文件仍旧是从缓存中获取的;
h5设置css JS文件不从缓存中读取
通过添加版本号的和随机数的方法,保证每次加载JS CSS连接都是最新的,通常的做法是添加一个版本号,在每次更新了JS CSS时给版本号+1;保证没有更新时采用缓存文件
有更新可以从服务中获取;
解决方法
1、随机数法方法一: document.write( " <script src='test.js?rnd= " + Math.random() + " '></s " + " cript> " )方法二:var js = document.createElement( " script " )js.src = " test.js " + Math.random()document.body.appendChild(js)这样采用随机数的话, js文件将永远得不到缓存,每次都必须重新从服务器加载,即使没有任何更改。大家如果经常上国外网站的话,可以看到他们通常采用这样的方式来解决:<script src="test.js?ver=113"></script>其中 ver=113 的 113就是版本号这样真正做到了应该缓存的时候缓存静态文件,当版本有更新的时候从获取最新的版本,并更新缓存。对于图像 <img src="test.jps?ver=版本号"> 来有效利用和更新缓存.``` iOS清除缓存文件<div class="se-preview-section-delimiter"></div>
(void)removeWebCache{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
NSSet *websiteDataTypes= [NSSet setWithArray:@[
WKWebsiteDataTypeDiskCache,
//WKWebsiteDataTypeOfflineWebApplication
WKWebsiteDataTypeMemoryCache,
//WKWebsiteDataTypeLocal
WKWebsiteDataTypeCookies,
//WKWebsiteDataTypeSessionStorage,
//WKWebsiteDataTypeIndexedDBDatabases,
//WKWebsiteDataTypeWebSQLDatabases
]];// All kinds of data//NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{}];[[NSURLCache sharedURLCache] removeAllCachedResponses];
} else {
//先删除cookie
NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies])
{
[storage deleteCookie:cookie];
}NSString *libraryDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];NSString *webkitFolderInLib = [NSString stringWithFormat:@"%@/WebKit",libraryDir];NSString *webKitFolderInCaches = [NSString stringWithFormat:@"%@/Caches/%@/WebKit",libraryDir,bundleId];NSString *webKitFolderInCachesfs = [NSString stringWithFormat:@"%@/Caches/%@/fsCachedData",libraryDir,bundleId];NSError *error;/* iOS8.0 WebView Cache的存放路径 */[[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCaches error:&error];[[NSFileManager defaultManager] removeItemAtPath:webkitFolderInLib error:nil];/* iOS7.0 WebView Cache的存放路径 */[[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCachesfs error:&error];NSString *cookiesFolderPath = [libraryDir stringByAppendingString:@"/Cookies"];[[NSFileManager defaultManager] removeItemAtPath:cookiesFolderPath error:&error];[[NSURLCache sharedURLCache] removeAllCachedResponses];
}
}
关于保存在沙盒中的缓存文件如下图:![关于h5保存在沙盒中的缓存文件如下图](http://img.blog.csdn.net/20170901113543165?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWmhvbmdMdl9Ib25leU1vb24=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)另外,补充针对UIWebView出现的内存泄漏方法(网上)<div class="se-preview-section-delimiter"></div>
(void)webViewDidFinishLoad:(UIWebView *)webView
{
//防止内存泄漏
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@”WebKitCacheModelPreferenceKey”];
//本地webkit硬盘图片的缓存;
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@”WebKitDiskImageCacheEnabled”];//自己添加的,原文没有提到。
//静止webkit离线缓存
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@”WebKitOfflineWebApplicationCacheEnabled”];//自己添加的,,原文没有提到。
[[NSUserDefaults standardUserDefaults] synchronize];
}(void)dealloc
{
[webView loadHTMLString:@”” baseURL:nil];
[webView stopLoading];
[webView removeFromSuperview];
webView = nil;
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
NSLog(@”释放了webview”);
}(BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions{
int cacheSizeMemory = 4*1024*1024; // 4MB intcacheSizeDisk = 32*1024*1024; // 32MB
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@”nsurlcache”];
[NSURLCache setSharedURLCache:sharedCache];
}- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
[[NSURLCache sharedURLCache] removeAllCachedResponses];
}
总结:> 1.如果没有CDN缓存影响;每次杀死APP后重新进入,第一次加载webview,都会加载全部的数据资源(外联js,外联css,图片等)退出去后,如果在没有更新js,css内容时,默认只会加载html内容,PS:html中的内容 在每次加载webView中都会从服务器中更新一下;> 2.如果js css后面都添加了版本号,那么在每次更新版本号时,或者说资源链接变化时,webView一定会重新加载新的内容;如下:<div class="se-preview-section-delimiter"></div>
“`
- (void)webViewDidFinishLoad:(UIWebView *)webView { //防止内存泄漏 [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"]; //本地webkit硬盘图片的缓存; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"WebKitDiskImageCacheEnabled"];//自己添加的,原文没有提到。 //静止webkit离线缓存 [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"WebKitOfflineWebApplicationCacheEnabled"];//自己添加的,,原文没有提到。 [[NSUserDefaults standardUserDefaults] synchronize]; } - (void)dealloc { [webView loadHTMLString:@"" baseURL:nil]; [webView stopLoading]; [webView removeFromSuperview]; webView = nil; [[NSURLCache sharedURLCache] removeAllCachedResponses]; [[NSURLCache sharedURLCache] setDiskCapacity:0]; [[NSURLCache sharedURLCache] setMemoryCapacity:0]; NSLog(@"释放了webview"); } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ int cacheSizeMemory = 4*1024*1024; // 4MB int cacheSizeDisk = 32*1024*1024; // 32MB NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; [NSURLCache setSharedURLCache:sharedCache]; } - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { [[NSURLCache sharedURLCache] removeAllCachedResponses]; }
总结:
1.如果没有CDN缓存影响;每次杀死APP后重新进入,第一次加载webview,都会加载全部的数据资源(外联js,外联css,图片等)退出去后,如果在没有更新js,css内容时,默认只会加载html内容,PS:html中的内容 在每次加载webView中都会从服务器中更新一下;
2.如果js css后面都添加了版本号,那么在每次更新版本号时,或者说资源链接变化时,webView一定会重新加载新的内容;如下:
<script type="text/javascript" src="index1.js?v=1.0.0"></script>
- iOS WebView加载url缓存问题
- webview 加载url后 缓存问题
- Android webview加载url
- (一)webView加载url
- 简单WebView加载url
- WebView加载URL配置
- WebView加载缓存
- iOS开发 最新的NSURLProtocol之webView的离线缓存,缓存webView,离线加载
- 解决WebView加载URL跳转到系统浏览器的问题
- 关于WebView加载URL时显示一片空白的问题
- 关于WebView加载URL时显示一片空白的问题
- 关于Android之WebView加载网页缓存和清除问题
- ios webview清除缓存。
- ios webview清除缓存
- ios webview清除缓存
- ios webview清除缓存
- ios webview清除缓存
- iOS webview清除缓存
- HDU 3264 Open-air shopping malls
- C# 使用 itextsharp 对pdf文件进行分割的几种方法(1)——按页码拷贝分割
- 设计模式:单例模式-懒汉模型和饿汉模型
- JAVA标准异常
- Java选择排序算法
- iOS WebView加载url缓存问题
- bugku 你必须让他停下
- 【spark】spark之shuffle调优
- GHGL项目总结-spring+mybatis多数据库源
- linux下使用 du查看某个文件或目录占用磁盘空间的大小
- 用Kotlin写第一个Android程序
- Python数据工具箱:数据库连接库
- mysql5.7修改密码报错 Unknown column 'password'
- Android拨打电话