其實(shí)熱修復(fù)本身也是一個(gè)比較雞肋的東西, 如果公司項(xiàng)目做的很好的話,一般會(huì)比較少用到這個(gè)東西
但是JSPatch 方式的熱修復(fù)可以我們避免頻繁的提交項(xiàng)目到AppStore, 當(dāng)項(xiàng)目有重大bug時(shí), 我們免去了審核的時(shí)間, 可以隨時(shí)對(duì)項(xiàng)目進(jìn)行修復(fù), 避免造成損失
下面我以簡單的修改方式, 來演示熱修復(fù)的使用過程
寫在前面:
首先感謝bang大神的熱修復(fù)的解決方案, gitHub下載地址: JSPatch
我們也可以使用cocoaPods pod 'JSPatchSDK'的方式,或者你也可以直接從JSPatch平臺(tái)來下載: JSPatch平臺(tái)
一: 創(chuàng)建項(xiàng)目
我創(chuàng)建了一個(gè)測試的項(xiàng)目, 我們?cè)?code>ViewController類的- (void)viewDidLoad方法中, 對(duì)我們創(chuàng)建好的一個(gè)label,進(jìn)行賦值

二: 項(xiàng)目配置
- 如果你使用從gitHub下載的方式來手動(dòng)導(dǎo)入, 那么需要把下載的壓縮包解壓縮,然后
JSPatch文件夾下的三個(gè)文件:JPEngine.h,JPEngine.m,JSPatch.js導(dǎo)入到你的項(xiàng)目中, 如果是使用JSPatch平臺(tái)下載的話, 那么把解壓縮后的JSPatchPlatform.framework導(dǎo)入到你的項(xiàng)目中
2.因?yàn)闊嵝迯?fù)需要使用JavaScript語言來進(jìn)行, 所以需要導(dǎo)入JavaScriptCore.framework和libz.tdb
3.因?yàn)閕OS9引入了新特性App Transport Security(ATS)所以需要使用HTTPS協(xié)議, 我們通過下面的方式來規(guī)避這個(gè)問題
objc
- 在info.plist中添加NSAppTransportSecurity類型為Dictionary.
- 在NSAppTransportSecurity中添加NSAllowsArbitraryLoads類型為Boolean,值為YES
如果沒有添加這個(gè)字段, 那么會(huì)導(dǎo)致你的控制臺(tái)打印如下的錯(cuò)誤:
The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
三: 平臺(tái)配置
1.打開JSPatch平臺(tái), 我們的更新內(nèi)容需要在這個(gè)平臺(tái)上托管,并且在平臺(tái)上注冊(cè)賬號(hào), 并添加APP, AppID 測試可以不填

創(chuàng)建完成之后在項(xiàng)目的左側(cè)可以看見你的APPKey,右側(cè)有一個(gè)添加APP版本

點(diǎn)擊進(jìn)入之后填寫你需要更新的APP版本號(hào), 這個(gè)版本號(hào)與你項(xiàng)目的version對(duì)應(yīng), 注意不要填錯(cuò)
2.在你的項(xiàng)目的APPDelegate類導(dǎo)入頭文件#import <JSPatch/JSPatch.h>
并在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代碼
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//#ifdef DEBUG
// [JSPatch setupDevelopment];
//#endif
[JSPatch startWithAppKey:@"ffc4f4ffcf7a45f2"];
//用來檢測回調(diào)的狀態(tài),是更新或者是執(zhí)行腳本之類的,相關(guān)信息,會(huì)打印在你的控制臺(tái)
[JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) {
}];
[JSPatch setupDevelopment];
[JSPatch sync];
// [JSPatch testScriptInBundle];
return YES;
}
startWithAppKey后面跟著的就是第1步驟獲取的AppKey
3.創(chuàng)建main.js文件, 修改項(xiàng)目中你想修改的地方, 例如,我在項(xiàng)目中把這個(gè)文字修改掉,
defineClass('ViewController', {
viewDidLoad: function() {
self.super().viewDidLoad();
// Do any additional setup after loading the view, typically from a nib.
self.contentLabel().setText("我要去日本");
},
});
這里defineClass('ViewController',{ })意味著找到ViewController這個(gè)類, 然后找到這個(gè)類中的viewDidLoad:方法
self.super().viewDidLoad();
self.contentLabel().setText("我要去日本");
當(dāng)然JSPatch平臺(tái)也提供了語言轉(zhuǎn)換工具,我們可以把我們的OC語言轉(zhuǎn)換為JavaScript語言,然后再復(fù)制到main.js中
當(dāng)然如果你使用這個(gè)工具也不是萬能的, 如果有類似創(chuàng)建控件的frame的情況,就需要手動(dòng)改動(dòng)
UILabel.alloc().initWithFrame({x:100, y:100, width:100, height:100});
- 回到JSPatch平臺(tái)中, 再次點(diǎn)擊剛剛創(chuàng)建的應(yīng)用版本, 點(diǎn)擊選擇文件, 把
main.js添加上去,如果你想添加多個(gè)補(bǔ)丁可以點(diǎn)擊選擇文件繼續(xù)添加, 然后選擇開發(fā)預(yù)覽之后提交

然后點(diǎn)擊全量下發(fā)

5.運(yùn)行你的程序這樣就完成了全部過程, 值得一說的是, 由于補(bǔ)丁是先下載, 然后運(yùn)行, 所以第一次運(yùn)行時(shí)不會(huì)顯示, 需要再次運(yùn)行一遍, 你就會(huì)看到變化了
