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 } })