JSPatch 是一個開源項目(Github鏈接),只需要在項目里引入極小的引擎文件,就可以使用 JavaScript 調用任何 Objective-C 的原生接口,替換任意 Objective-C 原生方法。目前主要用于下發 JS 腳本替換原生 Objective-C 代碼,實時修復線上 bug。
1、使用JSPatch干什么?
上線后實時修復線上 bug
2、怎么使用JSPatch?
Github 開源的是 JSPatch 核心代碼,使用完全免費自由,若打算自己搭建后臺下發 JSPatch 腳本,可以直接使用 github 上的核心代碼,與 JSPatch 平臺上的 SDK 無關。JSPatch 平臺的 SDK 在核心代碼的基礎上增加了向平臺請求腳本/傳輸解密/版本管理等功能,只用于這個平臺。
如果自己想用免費的功能,則應該使用開源代碼,配合自己的服務器來實現,有條件的直接用JSPatch 平臺封裝好的sdk,下面配合實例來實現
3、導入框架
通過 cocoa pods 集成pod 'JSPatchPlatform'
,然后再執行 pod install
即可。
或者手動導入,若沒有使用 cocoapods,也可以手動集成。在本頁左側下載 SDK 后解壓,將 JSPatchPlatform.framework 拖入項目中,勾選 "Copy items if needed",并確保 "Add to target" 勾選了相應的 target。
添加依賴框架:TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加libz.dylib
和 JavaScriptCore.framework
。
注意:手動集成無法斷點調試 JSPatch 核心源碼,推薦使用 cocoapods 方式集成。
4、主要步驟 在平臺創建自己的應用,獲取appid 和其他的平臺一樣,就不截圖了
需要上傳main.js補丁文件,那我們要創建一個這種補丁文件,
Empty文件,自己命名main.js文件,接下來就是在里面寫上js補丁代碼,接下來問題就來了,我特么不會寫js,腫么辦,表怕,項目開發者有辦法,首先https://github.com/bang590/JSPatch/wiki/JSPatch-%E5%9F%BA%E7%A1%80%E7%94%A8%E6%B3%95 里的內容搞清楚,大概大部分問題應該是沒問題了,然而最簡單的方法,就是寫上oc的代碼,用http://bang590.github.io/JSPatchConvertor/ 工具來轉吧,還要怎么樣。。
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSArray *arr=@"sss";
arr[1];
}
點擊后就爆炸,我們來修復這個問題
// 要用到的OC類需要require引用下
require('UIAlertView')
// 重寫ViewController類中的touchesBegan_withEvent方法,具體寫法看文檔吧
defineClass("ViewController", {
touchesBegan_withEvent: function(touches, event) {
// 方法的實現
var av = UIAlertView.alloc().initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles("bug修復了", "是不是很神奇", null, "取消", "確定", null);
av.show();
}
})
補丁里面就是這個類容,就是復寫替換的有bug的那個方法
關鍵部分
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JSPatch startWithAppKey:@"0b4d015f6d0b0b7e"];
[JSPatch sync];
// Override point for customization after application launch.
return YES;
}
把剛剛獲得的appID寫在上面位置,即在每次啟動的時候,會更新讀取這個補丁文件,用來修復bug。
當然在發布這個補丁前,一般要測試下是不是沒問題吧,so
// [JSPatch startWithAppKey:@"asdasdasdasdasadasd"];
// [JSPatch sync];
[JSPatch testScriptInBundle]; // 用于測試,會在bundle下自動尋找main.js來執行