为了账号安全,请及时绑定邮箱和手机立即绑定

iOS之JSPatch实时修复BUG

标签:
JavaScript iOS

背景

在iOS开发中,存在bug修复周期长的问题。若程序出了bug,往往需要走一下步骤:
修改代码--打包--提交审核(--审核被拒--修改代码--再次提交审核)--用户更新。
需要很长一个周期才能解决问题。而JSPatch的出现,有效的解决了这一尴尬的局面。

热修复

一种即时修复bug的技术,也叫hotfix。

什么是JSPatch?

JSPatch是一个一个动态更新的开源的框架,可以实时的修复bug(热修复)、添加新功能。从服务器下发补丁js补丁代码,客户端接收到补丁后,进行安全校验,然后用JS调用或替换原来crash的OC方法,从而达到实时修复bug的目的,过程如下图:

示例

假如,在LeftViewControlertableView:didSelectRowAtIndexPath:方法中存在一个数组越界的crash:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    //---------------crash----------------
    NSArray *array=@[@"1",@"2",@"3"];
    for(int i=0;i<4;i++){
        NSLog(@"%@",array[i]); //程序中出现的crash(数组越界)
    }
    //---------------crash---------------
}

我们可以在服务端用js下发一段这样的代码,达到实时修复bug的目的:

defineClass('LeftViewController', {
    tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {

        var array = ["1", "2", "3"];
        for (var i = 0; i < array.count(); i++) {
            NSLog("%", array[i]); 
        }
    },
});

我们可以在项目中引入JSPatch,然后在在自己搭建下发补丁的服务器,也可以直接用JSPatch平台集成的带代码下发功能的SDK,我们只需要写好补丁,直接就可以在这个平台下发了。

步骤如下:

  • 第一步:在JSPatch平台注册一个帐号;
  • 第二步:创建一个app;
  • 第三步:下载JSPatch SDK,这个跟github上的不一样,github上的是开源的,不带代码下发服务器的。
  • 第四步:生成RSA公钥和私钥。
    打开终端,cd到Desktop/,输入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
    在桌面时就会得到2个.pem文件,分别时公钥和私钥。私钥用于服务端甲米下发的补丁,公钥用于客服端解密补丁。
  • 第五步:按照文档集成SDK到文档中。
    application:didFinishLaunchingWithOptions:方法中对JSPatch初始化
    //初始化JSPatch -(void)setupJSPatch{          [JSPatch startWithAppKey:kJSPatchKey];     [JSPatch setupRSAPublicKey:kRSAPublicKey];     [JSPatch setupLogger:^(NSString *msg) {         NSLog(@"%@",msg);     }];     //[JSPatch testScriptInBundle];//沙盒测试     [JSPatch sync]; }
    其中,appkey是平台上创建app得到的appkey,而pullic key则是上步生成的RSA公钥,注意要手动加换行(\n)。如:
    @"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1heHjbL+R6nulhIRptjfGmd3M\nlU...\n-----END PUBLIC KEY-----"。

  • 下发补丁时,服务端会计算补丁文件(js)文件的MD5值,然后讲这个MD5值用RSA私钥签名,签名后的字符串跟补丁一起下发到客户端。
  • 客户端拿到签名后的字符串后,用公钥进行解密,得到一个MD5值,计算得到脚本的MD5值,比较这两个MD5值,若一支,说明补丁没被篡改。若无篡改,则在运行时通过方法交换,替换掉我们的crash代码。

  • 第六步:我们用在桌面上新建一个main.js文件,打开命令后,cd到桌面,输入touch main.js后回车,在桌面就会生成一个main.js文件,用文本编辑器打开。
    写入我们自己的方法替换掉crash部分的代码的所在的方法。
defineClass('LeftViewController', {

    tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {

        var array = ["1", "2", "3"];
        for (var i = 0; i < array.count(); i++) {
            NSLog("%", array[i]);
        }
    },
});

你可以用JSPatchConverter直接将写好的OC转成Patch,大部分可以直接转,但私有变量/静态变量/宏这些还不支持,所以转换后需要<b>手动修改</b>。可以借助这个工具,省去原本要先写好OC代码,在翻译成Patch的时间成本。

  • 第七步:测试补丁的有效性
    在下发补丁之前,我们可以验证补丁是否凑效,具体做法是:
    将我们刚刚编辑的main.js导入项目根目录,选择copy。在JSPatch初始化的方法中,打开沙盒测试方法[JSPatch testScriptInBundle];,并注释掉其他JSPathch方法。运行程序,该测试方法会自动在沙盒下寻找main.js文件并执行,以验证bug是否被修复。

  • 第八步:下发补丁
    在上一步补丁有效性验证成功之后,去JSPatch平台下发补丁。
    补丁选择刚刚的main.js,私钥选择刚刚生成的私钥private_key.pem文件,提交。</pre>
    注意:App版本号要跟Bundle versions string, short版本号一致!

  • 第九步:运行app,再次在LeftViewController的选择cell,之前选择cell导致crash得到了修复!
    至此,我们已经在不用重新提交版本的情况下,完成了bug的实时修复。
点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消