一個簡單的關於頁面,有一個圖片,版本號,App名稱等,著重演示各個系列的文章完整集成示例.
這是系列文章的最後一篇.今天抽空寫下,收下尾.文章本身會在第四篇的基礎上,簡單擴充下代碼,實現在線下載與重置更改的功能.
如果能較為仔細地閱讀前四篇文章,第五篇給出的示例,應當是可以理解為無足輕重的.但是,大多數時候,我們更多的可能只是需要一個簡易的解決方案,就是那種拿來就可以用的東西,那種我們需要先能看到一個簡要的示例來看下效果再解決是否再繼續閱讀的方案.如此,對於很久以後,由於各種原因被搜索引擎或者其他文章的鏈接導向此系列文章的人來說,他們可能更想看到一個簡要的示例,來決定系列的文章,在他們那個時間點,是否依然有意義.
截止目前而言,我對博客記錄本身的定位,依然是屬於一個輔助思考的工具.當你看到這篇文章的時候,可能你已經在用Xcode9 Xcode10了,可能代碼示例都已經跑不起來了,但是我相信每篇文章所展示的那些參考鏈接和本身所透漏出的某些思考,或許對於你仍然是有某種啟發的.
App版本和名稱,可以直接讀取; 在線下載更新資源,可以借助前一篇的代碼實現; 重置的話,可以選擇清除補丁信息或者直接清除補丁,本文選擇第一種;
我需要先擴展下更新資源的方法,使其在更新完整後,能返回更新的結果,以便於我進行進一步的操作,如重新顯示某個圖片:
+ (void)yf_updatePatchFrom:(NSString *) pathInfoUrlStr completionHandler:(void (^)(BOOL success, NSError * error))completionHandler { if ( ! completionHandler) { completionHandler = ^(BOOL success, NSError * error){ // nothing to do... }; } [self yf_fetchPatchInfo: pathInfoUrlStr completionHandler:^(NSDictionary *patchInfo, NSError *error) { if (error) { NSLog(@"fetchPatchInfo error: %@", error); completionHandler(NO, error); return; } NSString * urlStr = [patchInfo objectForKey: @"url"]; NSString * md5 = [patchInfo objectForKey:@"md5"]; NSString * oriMd5 = [[[NSUserDefaults standardUserDefaults] objectForKey: [self yf_sourcePatchKey]] objectForKey:@"md5"]; if ([oriMd5 isEqualToString:md5]) { // no update completionHandler(YES,nil); return; } [self yf_downloadFileFrom:urlStr completionHandler:^(NSURL *location, NSError *error) { if (error) { NSLog(@"download file url:%@ error: %@", urlStr, error); completionHandler(NO, error); return; } NSString * patchCachePath = [self yf_cachePathFor: md5]; [SSZipArchive unzipFileAtPath:location.path toDestination: patchCachePath overwrite:YES password:nil error:&error]; if (error) { NSLog(@"unzip and move file error, with urlStr:%@ error:%@", urlStr, error); completionHandler(NO, error); return; } /* update patch info. */ NSString * source_patch_key = [self yf_sourcePatchKey]; [[NSUserDefaults standardUserDefaults] setObject:patchInfo forKey: source_patch_key]; completionHandler(YES,nil); }]; }]; }
然後是一個自定義的在線更新的點擊方法:
- (IBAction)onlineUpdate:(id)sender { __weak ViewController * weakSelf = self; [UIImage yf_updatePatchFrom:@"https://raw.githubusercontent.com/ios122/ios_assets_hot_update/master/res/patch_04.json" completionHandler:^(BOOL success, NSError *error) { UIImage * image = [UIImage yf_imageNamed:@"sub/sample"]; weakSelf.sampleImageView.image = image; }]; }
還需要一個自定義的reset方法,考慮到以後的擴展性和目前的需要,使其支持block傳出操作結果:
+ (void )yf_reset:(void (^)(BOOL success, NSError * error))completionHandler { if ( ! completionHandler) { completionHandler = ^(BOOL success, NSError * error){ // nothing to do... }; } [[NSUserDefaults standardUserDefaults] setObject:nil forKey: [self yf_sourcePatchKey]]; completionHandler(YES, nil); }
具體使用起來,就很簡單,重置後,更新下圖片即可:
- (IBAction)reset:(id)sender { __weak ViewController * weakSelf = self; [UIImage yf_reset:^(BOOL success, NSError *error) { if (success) { UIImage * image = [UIImage yf_imageNamed:@"sub/sample"]; weakSelf.sampleImageView.image = image; }else { NSLog(@"reset error:%@", error); } }]; }
這是第二個系列文章."我們應該相信大多數人們對於美好的東西是有鑒賞的能力" -- 如果能在這一點上達成共識,下面我說的,或許值得繼續一讀: