選擇技術(shù)實(shí)現(xiàn)方案
近段時(shí)間,由于公司要求需要增加熱更新或熱修復(fù)功能复局,這個(gè)開發(fā)需求讓我有點(diǎn)頭疼马篮。記憶中蘋果公司已于2017年3月禁止了JSPatch那種方式的熱更新,我只好放棄JSPatch這種方案。網(wǎng)上找了一圈蜡坊,只有TTPatch和MangoFix這兩個(gè)框架可行杠输,但這兩個(gè)框架目前都不支持swift語言開發(fā)的項(xiàng)目。由于我手上的公司項(xiàng)目代碼還是OC開發(fā)的項(xiàng)目秕衙,不影響使用這兩個(gè)框架蠢甲。TTPatch是JSPatch的簡化版,原理與JSPatch相似据忘。MangoFix是DSL(即領(lǐng)域?qū)S谜Z言)開發(fā)的鹦牛,性能比TTPatch高出好幾倍。對(duì)比這兩個(gè)框架后勇吊,我選擇了MangoFix曼追,其實(shí)最主要的原因是MangoFix可以無感進(jìn)行修復(fù)代碼,用戶不用下載補(bǔ)丁文件操作汉规,只需要配置更新文件的遠(yuǎn)程地址將更新文件保存在本地即可礼殊。另外,據(jù)MangoFix的作者說鲫忍,MangoFix2.0版本將支持swift語言膏燕,我們一起期待吧!
更新于12月1日
目前已經(jīng)從MangoFix升級(jí)到OCRunner悟民,OCRunner可以支持方法以dynamic @objc開頭的Swift文件熱修復(fù)坝辫。相比MangoFix支持的方法更多了。參考以下鏈接文檔
https://github.com/SilverFruity/OCRunner/blob/master/README-CN.md
碼云儲(chǔ)存補(bǔ)丁配置遠(yuǎn)程地址
首先射亏,新建一個(gè)碼云倉庫的公開開源項(xiàng)目近忙,記得不要建私有項(xiàng)目,這樣會(huì)導(dǎo)致訪問不了文件的問題出現(xiàn)智润。
然后及舍,將mg后綴的補(bǔ)丁文件上傳上去即可。
最后窟绷,我們需要知道補(bǔ)丁文件的遠(yuǎn)程地址锯玛。怎么從碼云那里獲取到遠(yuǎn)程地址呢?可以從以下截圖獲得
MangoFix使用方法
MangoFix的具體使用請(qǐng)參照GitHub上的說明兼蜈,請(qǐng)點(diǎn)擊查看(Mango/README-CN.md at master · YPLiang19/Mango (github.com)
)攘残。
其實(shí)最重要的是將MangoFix打包下載下來,打開MangoFixDemo文件夾里面的Demo为狸。想使用遠(yuǎn)程地址替換本地的更新需要將下面代碼進(jìn)行設(shè)置:
#pragma mark - 熱修復(fù)
- (BOOL)encryptPlainScirptToDocument{
NSError *outErr = nil;
BOOL writeResult = NO;
//本地
// NSURL *scriptUrl = [[NSBundle mainBundle] URLForResource:@"xxxPatch" withExtension:@"mg"];
//遠(yuǎn)程
NSDictionary *info= [[NSBundle mainBundle] infoDictionary];
NSString *BundleVersion = info[@"CFBundleShortVersionString"];
NSString *pathStr = [NSString stringWithFormat:@"https://gitee.com/xxx/xx-patch/raw/master/xxxPatch%@.mg",BundleVersion];
#ifdef DEBUG
pathStr = @"https://gitee.com/xxx/xx-patch/raw/master/xxxPatchTest.mg";
#else
#endif
NSURL *scriptUrl = [NSURL URLWithString:pathStr];
NSString *plainScriptString = [NSString stringWithContentsOfURL:scriptUrl encoding:NSUTF8StringEncoding error:&outErr];
if (outErr) goto err;
{
NSURL *publicKeyUrl = [[NSBundle mainBundle] URLForResource:@"public_key.txt" withExtension:nil];
NSString *publicKey = [NSString stringWithContentsOfURL:publicKeyUrl encoding:NSUTF8StringEncoding error:&outErr];
if (outErr) goto err;
NSString *encryptedScriptString = [MFRSA encryptString:plainScriptString publicKey:publicKey];
NSString * encryptedPath= [(NSString *)[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"encrypted_xxxPatch.mg"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:encryptedPath]) {
[fileManager createFileAtPath:encryptedPath contents:nil attributes:nil];
}
writeResult = [encryptedScriptString writeToFile:encryptedPath atomically:YES encoding:NSUTF8StringEncoding error:&outErr];
}
err:
if (outErr) NSLog(@"%@",outErr);
return writeResult;
}
總結(jié)
OK歼郭,以上幾步完成基本就可以實(shí)現(xiàn)熱更新了,具體的測試案例可以參照MangoFixDemo里面的案例辐棒。
參考資料如下:
[MangoFix中文資料](Mango/README-CN.md at master · YPLiang19/Mango (github.com)
)
[iOS熱更新方案](iOS 現(xiàn)在的 “熱修復(fù)/熱更新” - 簡書 (jianshu.com)
)