iOS JSPatch 使用

17/03/08更新
有不少小伙伴反應蘋果發(fā)送了郵件要求去除項目中用于動態(tài)改變應用的代碼 ,看來 JSPatch 要被禁止使用了

Your app, extension, and/or linked framework appears to contain code designed explicitly with the capability to change your app’s behavior or functionality after App Review approval, which is not in compliance with section 3.3.2 of the Apple Developer Program License Agreement and App Store Review Guideline 2.5.2. This code, combined with a remote resource, can facilitate significant changes to your app’s behavior compared to when it was initially reviewed for the App Store. While you may not be using this functionality currently, it has the potential to load private frameworks, private methods, and enable future feature changes.
This includes any code which passes arbitrary parameters to dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior or call SPI, based on the contents of the downloaded script. Even if the remote resource is not intentionally malicious, it could easily be hijacked via a Man In The Middle (MiTM) attack, which can pose a serious security vulnerability to users of your app.
Please perform an in-depth review of your app and remove any code, frameworks, or SDKs that fall in line with the functionality described above before submitting the next update for your app for review.
Best regards,
App Store Review

JSPatch 平臺關于蘋果警告的解決方案 --bang

前言

App 上線后可能存在測試時未發(fā)現(xiàn)的 bug,影響用戶使用送悔,利用 JSPatch 在 App 不進行版本迭代的情況下進行 bug 修復。

什么是 JSPatch 持际?

JSPatch 是一個開源項目(Github鏈接),只需要在項目里引入極小的引擎文件哗咆,就可以使用 JavaScript 調用任何 Objective-C 的原生接口蜘欲,替換任意 Objective-C 原生方法。目前主要用于下發(fā) JS 腳本替換原生 Objective-C 代碼晌柬,實時修復線上 bug姥份。
除了修復 bug,JSPatch 也可以用于動態(tài)運營年碘,實時修改線上 APP 行為澈歉,或動態(tài)添加功能。

什么是 JSPatch 平臺屿衅?

JSPatch 需要使用者有一個后臺可以下發(fā)和管理腳本埃难,并且需要處理傳輸安全等部署工作,JSPatch 平臺幫你做了這些事傲诵,提供了腳本后臺托管凯砍,版本管理箱硕,保證傳輸安全等功能拴竹,讓你無需搭建一個后臺,無需關心部署操作剧罩,只需引入一個 SDK 即可立即使用 JSPatch栓拜。

引用自 JSPatch 的官方文檔(文檔鏈接),下面講一下 JSPatch 的使用。

JSPatch 使用

新建一個項目

項目名稱

然后在 ViewController.m 中寫一段會造成崩潰的代碼(這里只是參考)

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic , strong) NSArray *arr;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%@" , self.arr[2]);
}
- (NSArray *)arr {
    if (!_arr) {
        _arr = [NSArray array];
    }
   return _arr;
}

集成 SDK

1幕与、通過 cocoapods 導入

podfile 中添加命令:
pod 'JSPatchPlatform', :git => 'https://github.com/bang590/JSPatchPlatform.git'
再執(zhí)行 pod install 即可挑势。

2、手動導入

下載 SDK 后解壓啦鸣,將** JSPatchPlatform.framework** 拖入項目中潮饱,勾選 "Copy items if needed",并確保 "Add to targets" 勾選了相應的 target诫给。

將SPatchPlatform.framework 拖入項目

pods 導入或手動導入SDK后添加依賴框架:TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加libz.dylib(Xcode7之后是libz.tbd)和 JavaScriptCore.framework香拉。
添加依賴框架

測試使用

1、測試本地腳本

本地測試 AppDelegate.m 按如下寫法即可中狂,SDK 提供了+testScriptInBundle 方法用于開發(fā)狀態(tài)下測試凫碌。

#import "AppDelegate.h"
// 引入頭文件
#import <JSPatchPlatform/JSPatch.h>

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /*
     用于發(fā)布前測試腳本。先把腳本放入項目中胃榕,調用后盛险,會在當前項目的 bundle 里尋找 main.js 文件執(zhí)行
     測試完成后請刪除,改為調用 +startWithAppKey: 和 +sync
     */
     [JSPatch testScriptInBundle];
    return YES;
}

然后在我們的 demo 中新建一個 empty 文件勋又,叫 main.js苦掘,注意這是 JSPatch 平臺規(guī)范,js 腳本文件名必須是 main.js赐写。

新建main.js

命名

完成之后是這樣
2025675-86251bfd522e2882.png.jpeg

現(xiàn)在我們就可以通過在 main.js 寫 js 修復 demo 中的 bug鸟蜡,代碼如下:

require('NSArray');
defineClass('ViewController', {
            viewDidLoad: function() {
            self.super().viewDidLoad();
            self.setArr(["1","2","阿西吧","3"]);
            var str = self.arr().objectAtIndex(2);
            console.log("JSPatch調用" , str);
            },
            });

運行,OK


控制臺打印表示 bug 修復成功
2挺邀、線上版本測試

熱修復針對的是線上版本揉忘,所以本地測試只是驗證可行性,重要的還是線上 bug 的修復端铛。下面我們進行線上測試泣矛。
JSPatch官網(wǎng) 注冊,登錄禾蚕,我的 App您朽,添加 App,獲取 app key换淆,添加 App 版本哗总,發(fā)布補丁

