iOS解壓縮zip,本地保存讀取html所有包

前語

最近一個對我來說相對的難點需求:從接口下載版本不一樣的zip包,保存到本地,解壓縮,然后讀取本地文件夾內(nèi)的html,這期間遇到了很多的問題,總結(jié)如下:

模塊

  • 準備工作
  • 遇到的問題
  • 根據(jù)接口返回的地址下載
  • 把zip包保存本地,解壓縮保存文件夾
  • 讀取本地文件夾內(nèi)的html,展示webView

1.準備工作

解壓縮的需要第三方的解壓縮庫,換過幾個解壓庫,都是c/c++寫的,如:SSZipArchive,ZipArchive等。
 *先把SSZipArchive拖進工程
 *然后加入系統(tǒng)庫 libz.dylib
 *在pch引入:
 #ifdef __OBJC__
 #import "ZipArchive.h"
 #endif

2.遇到的問題

*解壓縮的庫里面是c/c++寫的,所以工程需要修改配置,因為oc與c/c++ 要混編 *
如果直接拖進 SSZipArchive ,編譯會報錯Unknown type name 'NSString',錯誤提示如下圖:
Unknown type name 'NSString'.png
一般情況下出現(xiàn)“Unknown type name”是頭文件互相引用出現(xiàn)的,這里可以排除,由于源碼使用是c\c++與oc混編,因為解壓縮庫里面是c/c++,如圖:
解壓縮庫.jpg
嘗試了幾種方案:
解決方案一:選擇所有.c文件,將屬性的 identity and type 改為Objective-C Source
sources.jpg
解決方案二:選擇所有.c文件,將.c修改為.m
解決方案三:由于修改所有文件的編譯類型,所有可能會導致其他包括c、c++代碼的提示錯誤,修改如下,但是也會報錯,最好是保留下面如圖的配置,按照一二種方案解決。
compile sources As.png
Apple LLVM 8.0 - Language -C++.png
到此,整個解壓縮的庫算是編譯通過了,但是我這邊的工程又遇到很奇葩的問題,跟環(huán)信的sdk里面的好多方法名沖突了,我也表示很無語,太辣眼睛了,如圖:
error.png

因為環(huán)信所有的方法都是靜態(tài)庫點a里面的東西,我們這種免費用人家?guī)斓娜耍薷牟涣巳思异o態(tài)庫的東西,只能自己默默修改SSZipArchive里面的方法名,我的天呢35個方法名,加班加點的,最后終于搞定。至此我也很無語,試了好幾個第三方的解壓縮軟件,都是c/c++寫的,都是跟環(huán)信的sdk的方法名沖突,只能自己一個一個修改。

3.根據(jù)接口返回的地址下載,解壓保存到文件夾

#因為我們是根據(jù)接口版本號判斷給的zip是不是最新的再保存到本地,然后讀取本地的解壓縮之后的文件夾。所以在此之前我先寫了一個本地的plist來存取zip的版本號。本地plist的寫法如下:
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *filePatch = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"OrderHtmlList.plist"];
    BOOL Exists = [fileManager fileExistsAtPath:filePatch];
    if(!Exists){
        
        NSString *plistPath = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"OrderHtmlList.plist"];
        NSError *error;
        BOOL success = [fileManager copyItemAtPath:plistPath toPath:filePatch error:&error];
        if(!success){
            NSAssert1(0, @"錯誤寫入文件:'%@'.", [error localizedDescription]);
        }
     }
#再根據(jù)版本號判斷,是否下載。第一次先保存一個空的版本號為空,直接走網(wǎng)絡(luò)下載,然后保存當前下載完之后的版本號,再次運行app的時候,判斷保存的版本號,跟接口給的版本號是否一致,一致的話,就不用下載,不一致,就下載新的。如下判斷:
    NSMutableDictionary *usersDic = [[NSMutableDictionary alloc] initWithContentsOfFile:filePatch];
    if ([LKTools isBlankString:[usersDic objectForKey:@"htmlVersion"]]) {
        //保存新html的版本號
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"OrderHtmlList.plist"];
        NSMutableDictionary *applist = [[[NSMutableDictionary alloc]initWithContentsOfFile:path]mutableCopy];
        NSString *name = [applist objectForKey:@"htmlVersion"];
        name = [dic objectForKey:@"hnum"];
        [applist setObject:name forKey:@"htmlVersion"];
        [applist writeToFile:path atomically:YES];
        NSString *htmlFilePath = [NSString stringWithFormat:@"%@",SERVER_HOST([dic objectForKey:@"hurl"])];
        //下載解壓縮
        [self rquestZipArchivePath:htmlFilePath andHtmlVersion:[dic objectForKey:@"htmlVersion"]];
        
    }
    else{
        
        if ([[usersDic objectForKey:@"htmlVersion"] isEqualToString:[dic objectForKey:@"hnum"]]) {
            NSLog(@"不下載不解壓");
        }
        else{
            //保存新html的版本號
            NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"OrderHtmlList.plist"];
            NSMutableDictionary *applist = [[[NSMutableDictionary alloc]initWithContentsOfFile:path]mutableCopy];
            NSString *name = [applist objectForKey:@"htmlVersion"];
            name = [dic objectForKey:@"hnum"];
            [applist setObject:name forKey:@"htmlVersion"];
            [applist writeToFile:path atomically:YES];
            
            NSString *htmlFilePath = [NSString stringWithFormat:@"%@",SERVER_HOST([dic objectForKey:@"hurl"])];
            //下載解壓縮
            [self rquestZipArchivePath:htmlFilePath andHtmlVersion:[dic objectForKey:@"htmlVersion"]];
        }
    }
