ios開發者收到了被拒絕 被警告的郵件JSPatch 的風險
2017年3月8…注意..是女神節這天。大量開發者收到了被拒絕 被警告的郵件,內容如下:
蘋果稽核協議中有這樣一節:
突然爆發並非偶然,蘋果的稽核指南一直明確,禁止下載可執行程式碼,雖然JSPatch等庫使用了JavaScriptCore來巧妙的實現,但也不是長久之計,很多開發者不自覺的使用其來下發私有方法等等行為遲早會被蘋果發現。也極大的威脅到了極其注重安全的蘋果
再有就是一切涉及到網路的都會有安全的風險
還有一個有意思的事實,昨天VS2017釋出,號稱內建iOS模擬器,直接開發React Native:
所以很多人也得出了一個災難性結論”蘋果封殺混合開發”,JSPatch等熱更新是誤傷….
為什麼沒使用熱更新會受到郵件
個人認為蘋果是批量掃描runtime並且群發的,蘋果沒辦法批量檢測remote script(遠端指令碼下載)
所以機智的檢測熱更新可能使用到的runtime方法,比如method_exchangeImplementations。這樣基本全覆蓋了那些使用熱更新的APP。
讓下載指令碼程式碼且使用runtime方法實現的的人下一個版本改掉,如果不改。就被下架被拒絕上架。
JSPatch是”下載指令碼程式碼且使用runtime”,並不是針對JSPatch一個庫
rollout.js,react native,weex都會有這種提示。
Runtime不能繼續用了?
個人認為原生程式碼中使用runtime還是沒問題,只是為了提醒那些使用了runtime並且下載遠端指令碼改變app行為的人。
如果蘋果把runtime變成私有方法或去掉.那麼Objective-C的優勢大大的沒有了…..
怎麼解決?
如果是類JSPatch這種只用來熱更新的,暫時去掉這些熱更新的庫吧,或者觀望陣子再上架新包。
如果是類React Native,抓緊轉行吧。。哈哈哈(我開玩笑的。。。)
之前開發者都收到了蘋果2017年的新開發者稽核協議更新通知
那下面來介紹一下 JSPatch
JSPatch 是一個開源專案(Github連結),只需要在專案裡引入極小的引擎檔案,就可以使用 JavaScript 呼叫任何 Objective-C 的原生介面,替換任意 Objective-C 原生方法。目前主要用於下發 JS 指令碼替換原生 Objective-C 程式碼,實時修復線上 bug。
例如線上 APP 有一段程式碼出現 bug 導致 crash:
@implementation JPTableViewController
...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *content = self.dataSource[[indexPath row]]; //可能會超出陣列範圍導致crash
JPViewController *ctrl = [[JPViewController alloc] initWithContent:content];
[self.navigationController pushViewController:ctrl];
}
...
@end
可以通過下發這樣一段 JS 程式碼,覆蓋掉原方法,修復這個 bug:
//JS
defineClass("JPTableViewController", {
//instance method definitions
tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {
var row = indexPath.row()
if (self.dataSource().length > row) { //加上判斷越界的邏輯
var content = self.dataArr()[row];
var ctrl = JPViewController.alloc().initWithContent(content);
self.navigationController().pushViewController(ctrl);
}
}
}, {})
除了修復 bug,JSPatch 也可以用於動態運營,實時修改線上 APP 行為,或動態新增功能。JSPatch 詳細使用文件見 Github Wiki。