以前對(duì)于iOS來說,線上出現(xiàn)bug,都很苦惱弦叶,因?yàn)閕OS上線審核周期太長(zhǎng)科盛,至少需要一周時(shí)間,還是在審核成功的情況下壳快。很多公司都沒有專業(yè)的測(cè)試員纸巷,都是程序員做測(cè)試,給程序員很大壓力眶痰。如果出現(xiàn)bug瘤旨,不能及時(shí)修復(fù),所以很苦惱竖伯。我無意在查資料時(shí)存哲,看到一篇文章,利用JSPatchPlatform框架可以線上修復(fù)bug黔夭,當(dāng)時(shí)好激動(dòng)啊宏胯。我們的福利啊。下面是JSPatchPlatform框架的介紹
作用
是iOSApp獲取腳本語言能力:動(dòng)態(tài)更新App本姥,替換項(xiàng)目原生代碼修復(fù)bug肩袍。? 當(dāng)時(shí)聽到JSPatch有這個(gè)動(dòng)態(tài)修復(fù)bug的功能,感覺有點(diǎn)不可思議婚惫,同時(shí)覺得這個(gè)JSPatch簡(jiǎn)直太厲害了氛赐。用了它就可以及時(shí)修改App出現(xiàn)的bug,節(jié)約了上線先版本修復(fù)bug的時(shí)間先舷。
根本原理
利用OC的動(dòng)態(tài)語言特性去動(dòng)態(tài)修改類的方法實(shí)現(xiàn),利用了OC的消息轉(zhuǎn)發(fā)機(jī)制.
使用
1.?JSPatch Platform就是一個(gè)第三方的JSPatch平臺(tái),幫助客戶端開發(fā)者下發(fā)和管理腳本艰管,處理傳輸安全等部署工作。 有了JSPatch平臺(tái)就不用我們自己的后臺(tái)去操作了蒋川,當(dāng)然如果我們自己的后臺(tái)愿意做能做也可以交給我們自己的后臺(tái)去做牲芋。
2.首先需要登錄官網(wǎng)注冊(cè)(http://jspatch.com),成為它的一個(gè)用戶* 添加自己要使用JSPatch的App,
3.添加App完成后會(huì)相應(yīng)地有一個(gè)AppKey作為App的唯一標(biāo)識(shí)* App添加完成后我們還需要為App添加App版本,這樣這個(gè)平臺(tái)才能知道我們的哪個(gè)版
4.需要修復(fù)的代碼的時(shí)候需要寫一個(gè)js腳本本的App需要使用JSPatch進(jìn)行代碼動(dòng)態(tài)修復(fù)
5.在 AppDelegate.m 里載入文件,并調(diào)用 +startWithAppKey: 方法缸浦,參數(shù)為第一步獲得的 AppKey夕冲。接著調(diào)用 +sync 方法檢查更新
#import@implementation AppDelegate
1- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JSPatch startWithAppKey:@"你的AppKey"];
[JSPatch sync];
}
@end
假設(shè)已接入 JSPatch SDK 的某線上 APP 發(fā)現(xiàn)一處代碼有 bug 導(dǎo)致 crash
@implementation XRTableViewController
. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *content = self.dataSource[[indexPath row]]; //可能會(huì)超出數(shù)組范圍導(dǎo)致crash
XRViewController *controller = [[JPViewController alloc] initWithContent:content];
[self.navigationController pushViewController:controller];
}
@end
對(duì)此我們寫了如下 JS 腳本準(zhǔn)備替換上述方法修復(fù)這個(gè) bug
//main.js
defineClass("XRTableViewController", {
tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {
var row = indexPath.row()
if (self.dataSource().length > row) {? //加上判斷越界的邏輯
var content = self.dataArr()[row];
var controller = XRViewController.alloc().initWithContent(content);
self.navigationController().pushViewController(controller);
}
}
})
如果我們不會(huì)寫JS的話,平臺(tái)還為我們提供腳本編輯器可以進(jìn)行編輯這時(shí)我們需要在Xcode中創(chuàng)建一個(gè)main.js文件裂逐,創(chuàng)建一個(gè)空文件即可,JS腳本的文件名必須是**main.js**.
注意
?若使用 XCode8 接入歹鱼,需要在項(xiàng)目 Capabilities 打開 Keychain Sharing 開關(guān),否則在模擬器下載腳本后會(huì)出現(xiàn) decompress error, md5 didn't match 錯(cuò)誤(真機(jī)無論是否打開都沒問題)
修改/刪除JS腳本
若后續(xù)需要對(duì)這個(gè)腳本進(jìn)行修改卜高,可以重新上傳新的腳本弥姻,APP 客戶端會(huì)在請(qǐng)求時(shí)發(fā)現(xiàn)腳本已更新,下載最新腳本覆蓋原來的掺涛,下次啟動(dòng)時(shí)執(zhí)行庭敦。?
?若想直接取消某個(gè) APP 版本的 JS 腳本補(bǔ)丁,可以直接在 APP 版本界面刪除此 APP 版本鸽照,APP 客戶端會(huì)在請(qǐng)求時(shí)發(fā)現(xiàn)腳本已被刪除螺捐,即刻刪除本地 JS 腳本文件,下次啟動(dòng)時(shí)不再加載矮燎。
這門技術(shù)的確挺叼的定血,騰訊、阿里都在用诞外,我已經(jīng)用到項(xiàng)目中了澜沟,感覺確實(shí)挺神奇。不錯(cuò)峡谊,我喜歡茫虽。