JSPatch 是一個 iOS 動態更新框架,只需在項目中引入極小的引擎,就可使用 JavaScript 調用任何 Objective-C/Swift 原生接口。 得到腳本語言的優點,爲項目動態添加模塊,或替換項目原生代碼動態修復 bug,聽起來是否是很秀,可是過不了審覈!
html
過不過審覈沒關係,重在探索嘛,其實我是在企業包加入的JSPatch
git
JSPatch官網:http://www.jspatch.com
github
1.註冊JSPatch帳號,建立應用,獲取AppKey和私鑰
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]測試
對於調用已在 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 } })