以前對于iOS來說,線上出現(xiàn)bug,都很苦惱,因為iOS上線審核周期太長,至少需要一周時間,還是在審核成功的情況下。很多公司都沒有專業(yè)的測試員,都是程序員做測試,給程序員很大壓力。如果出現(xiàn)bug,不能及時修復(fù),所以很苦惱。我無意在查資料時,看到一篇文章,利用JSPatchPlatform框架可以線上修復(fù)bug,當(dāng)時好激動啊。我們的福利啊。下面是JSPatchPlatform框架的介紹
作用
是iOSApp獲取腳本語言能力:動態(tài)更新App,替換項目原生代碼修復(fù)bug。? 當(dāng)時聽到JSPatch有這個動態(tài)修復(fù)bug的功能,感覺有點不可思議,同時覺得這個JSPatch簡直太厲害了。用了它就可以及時修改App出現(xiàn)的bug,節(jié)約了上線先版本修復(fù)bug的時間。
根本原理
利用OC的動態(tài)語言特性去動態(tài)修改類的方法實現(xiàn),利用了OC的消息轉(zhuǎn)發(fā)機制.
使用
1.?JSPatch Platform就是一個第三方的JSPatch平臺,幫助客戶端開發(fā)者下發(fā)和管理腳本,處理傳輸安全等部署工作。 有了JSPatch平臺就不用我們自己的后臺去操作了,當(dāng)然如果我們自己的后臺愿意做能做也可以交給我們自己的后臺去做。
2.首先需要登錄官網(wǎng)注冊(http://jspatch.com),成為它的一個用戶* 添加自己要使用JSPatch的App,
3.添加App完成后會相應(yīng)地有一個AppKey作為App的唯一標(biāo)識* App添加完成后我們還需要為App添加App版本,這樣這個平臺才能知道我們的哪個版
4.需要修復(fù)的代碼的時候需要寫一個js腳本本的App需要使用JSPatch進行代碼動態(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]]; //可能會超出數(shù)組范圍導(dǎo)致crash
XRViewController *controller = [[JPViewController alloc] initWithContent:content];
[self.navigationController pushViewController:controller];
}
@end
對此我們寫了如下 JS 腳本準(zhǔn)備替換上述方法修復(fù)這個 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);
}
}
})
如果我們不會寫JS的話,平臺還為我們提供腳本編輯器可以進行編輯這時我們需要在Xcode中創(chuàng)建一個main.js文件,創(chuàng)建一個空文件即可,JS腳本的文件名必須是**main.js**.
注意
?若使用 XCode8 接入,需要在項目 Capabilities 打開 Keychain Sharing 開關(guān),否則在模擬器下載腳本后會出現(xiàn) decompress error, md5 didn't match 錯誤(真機無論是否打開都沒問題)

修改/刪除JS腳本
若后續(xù)需要對這個腳本進行修改,可以重新上傳新的腳本,APP 客戶端會在請求時發(fā)現(xiàn)腳本已更新,下載最新腳本覆蓋原來的,下次啟動時執(zhí)行。?
?若想直接取消某個 APP 版本的 JS 腳本補丁,可以直接在 APP 版本界面刪除此 APP 版本,APP 客戶端會在請求時發(fā)現(xiàn)腳本已被刪除,即刻刪除本地 JS 腳本文件,下次啟動時不再加載。
這門技術(shù)的確挺叼的,騰訊、阿里都在用,我已經(jīng)用到項目中了,感覺確實挺神奇。不錯,我喜歡。