JSPatch 熱更新

JSPatch 是一個 iOS 動態更新框架,只需在項目中引入極小的引擎,就可使用 JavaScript 調用任何 Objective-C/Swift 原生接口。 得到腳本語言的優點,爲項目動態添加模塊,或替換項目原生代碼動態修復 bug,聽起來是否是很秀,可是過不了審覈!

html

856EDF5ABFBAFD672CB1809018527804.jpg


過不過審覈沒關係,重在探索嘛,其實我是在企業包加入的JSPatch


9150e4e5ly1fih9xiprzzj203003c3yb.jpggit



JSPatch官網:http://www.jspatch.com

github

1.註冊JSPatch帳號,建立應用,獲取AppKey和私鑰

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

2.生成 RSA 密鑰

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

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

這樣在執行的目錄下就有了 rsa_private_key.pem 和 rsa_public_key.pem 這兩個文件。這裏生成了長度爲 1024 的私鑰,長度可選 1024 / 2048 / 3072 / 4096 ...。

app

3.生成公鑰

能夠經過 RSA配置自動生成 工具生成配置代碼,打開 rsa_public_key.pem,複製內容到框裏點擊 生成配置代碼 就能夠了

框架

4.工程配置代碼,OC代碼經過橋接文件在Swift中調用

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

pod 'JSPatchPlatformx' 
 pod 'JSPatch'
/** JSPatch appKey */
    static NSString *const kJSPatchKey = @"jsPatch官網申請的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];   /// 測試本地js補丁方法 若是打開此方法-以上方法須要所有屏蔽

Swift中使用注意事項:工具

  • 全部自定義的屬性和方法前面要加 @objc dynamic關鍵字,使其擁有runtime屬性,才能夠動態去修改,能夠參考做者此文 [https://www.cnblogs.com/canghaixiaoyuer/p/5367760.html]測試

  • 而且必定要繼承NSObject的類才支持修改,例如繼承Array就不支持修改
  • 補丁的版本號必定要和工程版本號同步
  • 注意在 JSPatch 平臺的規範裏,JS腳本的文件名必須是 main.js
  • 使用 defineClass() 覆蓋 Swift 類時,類名應爲 項目名.原類名,例如項目 demo 裏用 Swift 定義了 ViewController 類,在 JS 覆蓋這個類方法時要這樣寫:
    defineClass('demo.ViewController', {})
  • 對於調用已在 swift 定義好的類,也是同樣:
    require('demo.ViewController')

    ui

5.配置補丁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]; 方法測試沒有問題,補丁上傳到JSPatch官網後臺便可
  • 補丁只能留存一個版本,不能疊加,當下一個版本發佈時儘快用原生代碼替換

07A45015874163A4E8567AB97B623A0C.gif
最後附上代碼地址:https://github.com/KXZHANGL/KXJSPatchSwift

相關文章
相關標籤/搜索