實現iOS圖片等資源文件的熱更新化(五): 一個簡單完整的資源熱更新頁面

簡介

更新結果

一個簡單的關於頁面,有一個圖片,版本號,App名稱等,着重演示各個系列的文章完整集成示例.html

動機與意義

這是系列文章的最後一篇.今天抽空寫下,收下尾.文章自己會在第四篇的基礎上,簡單擴充下代碼,實如今線下載與重置更改的功能.react

若是能較爲仔細地閱讀前四篇文章,第五篇給出的示例,應當是能夠理解爲無足輕重的.可是,大多數時候,咱們更多的可能只是須要一個簡易的解決方案,就是那種拿來就能夠用的東西,那種咱們須要先能看到一個簡要的示例來看下效果再解決是否再繼續閱讀的方案.如此,對於好久之後,因爲各類緣由被搜索引擎或者其餘文章的連接導向此係列文章的人來講,他們可能更想看到一個簡要的示例,來決定系列的文章,在他們那個時間點,是否依然有意義.ios

截止目前而言,我對博客記錄自己的定位,依然是屬於一個輔助思考的工具.當你看到這篇文章的時候,可能你已經在用Xcode9 Xcode10了,可能代碼示例都已經跑不起來了,可是我相信每篇文章所展現的那些參考連接和自己所透漏出的某些思考,或許對於你仍然是有某種啓發的.git

思路與實現

  1. App版本和名稱,能夠直接讀取;
  2. 在線下載更新資源,能夠藉助前一篇的代碼實現;
  3. 重置的話,能夠選擇清除補丁信息或者直接清除補丁,本文選擇第一種;

核心代碼:

我須要先擴展下更新資源的方法,使其在更新完整後,能返回更新的結果,以便於我進行進一步的操做,如從新顯示某個圖片:github

+ (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);
           }];
       }];

}

 

而後是一個自定義的在線更新的點擊方法:shell

- (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傳出操做結果:json

+ (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);
}

 

重置

具體使用起來,就很簡單,重置後,更新下圖片便可:segmentfault

- (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);
        }
    }];
}

 

系列文章心得小結

這是第二個系列文章."咱們應該相信大多數人們對於美好的東西是有鑑賞的能力" -- 若是能在這一點上達成共識,下面我說的,或許值得繼續一讀:react-native

一些數據

  • 開源中國 推薦了2篇博客: 已發佈的四篇系列文章,有兩篇在OSC上得到了小編的全站推薦.
  • 簡書 首頁推薦兩篇,得到打賞一次: 簡書自己的技術屬性,可能算不上很強,但近來搜索技術資料時,有好多都連接指向簡書,並且信息大都很及時很新鮮,緣由未知,因此最近本身也開始同步在簡書更新文章,至於收到打賞,其實就只有2元的辣條錢,可是很明顯這個童鞋是搜索某個信息時,被導向了個人文章,並且從其評論來看,確實對其有必定的幫助 -- 我以爲,可以被須要的人看到,這纔是最讓博主開心的事!
  • 微博 相關博文有3位大V轉發: 某種程度上,我以爲這算是一種承認.不過,我自己其實並不怎麼玩微博;微博的信息太容易被淹沒,但若是隻考慮傳播屬性的話,微博的擴散效果實際上是極好的.
  • segmentfault 把文章添加到頭條以後,被segmentfault的CEO 高陽Sunny 點讚了兩次,微博轉發一次.有種受寵若驚的感受,不事後來我想可能人家更多地只是想推一下新出的"頭條"功能.
  • csdn首頁推薦一次: 通知原文是,"你的實現iOS圖片等資源文件的熱更新化(四): 一個最小化的補丁更新邏輯被推薦到首頁嘍!" 這個確實挺值得記念的!剛開始的時候,我發篇文章,若是有外鏈,CSDN就必需要審查以後才能被公開看到!

幾點心得

  • 工做第一,博客分享第二: 我不期望能未來靠博客掙稿費,那也就意味着工做上的事務永遠都必須是優先處理的.因此,博客的更新時間並不能真正固定.還有就是,不但願博客分享自己成爲一種負擔,若是實在沒心情或者生活中有其餘事的話,我也就真的擱在那,之後再寫.
  • 不要被之前的主題束縛,寫本身真正須要或者真正感興趣的:這個系列,從時間上來講,確實比預期的一週遲了一個月;可是從實際效果來看,要比上一個Spark系列好不少.可是當初決定這個系列的內容時,我也是很糾結,是要繼續Spark大數據題材,仍是分享下本身一直想深刻研究,卻一直抽不出時間的資源包優化問題.最終,仍是選擇了後者,由於目前對Spark須要的場景,在本身工做中確實很少.
  • 記錄思路和參考資源,可能比解決方案自己更重要:更多的,是閱讀其餘人博客的經驗;遇到徹底一致的問題的可能性很小,並且許多狀況下,是從博主的相關引用中關於相似問題更細節的參考中,找到答案的;另外,各類引用資料,可能也給人一種很高大上的感受.
  • 你須要的時間比你預期的要更長: 你覺得半個小時能夠搞定的文章,可能會花費兩個小時,才勉強收尾;你覺得很簡答的一個技術點,在某個細節上演繹以後,可能會比你想象中更經驗.當你意識到,本身正在作的東西,是會被你們公開閱讀和鑑賞時,你會不禁自主地想多作一點,多查一些,多優化一點,不想顯得太low.

小規劃

  • 題材,堅持系列文章: 我發現系列文章,真的有利於幫助本身進行和堅持深刻地有序思考.
  • 主題,肯定爲移動混合開發:最近一年都在用ReactNative開發App,可是單純地使用,已經不能知足我了,我想深刻研究下內部地某些實現機制.做爲對比,會研究下勉強算是社區驅動的Weex;另外,還會關注下國內的商業驅動的APICloud平臺.
  • 內容會涉及iOS,Android,HTML5和自動化腳本: iOS算是本職工做,Android和HTML是本身迫切須要補上的技能,而自動化腳本的編寫能力將在很大程度上決定本身自動處理複雜信息的能力和將來的發展 -- 都說Lisp是宇宙第一語言,但目前仍是基礎的shell腳本用的比較多.
  • 文章和評論宜只談技術: ReactNative 所表明的混合開發的方向,在必定程度上已經得到了國內以BAT爲表明的一線技術公司的承認,你們能夠去showcase示例具體看下;Weex,目前只是粗讀了下文檔,三端公用代碼,確實有些腦洞,其內部實現應該具備至關程度的學習價值,但其理念不敢苟同,3端共用代碼,意味着要取三端各自平臺優點的交集,可能也就意味着要犧牲3個平臺的各自的獨特性和優點 -- 若是真的是這這樣,那ReactNative,也是能夠自稱"一處編寫,到處運行"的;APICloud,商業驅動,從產品角度來講,較爲完善,混合開發只是服務的一部分,按照目前的發展路線,若是將來HTML發展再迅速一點,或許會有極大出線的可能.

參考資源

相關文章
相關標籤/搜索