项目需求是本地下载.zip的HTTP链接,解压后保存在沙盒,然后用Webview展示HTML,找了下第三方解压缩的库,都是用C写的,选用了ZipArchive,集成过程网上一堆教程,本人就不复述了。
下载的zip包和解压过的文件要存放沙盒里,必须要保持其唯一性,所以文件名用下载链接转MD5命名,下载完成删除zip包,下次下载只需检查是否有该链接的MD5命名的文件夹是否存在文件即可,上代码。
- (void)downloadZip{ NSString *zipUrl = @"http://h5.orunapp.com/game/ljsp.zip?t=123"; 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;}
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。