iOS-runtime-運用之JSPatch

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.dylibJavaScriptCore.framework

注意:手動集成無法斷點調試 JSPatch 核心源碼,推薦使用 cocoapods 方式集成。

4、主要步驟 在平臺創建自己的應用,獲取appid 和其他的平臺一樣,就不截圖了

5BF36747-0759-434D-84D7-517781DB3B9A.png

需要上傳main.js補丁文件,那我們要創建一個這種補丁文件,


CEEBC09A-39AD-4EA3-94EA-4E01A4795E1F.png

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來執行
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容