從零開始設(shè)計搭建ios App框架(十二)

熱修復(fù)


iOS應(yīng)用審核時間之長,只叫人不堪忍受麻裁;但是更讓人捶胸的是箍镜,App好不容易上線了,結(jié)果發(fā)現(xiàn)上線的APP有明顯的bug煎源。真他NND色迂,各種無語,各種不是滋味手销。這個時候會想有沒有不發(fā)布新版本解決類似這些小Bug歇僧,其實(shí)網(wǎng)上搜索一下,已經(jīng)有很多方案了锋拖。如JSPatch和WaxPatch诈悍。具體這兩個方案的原理可以參考:http://www.reibang.com/p/41ed877aa0cd 這里不細(xì)說了祸轮,本文使用的是JSPatch來完成App熱修復(fù)模塊的邏輯。

我認(rèn)為下載完補(bǔ)丁能夠修復(fù)Bug写隶,同時還要防止補(bǔ)丁有bug倔撞,要能夠?qū)σ呀?jīng)下載到本地的補(bǔ)丁進(jìn)行刪除重新修復(fù)。這樣補(bǔ)丁就應(yīng)該要有編號慕趴。

#import "PGBaseObj.h"

/**
 補(bǔ)丁痪蝇,用于熱修復(fù)
 */
@interface PGPatchObject : PGBaseObj
/*
 補(bǔ)丁ID
 */
@property(nonatomic, strong)NSString *mFixID;
/*
 補(bǔ)丁js腳本
 */
@property(nonatomic, strong)NSString *mFixString;

@end

補(bǔ)丁模塊作統(tǒng)一的管理(下載,緩存本地冕房、刪除等)

@interface PGPatchManager : NSObject

+ (PGPatchManager *)shareInstance;

/*
 其實(shí)執(zhí)行是 [JPEngine startEngine]
 */
- (void)startListen;

/*
 執(zhí)行本要的腳本
 */
- (void)executeLocalHot;

/*
 從服務(wù)器上獲取新的腳本
 */
- (void)getHotData;

@end

獲取新的補(bǔ)丁時需將本地已經(jīng)存在的補(bǔ)丁作入?yún)⒏嬷?wù)器躏啰,請求到新補(bǔ)丁的處理邏輯如下:

static PGPatchManager *s_patchManager = nil;

@interface PGPatchManager ()<PGApiDelegate>
@property(nonatomic, strong)NSMutableArray *arrayHots;
@end

@implementation PGPatchManager

+ (PGPatchManager *)shareInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        s_patchManager = [[PGPatchManager alloc] init];
        s_patchManager.arrayHots = [[NSMutableArray alloc] init];
        [s_patchManager.arrayHots addObjectsFromArray:[s_patchManager localHots]];
    });
    return s_patchManager;
}

- (void)startListen
{
    [JPEngine startEngine];
}

- (void)getHotData
{
    NSMutableArray *localHotIDs = [[NSMutableArray alloc] init];
    for(PGPatchObject *obj in self.arrayHots)
    {
        [localHotIDs addObject:obj.mFixID];
    }
    
    //本地已經(jīng)存在的補(bǔ)丁
    NSString *ids = [NSString jsonStringWithArray:localHotIDs];
    
    [PGRequestManager startPostClient:API_TYPE_PATCH param:@{@"fixIds":ids} target:self extendParam:nil];
}

- (NSMutableArray *)localHots
{
    NSObject *obj = [PGCacheManager readCacheType:ECacheType_Hots];
    if(obj != nil)
        return (NSMutableArray *)obj;
    else
        return [[NSMutableArray alloc] init];
}

- (void)saveHotsToLocal
{
    [PGCacheManager cacheData:self.arrayHots type:ECacheType_Hots];
}

- (void)executeLocalHot
{
    for(PGPatchObject *obj in self.arrayHots)
    {
        [JPEngine evaluateScript:obj.mFixString];
    }
}

- (void)executeHot:(NSArray *)array
{
    for(PGPatchObject *obj in array)
    {
        [JPEngine evaluateScript:obj.mFixString];
    }
}

- (void)addHot:(NSArray *)array
{
    if(array == nil || array.count <= 0)
        return;
    
    for(PGPatchObject *newobj in array)
    {
        for(PGPatchObject *obj in self.arrayHots)
        {
            if([newobj.mFixID compare:obj.mFixID] != NSOrderedSame)
            {
                [self.arrayHots addObject:obj];
            }
        }
    }
    
}

- (void)delHot:(NSArray *)array
{
    if(array == nil || array.count <= 0)
        return;
    
    for(PGPatchObject *delobj in array)
    {
        for(PGPatchObject *obj in self.arrayHots)
        {
            if([delobj.mFixID compare:obj.mFixID] == NSOrderedSame)
            {
                [self.arrayHots removeObject:obj];
                break;
            }
        }
    }
    
}

