前言
限于AppStore的審核機制韵丑,蘋果應(yīng)用審核通常需要一段時間侯谁。這對某些應(yīng)用開發(fā)迭代比較快的公司來說,往往上一版本還在AppStore審核堡称,新一版本已經(jīng)開發(fā)完畢了瞎抛,相對于Android的當天發(fā)布來說,已經(jīng)算是不能再慢了却紧。要是正好遇上線上有bug桐臊,那么又得重新回到AppStore提交-審核-發(fā)布的流程中去,但若是十分緊要的bug啄寡,不修復(fù)會影響應(yīng)用的正常使用豪硅,那么再走這個流程就顯得非常慢了。以前面對這種問題往往是走加急審核挺物,但加急審核也會有3天時間懒浮,那能不能不發(fā)布版本在線上修復(fù)bug呢?答案是有的识藤,這里選擇的方案是JSPatch砚著。
JSPatch簡介
JSPatch是由國人開發(fā)的開源項目(Github鏈接)只需要在項目里引入極小的引擎文件,就可以使用 JavaScript 調(diào)用任何 Objective-C 的原生接口痴昧,替換任意 Objective-C 原生方法稽穆。目前主要用于下發(fā) JS 腳本替換原生 Objective-C 代碼,實時修復(fù)線上 bug赶撰。
關(guān)于JSPatch的實現(xiàn)原理可以參考作者的博客舌镶。
語法
JSPatch使用簡單明了,但需要注意的是JSPatch的語法豪娜,將OC語言轉(zhuǎn)為JSPatch餐胀,例如:
- OC
@implementation SampleClass
- (void)requestUrl:(NSString *)url param:(NSDictionary *)dict callback:(JPCallback)callback {
[super requestUrl:url param:dict callback:callback];
JPRequest *obj = [[JPRequest alloc] initWithUrl:url param:dict];
obj.successBlock = ^(id data, NSError *err) {
NSString *content = [JPParser parseData:data];
if (callback) callback(@{
@"content": content
}, err);
[self.dataSource refresh];
self.handleRequestSuccess(data);
};
}
@end
- JSPatch
require('JPRequest,JPParser');
defineClass('SampleClass', {
requestUrl_param_callback: function(url, dict, callback) {
self.super().requestUrl_param_callback(url, dict, callback);
var obj = JPRequest.alloc().initWithUrl_param(url, dict);
obj.setSuccessBlock(block('id,NSError*', function(data, err) {
var content = JPParser.parseData(data);
if (callback) callback({
"content": content
}, err);
self.dataSource().refresh();
self.handleRequestSuccess()(data);
}));
},
});
作者提供了一個JSPatchConvertor簡單粗暴,能滿足一些簡單的轉(zhuǎn)換瘤载,比較復(fù)雜的就得人工修改了否灾,更多語法上的可以參考JSPatchWiki。
安全
使用 JSPatch 有兩個安全問題:
- 傳輸安全:JS 腳本可以調(diào)用任意 OC 方法鸣奔,權(quán)限非常大墨技,若被中間人攻擊替換代碼惩阶,會造成較大的危害。
- 執(zhí)行安全:下發(fā)的 JS 腳本靈活度大扣汪,相當于一次小型更新断楷,若未進行充分測試,可能會出現(xiàn) crash 等情況對 APP 穩(wěn)定性造成影響崭别。
作者推薦的一種方案如圖所示:
1.服務(wù)端計算出腳本文件的 MD5 值脐嫂,作為這個文件的數(shù)字簽名。
2.服務(wù)端通過私鑰加密第 1 步算出的 MD5 值紊遵,得到一個加密后的 MD5 值。
3.把腳本文件和加密后的 MD5 值一起下發(fā)給客戶端侥蒙。
4.客戶端拿到加密后的 MD5 值暗膜,通過保存在客戶端的公鑰解密。
5.客戶端計算腳本文件的 MD5 值鞭衩。
6.對比第 4/5 步的兩個 MD5 值(分別是客戶端和服務(wù)端計算出來的 MD5 值)学搜,若相等則通過校驗。
對于JSPatch若有更多安全上的顧慮可以參考作者的回應(yīng)一下 JSPatch 安全問題论衍。
使用
目前有兩種使用方法瑞佩,一種是使用作者提供的JSPatch Platform平臺,集成JSPatch的SDK坯台,按請求次數(shù)收費炬丸,目前免費額度為 100w次請求/月,超出的部分會另行收費蜒蕾。
還有一種是自己造輪子稠炬,畢竟JSPatch是開源的,從前端邏輯到后臺安全策略咪啡,都可以根據(jù)公司的業(yè)務(wù)需求自由定制首启。
后記
總體來說還是十分好用的,需要注意的是每次版本用JSPatch解決的線上Bug后撤摸,下個版本必須得將代碼寫入項目中毅桃。