#pragma mark 請求zip地址
-(void)rquestZipArchivePath:(NSString *)pathUrl andHtmlVersion:(NSString *)version{
    //遠程地址
    NSURL *URL = [NSURL URLWithString:pathUrl];
    //默認配置
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
    //請求
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSURLSessionDownloadTask * downloadTask= [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        //- block的返回值, 要求返回一個URL, 返回的這個URL就是文件的位置的路徑
        
        NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        
        //再次之前先刪除本地文件夾里面相同的文件夾
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSArray *contents = [fileManager contentsOfDirectoryAtPath:cachesPath error:NULL];
        NSEnumerator *e = [contents objectEnumerator];
        NSString *filename;
        NSString *extension = @"zip";
        while ((filename = [e nextObject])) {

            if ([[filename pathExtension] isEqualToString:extension]) {

                [fileManager removeItemAtPath:[cachesPath stringByAppendingPathComponent:filename] error:NULL];
            }
        }
        NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
        return [NSURL fileURLWithPath:path];
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        //設(shè)置下載完成操作
        // filePath就是你下載文件的位置,你可以解壓,也可以直接拿來使用
        NSString *htmlFilePath = [filePath path];// 將NSURL轉(zhuǎn)成NSString
        NSArray *documentArray =  NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        NSString *path = [[documentArray lastObject] stringByAppendingPathComponent:@"Preferences"];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        [fileManager removeItemAtPath:[NSString stringWithFormat:@"%@/html",path] error:nil];
        [self releaseZipFilesWithUnzipFileAtPath:htmlFilePath Destination:path];
    }];
    [downloadTask resume];
}
#pragma mark 解壓
- (void)releaseZipFilesWithUnzipFileAtPath:(NSString *)zipPath Destination:(NSString *)unzipPath{
//    NSLog(@"%@,%@",zipPath,unzipPath);
    NSError *error;

    if ([SSZipArchive unzipFileAtPath:zipPath toDestination:unzipPath overwrite:YES password:nil error:&error delegate:self]) {
        NSLog(@"success");
    }
    else{
        NSLog(@"%@",error);
    }
    
}
#pragma mark - SSZipArchiveDelegate
- (void)zipArchiveWillUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo {
    NSLog(@"將要解壓。");
}
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPat uniqueId:(NSString *)uniqueId {
    NSLog(@"解壓完成!");
}

4.讀取本地保存的html

先看一下保存解壓縮之后的html的文件夾,綠色箭頭指示的是我解壓完之后的整個文件夾,紅色的是我要進去讀取的html所在的文件夾,如圖:
23F2CBE4-186A-473A-8E34-CEE674CD823D.png
#讀取方法如下:
    NSArray *documentArray =  NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *path = [[documentArray lastObject] stringByAppendingPathComponent:@"Preferences"];
    NSURL *url=[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/html/%@",path,self.orderHtmlStr]];
    NSString *urlStr = [url absoluteString];
    urlStr = [urlStr stringByReplacingOccurrencesOfString:@"file://" withString:@""];
    NSURL * URL = [NSURL URLWithString:urlStr];
    NSURLRequest *request=[NSURLRequest requestWithURL:URL];
    [self.orderWebView loadRequest:request];

最后小結(jié)還有一個問題:H5的同事說他做了html的適配,但是我在我oc的webview上展示的時候還是沒有適配,然后我就找原因,最后給webview加了個屬性,就ok了,暫時性的解決,不知道是不是跟他前段H5沒寫好有沒有關(guān)系,方法如下:self.orderWebView.scalesPageToFit = YES;//可縮放

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內(nèi)容