iOS WebView加载url缓存问题

在做青海展厅项目时,将本应放在触摸屏的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=113113就是版本号

这样真正做到了应该缓存的时候缓存静态文件,当版本有更新的时候从获取最新的版本,并更新缓存。
对于图像 <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保存在沙盒中的缓存文件如下图](https://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 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一定会重新加载新的内容;如下:





<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值