添加 App

獲取 appKey,添加 App 版本

01AD1159-1A7F-4200-AFD1-31F33A9A99F1.png

提交之后點進去就可以進行補丁發(fā)布:
補丁發(fā)布

注:有關開發(fā)預覽、灰度下發(fā)倍试、條件下發(fā)請查看官方文檔開發(fā)預覽灰度與條件下發(fā)了解讯屈。補丁發(fā)布之后,對應版本的 APP 會請求下載這個腳本保存在本地县习,以后每次啟動都會執(zhí)行這個腳本涮母。至此線上 bug 修復完成谆趾。
現(xiàn)在只是發(fā)布了補丁,而我們的測試 demo 里的代碼還沒有修改叛本,所以還不能進行線上測試沪蓬。下面修改我們的測試代碼。
-application:didFinishLaunchingWithOptions:調用+startWithAppKey:方法来候,參數(shù)為之前獲得的 appKey跷叉。接著調用+sync方法檢查更新。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //[JSPatch testScriptInBundle]; // 用于發(fā)布前測試腳本营搅,測試完成后請刪除性芬,改為調用 +startWithAppKey: 和 +sync
    [JSPatch startWithAppKey:@"210a38abb83a9689"];
    [JSPatch sync];
    return YES;
}

注意+testScriptInBundle不能與+startWithAppKey:一起調用,+testScriptInBundle只用于本地測試剧防,測試完畢后需要去除植锉,項目中的 main.js 文件也要刪除(可拷貝一份至桌面留作上傳的補丁使用)。另外峭拘,通過 JSPatch 平臺上傳的腳本文件都會保存在七牛云存儲上俊庇,而七牛云存儲的下載使用的是 http 協(xié)議,因此需要在項目的 info.plist 文件中添加如下字段(這個應該都知道的...忽略)

info.plist

OK鸡挠,現(xiàn)在我們來運行 demo
3788F246-7484-4D73-904B-BA424EB903BA.png

和本地測試一樣線上測試bug也修復成功辉饱。

修改/刪除 js 腳本

若后續(xù)需要對這個腳本進行修改,可以重新上傳新的腳本拣展,APP 客戶端會在請求時發(fā)現(xiàn)腳本已更新彭沼,下載最新腳本覆蓋原來的,下次啟動時執(zhí)行备埃。
若想直接取消某個 APP 版本的 JS 腳本補丁姓惑,可以直接在 APP 版本界面刪除此 APP 版本,APP 客戶端會在請求時發(fā)現(xiàn)腳本已被刪除按脚,即刻刪除本地 JS 腳本文件于毙,下次啟動時不再加載。

補充

JSPatch 作者@bang提供了一個轉換工具 JSPatch Converto辅搬,可以將 OC 轉換為 js 唯沮。

JSPatch Converto

此外,@bang 大神還給我們準備了JSPatch XCode代碼自動補全插件堪遂,讓我們使用 JSPatch 更得心應手介蛉。
JSPatch XCode代碼自動補全插件

結語

對 JSPatch 研究有限,這里只是介紹了 JSPatch 的基礎用法溶褪,有錯誤或不當?shù)牡胤綒g迎指正币旧、交流。如果你想學習更多 JSPatch 的用法可以到 JSPatch 平臺使用文檔了解竿滨。如果你想知道 JSPatch 實現(xiàn)原理佳恬,看這里:JSPatch 實現(xiàn)原理詳解
本文 demo 后續(xù)會上傳 GitHub于游,鏈接留在留言中毁葱。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贰剥,隨后出現(xiàn)的幾起案子倾剿,更是在濱河造成了極大的恐慌,老刑警劉巖蚌成,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前痘,死亡現(xiàn)場離奇詭異,居然都是意外死亡担忧,警方通過查閱死者的電腦和手機芹缔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓶盛,“玉大人最欠,你說我怎么就攤上這事〕兔ǎ” “怎么了芝硬?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長轧房。 經(jīng)常有香客問我拌阴,道長,這世上最難降的妖魔是什么奶镶? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任迟赃,我火速辦了婚禮,結果婚禮上厂镇,老公的妹妹穿的比我還像新娘捺氢。我一直安慰自己,他們只是感情好剪撬,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布摄乒。 她就那樣靜靜地躺著,像睡著了一般残黑。 火紅的嫁衣襯著肌膚如雪馍佑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天梨水,我揣著相機與錄音拭荤,去河邊找鬼。 笑死疫诽,一個胖子當著我的面吹牛舅世,可吹牛的內(nèi)容都是我干的旦委。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雏亚,長吁一口氣:“原來是場噩夢啊……” “哼缨硝!你這毒婦竟也來了?” 一聲冷哼從身側響起罢低,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤查辩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后网持,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宜岛,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年功舀,在試婚紗的時候發(fā)現(xiàn)自己被綠了萍倡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡辟汰,死狀恐怖遣铝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莉擒,我是刑警寧澤酿炸,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站涨冀,受9級特大地震影響填硕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜鹿鳖,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一扁眯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翅帜,春花似錦姻檀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歼疮,卻和暖如春杂抽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背韩脏。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工缩麸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赡矢。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓杭朱,卻偏偏與公主長得像阅仔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弧械,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容