UIwebView实现html的离线缓存
1、html的缓存主要採取ASIHTTPRequest的缓存策略
(1)、设置缓存策略
//设置缓存
ASIDownloadCache *cache=[[ASIDownloadCache alloc] init];
self.myCache=cache;
//设置缓存路径
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
//设置缓存存放路径
[self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]];
//ASIAskServerIfModifiedCachePolicy 与默认缓存大致一样。差别仅是每次请求都会 去server推断是否有更新
//ASIOnlyLoadIfNotCachedCachePolicy 假设有缓存在本地,无论其过期与否。总会拿来使用
//ASIFallbackToCacheIfLoadFailsCachePolicy 这个选项常常被用来与其他选项组合使用。请求失败时,假设有缓存当网络则返回本地缓存信息
[self.myCache setDefaultCachePolicy:ASIFallbackToCacheIfLoadFailsCachePolicy]; //设置缓存策略
(2)、设置异步缓存
NSURL *Requesturl=[NSURL URLWithString:url];
ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:Requesturl];
// //获取全局变量
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
// //设置缓存方式
[request setDownloadCache:appDelegate.myCache];
// //设置缓存数据存储策略。这里採取的是假设无更新或无法联网就读取缓存数据
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
[request setDelegate:self];
[request startAsynchronous];
html缓存完毕。如想查看具体 请点击 : IOS开发网络篇之──ASIHTTPRequest具体解释
2、html中的图片缓存
(1)、通过正则获取html代码中的全部图片url
NSString *urlPattern = @"<img[^>]+?
src=[\"']?
([^>'\"]+)[\"']?
";
NSError *error = [NSError new];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlPattern options:NSRegularExpressionCaseInsensitive error:&error ];
//match 这块内容很强大
NSUInteger counts =[regex numberOfMatchesInString:content options:NSRegularExpressionCaseInsensitive range:NSMakeRange(0, [content length])];//匹配到的次数
if(counts > 0){
NSArray* matches = [regex matchesInString:content options:NSMatchingReportCompletion range:NSMakeRange(0, [content length])];
for (NSTextCheckingResult *match in matches) {
NSInteger count = [match numberOfRanges];//匹配项
for(NSInteger index = 0;index < count;index++){
NSRange halfRange = [match rangeAtIndex:index];
if (index == 1) {
//[listImage addObject:[content substringWithRange:halfRange]];
NSLog(@"转换出来的字符串===%@",[content substringWithRange:halfRange]);
[listImage addObject:[content substringWithRange:halfRange]];
}
}
}//遍历后能够看到三个range。1、为总体。
2、为([\\w-]+\\.)匹配到的内容。3、([\\w.%&=-]*)匹配到的内容
}
(2)、SDwebImage下载图片 、JS交互替换
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i < listImage.count; i++)
{
NSString *imageUrl = [imageUrlArray objectAtIndex:i];
NSString *key=[self getMd5_32Bit_String:imageUrl];
UIImage *cachedImage=[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key];
NSString *index = [NSString stringWithFormat:@"%d", i];
if (cachedImage) {
[tchWebView stringByEvaluatingJavaScriptFromString:[self createSetImageUrlJavaScript:index
imgUrl:key]];
}else{
dispatch_group_async(group, queue, ^{
//异步下载图片
[SDWebImageDownloader.sharedDownloader downloadImageWithURL:[NSURL URLWithString:imageUrl]
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize)
{
// progression tracking code
}
completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
{
if (image && finished)
{
[[SDImageCache sharedImageCache] storeImage:image forKey:key];
dispatch_sync(dispatch_get_main_queue(), ^{
[tchWebView stringByEvaluatingJavaScriptFromString:[self createSetImageUrlJavaScript:index
imgUrl:key]];
});
}
}];
});
}
}
dispatch_release(group);
//设置下载完毕的图片到web img
- (NSString *)createSetImageUrlJavaScript:(NSString *) index imgUrl:(NSString *) url{
UIImage *myCachaImage=[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:url];
NSData *imageData = UIImageJPEGRepresentation(myCachaImage,1.0);
NSString *imageSource = [NSString stringWithFormat:@"data:image/jpg;base64,%@",[imageData base64Encoding]];
NSString *js = [NSString stringWithFormat:@"var imgArray = document.getElementsByTagName('img'); imgArray[%@].src=\"%@\"; " , index, imageSource];
return js;
}
//32位MD5加密方式
- (NSString *)getMd5_32Bit_String:(NSString *)srcString{
const char *cStr = [srcString UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest );
NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[result appendFormat:@"%02x", digest[i]];
return result;
}
UIwebView实现html的离线缓存的更多相关文章
- uiwebview 离线缓存 图片
uiwebview 离线缓存图片
- HTML5离线缓存(Application Cache)
HTML5离线缓存又名Application Cache,是从浏览器的缓存中分出来的一块缓存区,要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源. ...
- HTML5 离线缓存管理库
一.HTML5离线缓存技术 支持离线缓存是HTML5中的一个重点,离线缓存就是让用户即使在断网的情况下依然可以正常的运行应用.传统的本地存储数据的方式有 localstorage,sessionsto ...
- HTML5离线缓存问题
HTML5离线缓存问题 1.应用程序缓存 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. ...
- HTML5离线缓存
参考文档:http://www.w3cschool.cc/html/html5-app-cache.html HTML5 应用程序缓存 又称离线缓存 ,即使断线了,刷新后也还是缓存了原来的页面,不会4 ...
- Html5离线缓存详细讲解
离线缓存是Html5新特性之一,简单理解就是第一次加载后将数据缓存,在没有清除缓存前提下,下一次没有网络也可以加载,用在静态数据的网页或游戏比较好用.当然,Html5新的特性都不是所有浏览器都能支持的 ...
- 使用html5的离线缓存技术
突然想用html5的离线缓存,但是一直没有成功,在各种群里问发现很多人都没什么经验,最终终于在各种论坛找到解决方案了.下面就简单记录一下相关情况. 一.离线缓存的优点 我们都知道离线缓存主要是用来减少 ...
- 使用 jQuery Mobile 与 HTML5 开发 Web App —— HTML5 离线缓存
本文要介绍的,是 HTML5 离线网络应用程序的特性,离线网络应用程序在 W3C 中的实际名称是 "Offline Web applications" ,也称离线缓存.当用户打开浏 ...
- HTML5 manifest离线缓存
一.基本概念 离线缓存是HTML5新引入的技术,能够让你的Web应用程序指定哪些文件可以缓存在本地,使得你的网络断开时依然可以通过本地的缓存来进行访问浏览. 二.使用方法 1. MIME type 声 ...
随机推荐
- Vue.js 2.0 和 React、Augular
Vue.js 2.0 和 React.Augular 引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那 ...
- [topcoder]BinaryCards
现在觉得有空时可以刷一下topcoder的DIV 2的Lvl 3的题目.感觉和刷LeetCode和WikiOi都是不一样的. http://community.topcoder.com/stat?c= ...
- Multi-Die系统介绍
一个典型的存储系统一般是有几片NAND存储器组成的.一般会使用8-bit的总线,用来将不同的存储器与控制器进行连接,如图2.32所示.一个系统中多片NAND的存储系统可以提高存储容量,同时还可以提高读 ...
- Web Development Terms
I've come across lots of terms while learning web development. I'm feeling myself overwhelmed. Here ...
- 知乎上关于c和c++的一场讨论_看看高手们的想法
为什么很多开源软件都用 C,而不是 C++ 写成? 余天升 开源社区一直都不怎么待见C++,自由软件基金会创始人Richard Stallman认为C++有语法歧义,这样子没有必要.非常琐碎还会和C不 ...
- the private key for is not installed on this mac
the private key for is not installed on this mac 如果提交 时出现这个问题, 有可能是 keychain重复了, 1:要去keychain中把旧的删除, ...
- 全面理解Unity加载和内存管理
全面理解Unity加载和内存管理http://game.ceeger.com/forum/read.php?tid=4394&fid=2&uid=6507 1.用简单的“for”循环 ...
- 【转】eclipse android 设置及修改生成apk的签名文件 -- custom debug keystore
原文网址:http://hold-on.iteye.com/blog/2064642 android eclipse 设置及修改生成apk的签名文件 1. 问题: 平时在使用eclipse进行andr ...
- Windows SharePoint Services 3.0编码开发工具和技巧(Part 1 of 2)
转:http://blog.csdn.net/mattwin/article/details/2074984 WSSv3 Technical Articles_Windows SharePoint S ...
- Entity Framework快速入门笔记—增删改查
第一步:创建一个控制台应用程序,起名为EFDemo 2. 第二步:创建一个实体模型 (1)在EFDemo项目上面右击选择添加—新建项—在已安装的选项中选择数据—ADO.NET实体对象模型,如图所示: ...