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 声 ...
随机推荐
- C++笔记1: 单例模式。(一个简单的设计模式在C++中复杂出翔。。)
C++ 如果用指针new一个单例,内存不容易释放,所以Java和C#等语言中的单例模式在C++不适用... C++中,new申请的内存必须由delete释放,例如: Point p1; Point * ...
- skiplist 跳表(1)
最近学习中遇到一种新的数据结构,很实用,搬过来学习. 原文地址:skiplist 跳表 为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等. ...
- Python isinstance判断对象类型
在Python中只需要使用内置的函数isinstance,使用起来非常简单,比如下面的例子: class objA: pass A = objA() B = 'a','v' C = 'a string ...
- XSS测试用例与原理讲解
1.<a href="javascript:alert(32)">DIBRG</a>2.<img href="javascript:aler ...
- 【HDU 5184】 Brackets (卡特兰数)
Brackets Problem Description We give the following inductive definition of a “regular brackets” sequ ...
- 李洪强iOS开发之-环信02.3_具体接口讲解 - Apple Docs
http://www.easemob.com/apidoc/ios/chat3.0/annotated.html Apple Docs.
- gdb调试高级用法
Linux下进程崩溃时定位源代码位置 如何在调试内核时,同时可以调试应用程序的做法: (cskygdb) c Continuing. ^C Program received signal SIGINT ...
- USB数据线上的“疙瘩”:原来有这么大用处!
在不少键盘.鼠标或是游戏外设的数据线末端我们都能见到一小段金属圆环.虽然这算得上是习以为常的一个设计,但如果说到其具体作用的话很多人一下子还真回答不上来.反正笔者在这里先可以告诉大家,这货肯定不是简简 ...
- Listview 异步加载图片之优化篇(有图有码有解释)
在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...
- UVA_437_The_Tower_of_the_Babylon_(DAG上动态规划/记忆化搜索)
描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...