一、目的:
隨著APP迭代更新,項(xiàng)目越寫越龐大讹语,每個(gè)功能間的關(guān)聯(lián)性越來越多。再加上測(cè)試人員人手不足等情況蜂科,不可避免會(huì)發(fā)布帶有bug的APP到appStore顽决,所以我們就想盡快發(fā)布新版本進(jìn)行覆蓋。蘋果公司對(duì)APP的審核速度現(xiàn)在雖然有所提高导匣,但是仍需要時(shí)間才菠。而在這段時(shí)間內(nèi)很可能就會(huì)喪失大量用戶。所以逐抑,在發(fā)現(xiàn)bug后立即解決并能同步到所有客戶端內(nèi)鸠儿,這就是我們要達(dá)成的目的。然而使用JSPatch就可以解決這樣的問題厕氨,只需在項(xiàng)目中引入JSPatch,就可以在發(fā)現(xiàn)bug時(shí)下發(fā)JS腳本補(bǔ)丁进每,替換原生方法,無(wú)需更新APP即時(shí)修復(fù)bug命斧。
二田晚、實(shí)現(xiàn)原理:
我們可以通過JavaScript代碼來修改OC代碼,歸根結(jié)底還是OC運(yùn)行時(shí)及消息轉(zhuǎn)發(fā)機(jī)制国葬。
三贤徒、JSPatch集成
1.cocoaPods集成
在Podfile文件引入:
pod 'JSPatchPlatform'
再pod update即可
2.手動(dòng)集成
去網(wǎng)站下載SDK:http://jspatch.com/Index/sdk
下載完成后將JSPatchPlatform.framework 拖入工程后 在TARGETS ->Build Phases ->Link binary with libraries 添加libz.tbd
四、熱更新和熱修復(fù)的簡(jiǎn)單嘗試
首先創(chuàng)建一個(gè)工程汇四,使用上面的任意一種方式集成JSPatch接奈,然后在viewController里添加如下代碼(控件從storyboard拖拽的,代碼亦可)通孽。
運(yùn)行結(jié)果如下圖所示:此時(shí)label的text為"原始文字"序宦,而button一點(diǎn)擊就會(huì)crash。然而需求是:label的text為"修改后的文字"背苦,button點(diǎn)擊后文字改為"按鈕被點(diǎn)擊了"互捌,那么在不上傳新的APP到appStore時(shí)如何實(shí)現(xiàn)這個(gè)需求呢潘明。這就要用到JSPatch了。
1秕噪、在appDelegate引入頭文件#import <JSPatchPlatform/JSPatch.h>并在didFinishLaunchingWithOptions方法里添加如下代碼
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //初始化SDK [JSPatch startWithAppKey:@"你的appKey"]; //進(jìn)入開發(fā)模式(開發(fā)測(cè)試時(shí)調(diào)用) [JSPatch setupDevelopment]; // 同步腳本 [JSPatch sync]; return YES; }
2钳降、獲得你的appKey
- 需要先在平臺(tái)注冊(cè)用戶http://jspatch.com/Index/reg
- 注冊(cè)成功后然后添加要集成的APP
-
添加成功后會(huì)出現(xiàn)對(duì)應(yīng)的appKey,這個(gè)就是上面需要你填寫的appKey
添加成功.png
3腌巾、上傳js腳本補(bǔ)丁進(jìn)行修改/修復(fù)
-
添加版本遂填。!注意:這個(gè)版本號(hào)要與你工程的版本號(hào)一致,否則無(wú)法下載響應(yīng)的補(bǔ)丁澈蝙。
添加版本.png - 上傳js腳本城菊,上傳要求:JS腳本的文件名必須是main.js
1、創(chuàng)建一個(gè)空的main.js格式文件碉克,添加如下代碼
defineClass('ViewController', { test : function() { self.label().setText("修改后的文字"); } })
defineClass("ViewController", { btnClicked: function(sender) { sender.setTitle_forState("按鈕被點(diǎn)擊了", 0); } }, {});
ps:如果不熟悉js代碼,可使用轉(zhuǎn)換器將oc代碼轉(zhuǎn)換成js代碼并齐。http://jspatch.com/Tools/convertor
2漏麦、選擇剛才創(chuàng)建的版本,進(jìn)入如下界面况褪,上傳main.js文件撕贞,勾選開發(fā)預(yù)覽,點(diǎn)擊提交测垛。
3捏膨、然后就到了你驗(yàn)證奇跡的時(shí)刻。運(yùn)行你的項(xiàng)目試一下食侮。!注:如果你的xcode8并且是用模擬器運(yùn)行的則需要在項(xiàng)目 Capabilities 打開 Keychain Sharing 開關(guān)号涯。
看看你的運(yùn)行結(jié)果是不是和我的一樣,如果一樣那么這個(gè)簡(jiǎn)單的嘗試就結(jié)束了锯七。但是JSPatch的操作還是挺繁多的链快,比如如何添加新方法、如何給一個(gè)類動(dòng)態(tài)新增 Property等一系列操作任需要我們掌握眉尸。參見https://github.com/bang590/JSPatch/wiki/JSPatch-基礎(chǔ)用法
當(dāng)然我們也可以本地測(cè)試main.js文件是否正確且有用:首先將main.js文件拖入工程域蜗,再在didFinishLaunchingWithOptions方法里將[JSPatch startWithAppKey:@"你的appKey"];
替換為[JSPatch testScriptInBundle];
(注:這兩個(gè)方法不能同時(shí)調(diào)用)。
PS:JSPatch 是一個(gè)開源項(xiàng)目,本文是在JSPatch平臺(tái)的基礎(chǔ)上操作的噪猾,如果想通過自己的服務(wù)器實(shí)現(xiàn)腳本的檢測(cè)霉祸、下發(fā)等操作,可直接在github上下載源碼進(jìn)行操作袱蜡。https://github.com/bang590/JSPatch