项目需求是本地下载.zip的HTTP链接,解压后保存在沙盒,然后用Webview展示HTML,找了下第三方解压缩的库,都是用C写的,选用了ZipArchive,集成过程网上一堆教程,本人就不复述了。
下载的zip包和解压过的文件要存放沙盒里,必须要保持其唯一性,所以文件名用下载链接转MD5命名,下载完成删除zip包,下次下载只需检查是否有该链接的MD5命名的文件夹是否存在文件即可,上代码。
- (void)downloadZip
{
NSString *zipUrl = @"http://h5.***.com/game/**.zip";
NSURL *url = [NSURL URLWithString:zipUrl];
NSString *md5 = [self md5:zipUrl];//将下载链接转为md5 后面当做文件夹的名字
NSArray *pathes = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString *path = [pathes objectAtIndex:0];//大文件放在沙盒下的Library/Caches
NSString *finishPath = [NSString stringWithFormat:@"%@/zipDownload/%@",path,md5];//保存解压后文件的文件夹的路径
NSString *zipPath = [NSString stringWithFormat:@"%@/%@.zip",path,md5];//下载的zip包存放路径
BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:finishPath];
if (!isExist)
{//本地不存在文件 下载
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_async(queue, ^{
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error];
if(!error)
{
[data writeToFile:zipPath options:0 error:nil];
//解压zip文件
ZipArchive *zip= [[ZipArchive alloc]init];
if([zip UnzipOpenFile:zipPath])
{//将解压缩的内容写到缓存目录中
BOOL ret = [zip UnzipFileTo:finishPath overWrite:YES];
if(!ret)
{
[zip UnzipCloseFile];
}
//解压完成 删除压缩包
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:zipPath error:nil];
}
}
});
}
}
- (NSString *)md5:(NSString *)str
{
const char *cStr = [str UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr,(CC_LONG)strlen(cStr), digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
这个是我存放文件的路径
如图所示1号位置zipDownload文件夹是我在Caches目录下新建的,用来存放所有跟zip下载相关的文件。2号位置就是我用下载链接转成了唯一的文件名,用来存放此链接下载的相关文件。3号点就是解压后的文件,我们最终也是要在webview上显示HTML文件
而调用的时候只需去 下载链接转MD5的文件夹下找文件加载即可
NSString *md5 = [self md5:_file];
NSArray *pathes = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString *path = [pathes objectAtIndex:0];
NSString *finishPath = [NSString stringWithFormat:@"%@/zipDownload/%@",path,md5];//保存解压后文件的文件夹
NSString *zipName = [[_file lastPathComponent] stringByDeletingPathExtension];//获取下载链接里的文件名 即123sst文件夹
NSString * webPath = [NSString stringWithFormat:@"%@/%@/index.html",finishPath,zipName];
然后用webview加载webPath这个本地路径就可以显示了。
总体还是很简单的,最重要的是要做好本地文件的目录管理,欢迎宝贵意见。