JSPatch 热更新

4 篇文章 0 订阅

JSPatch 是一个 iOS 动态更新框架,只需在项目中引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C/Swift 原生接口。 获得脚本语言的优势,为项目动态添加模块,或替换项目原生代码动态修复 bug,听起来是不是很秀,但是过不了审核!
856EDF5ABFBAFD672CB1809018527804.jpg
过不过审核不要紧,重在探索嘛,其实我是在企业包加入的JSPatch
9150e4e5ly1fih9xiprzzj203003c3yb.jpg

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

1.注册JSPatch账号,创建应用,获取AppKey和私钥

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

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官网后台即可
  • 补丁只能留存一个版本,不能叠加,当下一个版本发布时尽快用原生代码替换

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值