#pragma mark -
- (void)dataRequestFinish:(PGResultObject *)resultObj apiType:(PGApiType)apiType
{
    if(apiType == API_TYPE_PATCH)
    {
        if(resultObj.nCode == 0)
        {
            NSMutableDictionary *dic = (NSMutableDictionary *)resultObj.dataObject;
            NSMutableArray *addarray = [dic objectForKey:@"add"];
            NSMutableArray *delarray = [dic objectForKey:@"del"];
            
            //執(zhí)行新的補(bǔ)丁
            [self executeHot:addarray];
            
            //刪除舊的補(bǔ)丁
            [self delHot:delarray];
            
            //添加新的補(bǔ)丁
            [self addHot:addarray];
            
            //保存新的補(bǔ)丁
            [self saveHotsToLocal];
        }
    }
}

@end

基本邏輯就是這樣,完善的話耙册,需對補(bǔ)丁進(jìn)行安全加密给僵,網(wǎng)絡(luò)傳輸過程,本地存儲時最好都考慮一下安全性详拙。我代碼里面是沒有作加密處理的帝际,可別學(xué)我哦。

本也想畫一個補(bǔ)丁的修復(fù)邏輯流程圖饶辙,但發(fā)現(xiàn)前人已經(jīng)有現(xiàn)成的蹲诀,我就不畫了,其實(shí)是我比較懶弃揽。流程圖可參考:http://blog.csdn.net/zm53373581/article/details/50011521

上一節(jié):消息推送
下一節(jié):webView封裝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脯爪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子矿微,更是在濱河造成了極大的恐慌痕慢,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,657評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涌矢,死亡現(xiàn)場離奇詭異掖举,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蒿辙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評論 3 385
  • 文/潘曉璐 我一進(jìn)店門拇泛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人思灌,你說我怎么就攤上這事俺叭。” “怎么了泰偿?”我有些...
    開封第一講書人閱讀 158,143評論 0 348
  • 文/不壞的土叔 我叫張陵熄守,是天一觀的道長。 經(jīng)常有香客問我,道長裕照,這世上最難降的妖魔是什么攒发? 我笑而不...
    開封第一講書人閱讀 56,732評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮晋南,結(jié)果婚禮上惠猿,老公的妹妹穿的比我還像新娘。我一直安慰自己负间,他們只是感情好偶妖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,837評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著政溃,像睡著了一般趾访。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上董虱,一...
    開封第一講書人閱讀 50,036評論 1 291
  • 那天扼鞋,我揣著相機(jī)與錄音,去河邊找鬼愤诱。 笑死云头,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淫半。 我是一名探鬼主播盘寡,決...
    沈念sama閱讀 39,126評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撮慨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脆粥,我...
    開封第一講書人閱讀 37,868評論 0 268
  • 序言:老撾萬榮一對情侶失蹤砌溺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后变隔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體规伐,經(jīng)...
    沈念sama閱讀 44,315評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,641評論 2 327
  • 正文 我和宋清朗相戀三年匣缘,在試婚紗的時候發(fā)現(xiàn)自己被綠了猖闪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,773評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡肌厨,死狀恐怖培慌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柑爸,我是刑警寧澤吵护,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響馅而,放射性物質(zhì)發(fā)生泄漏祥诽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一瓮恭、第九天 我趴在偏房一處隱蔽的房頂上張望雄坪。 院中可真熱鬧,春花似錦屯蹦、人聲如沸维哈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,859評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笨农。三九已至,卻和暖如春帖渠,著一層夾襖步出監(jiān)牢的瞬間谒亦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工空郊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留份招,地道東北人。 一個月前我還...
    沈念sama閱讀 46,584評論 2 362
  • 正文 我出身青樓狞甚,卻偏偏與公主長得像锁摔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哼审,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,676評論 2 351

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,856評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫谐腰、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 1. 種樹的最佳時間是25年前。僅次于它的最佳時間是現(xiàn)在春霍。 大概是我20歲的時候砸西,大學(xué)時期的我正處于一個人生的迷茫...
    安易_閱讀 3,448評論 32 110
  • 貓的尷尬-鄭彥芳 我是一只愛吃胡蘿卜的灰色貓,我不知道我是什么品種址儒,媽媽在看弗洛伊德心理學(xué)說是為了我芹枷,怕我將來會變...
    我是彥芳閱讀 112評論 0 0
  • 無聊時聽首歌鸳慈,這樣的自我放松和調(diào)節(jié)方式可能比吃有機(jī)食品還健康吧,but——有些歌妖爷,真心搞不懂是在講什么蝶涩,今天...
    大李杜閱讀 388評論 0 0