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# return dynamic/anonymous type value as function result
function: public static dynamic GetAppSecret() { //string[] result = new string[] { "", &q ...
- iOS 图片填充 UIImageView
UIViewContentModeScaleAspectFit, //这个图片都会在view里面显示,并且比例不变 这就是说 如果图片和view的比例不一样 就会有留白如下图1 UIView ...
- 移动web HTML5使用photoswipe模仿微信朋友圈图片放大浏览
先来几张效果图: 点击其中一张照片可放大,可支持图片文字描述: 同时支持分享功能: 支持手势放大缩小 使用js框架是PhotoSwipe. PhotoSwipe是一个图片放大插件,兼容pc和移动端,经 ...
- SQL 各种连接:内连接,外连接(左外,右外,完全外)
在讲述之前,假设有如下两个表EMP, DEPT, 并且他们数据如下:
- python下redis的基本操作:
1. 基本操作: >>> import redis >>> print redis.__file__ /usr/local/lib/python2.7/dist-p ...
- 得到bundle seed id
- (NSString *)bundleSeedID { NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys: (__br ...
- hdu 1281
二分图,简单的模板题,不过题目比较难懂: 其中important chess就是删掉它不能够完美匹配,所以就枚举每一个可能删的棋子: 代码: #include <cstdio> #incl ...
- (转)未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService~~导出!解决方案。
今天刚到公司,打开VS2012准备些个小程序练练手,结果打开C#控制台程序创建时弹出个出错警告,于是呼赶紧跑到百度娘那里问问. 百度一番之后,找到了两篇文章: vs2012建立c++项目为啥会这样? ...
- javascript中通过replace函数搜索和替换指定字符串
javascript中我们可以通过replace函数替换部分字符串为指定字符串,本文展示了replace的详细用法,并且通过范例演示了如何进行部分替换.完整替换和不区分大小写替换. javascrip ...
- 【HDOJ】2707 Steganography
简单字符串,读懂题,很容易AC. #include <stdio.h> #include <string.h> ], line[], des[]; int main() { i ...