javascript
JSPatch 热更新
JSPatch 是一個 iOS 動態更新框架,只需在項目中引入極小的引擎,就可以使用 JavaScript 調用任何 Objective-C/Swift 原生接口。 獲得腳本語言的優勢,為項目動態添加模塊,或替換項目原生代碼動態修復 bug,聽起來是不是很秀,但是過不了審核!
過不過審核不要緊,重在探索嘛,其實我是在企業包加入的JSPatch
JSPatch官網:http://www.jspatch.com
1.注冊JSPatch賬號,創建應用,獲取AppKey和私鑰
2.生成 RSA 密鑰
在 Mac 終端上執行 openssl,再執行以下三句命令,生成 PKCS8 格式的 RSA 公私鑰,執行過程中提示輸入密碼,密碼為空(直接回車)就行。
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 …。
3.生成公鑰
可以通過 RSA配置自動生成 工具生成配置代碼,打開 rsa_public_key.pem,復制內容到框里點擊 生成配置代碼 就可以了
4.工程配置代碼,OC代碼通過橋接文件在Swift中調用
把SDK下載下來,拖入工程,或者cocoapods集成
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’)
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官網后臺即可
- 補丁只能留存一個版本,不能疊加,當下一個版本發布時盡快用原生代碼替換
最后附上代碼地址:https://github.com/KXZHANGL/KXJSPatchSwift
總結
以上是生活随笔為你收集整理的JSPatch 热更新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【BMI指数计算器V4.0】项目实战
- 下一篇: 开环直流电机的机械特性_第二十三讲 20