JSPatch 熱更新

JSPatch 是一個(gè) iOS 動(dòng)態(tài)更新框架,只需在項(xiàng)目中引入極小的引擎,就可以使用 JavaScript 調(diào)用任何 Objective-C/Swift 原生接口。 獲得腳本語言的優(yōu)勢(shì),為項(xiàng)目動(dòng)態(tài)添加模塊,或替換項(xiàng)目原生代碼動(dòng)態(tài)修復(fù) bug,聽起來是不是很秀,但是過不了審核!


856EDF5ABFBAFD672CB1809018527804.jpg

過不過審核不要緊,重在探索嘛,其實(shí)我是在企業(yè)包加入的JSPatch


9150e4e5ly1fih9xiprzzj203003c3yb.jpg

JSPatch官網(wǎng):http://www.jspatch.com

1.注冊(cè)JSPatch賬號(hào),創(chuàng)建應(yīng)用,獲取AppKey和私鑰

屏幕快照 2019-03-26 下午2.00.06.png


2.生成 RSA 密鑰

在 Mac 終端上執(zhí)行 openssl,再執(zhí)行以下三句命令,生成 PKCS8 格式的 RSA 公私鑰,執(zhí)行過程中提示輸入密碼,密碼為空(直接回車)就行。

openssl >
genrsa -out rsa_private_key.pem 1024
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

這樣在執(zhí)行的目錄下就有了 rsa_private_key.pem 和 rsa_public_key.pem 這兩個(gè)文件。這里生成了長度為 1024 的私鑰,長度可選 1024 / 2048 / 3072 / 4096 ...。

3.生成公鑰

可以通過 RSA配置自動(dòng)生成 工具生成配置代碼,打開 rsa_public_key.pem,復(fù)制內(nèi)容到框里點(diǎn)擊 生成配置代碼 就可以了

4.工程配置代碼,OC代碼通過橋接文件在Swift中調(diào)用

把SDK下載下來,拖入工程,或者cocoapods集成

 pod 'JSPatchPlatformx' 
 pod 'JSPatch'
    /** JSPatch appKey */
    static NSString *const kJSPatchKey = @"jsPatch官網(wǎng)申請(qǐng)的AppKey";
    static NSString *const kJSPatchPublicKey = @"-----BEGIN PUBLIC KEY-----\n 生成的公鑰 \n-----END PUBLIC"

    [JSPatch startWithAppKey:kJSPatchKey];
    [JSPatch setupRSAPublicKey:kJSPatchPublicKey];
    [JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error {
        NSLog(data,error);   
    }];
    [JSPatch showLog];
#ifdef DEBUG
    [JSPatch setupDevelopment];
#endif
    [JSPatch sync];
    [JSPatch testScriptInBundle];   /// 測(cè)試本地js補(bǔ)丁方法 如果打開此方法-以上方法需要全部屏蔽

Swift中使用注意事項(xiàng):

  • 所有自定義的屬性和方法前面要加 @objc dynamic關(guān)鍵字,使其擁有runtime屬性,才可以動(dòng)態(tài)去修改,可以參考作者此文 [https://www.cnblogs.com/canghaixiaoyuer/p/5367760.html]

  • 并且一定要繼承NSObject的類才支持修改,例如繼承Array就不支持修改

  • 補(bǔ)丁的版本號(hào)一定要和工程版本號(hào)同步

  • 注意在 JSPatch 平臺(tái)的規(guī)范里,JS腳本的文件名必須是 main.js

  • 使用 defineClass() 覆蓋 Swift 類時(shí),類名應(yīng)為 項(xiàng)目名.原類名,例如項(xiàng)目 demo 里用 Swift 定義了 ViewController 類,在 JS 覆蓋這個(gè)類方法時(shí)要這樣寫:
    defineClass('demo.ViewController', {})

  • 對(duì)于調(diào)用已在 swift 定義好的類,也是一樣:
    require('demo.ViewController')

5.配置補(bǔ)丁JS文件

如下:

defineClass('JSPatchSwift.KXCrashTableVC', {
   viewDidLoad: function() {
       console.log('js viewDidLoad begin')
       self.ORIGviewDidLoad()
       console.log('js viewDidLoad end')
   },

   testLog: function() {
        console.log('js ViewController testlog')
    },

   tableView_cellForRowAtIndexPath: function(tableView, indexPath) {
       console.log('tableView_cellForRowAtIndexPath testlog')
       var cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier")
       cell.textLabel().setText(self.dataArray().toJS()[indexPath.row()])
       return cell
   }          
})
  • 通過[JSPatch testScriptInBundle]; 方法測(cè)試沒有問題,補(bǔ)丁上傳到JSPatch官網(wǎng)后臺(tái)即可
  • 補(bǔ)丁只能留存一個(gè)版本,不能疊加,當(dāng)下一個(gè)版本發(fā)布時(shí)盡快用原生代碼替換

07A45015874163A4E8567AB97B623A0C.gif

最后附上代碼地址:https://github.com/KXZHANGL/KXJSPatchSwift

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容