IOS热修复之 JSPatch 实现方案



1简介

1.1目的

新版本上线后发现有个严重的bug,可能会导致crash率激增,可能会使网络请求无法发出,这时能做的只是赶紧修复bug然后提交等待漫长的appStore审核,再盼望用户快点升级,付出巨大的人力和时间成本,才能完成此次bug的修复。使用JSPatch可以解决这样的问题,只需在项目中引入JSPathc,就可以在发现bug时下发JS脚本补丁,替换原生方法,无需更新APP即时修复bug

1.2实现原理

JSPatchios内置的JavaScriptCore.framework作为JS引擎, 从JS传递要调用的类名函数名到Object-C,替换,增加类,类成员函数,运行JS代码。


2实施流程

2.1流程简要说明  

当客户端出现bug时,ios开发人员开发js脚本用于修复bug,脚本开发完成后,服务端人员根据ios开发人员提供的js脚本部进行一定的安全策略部署服务端脚本,ios客户端通过脚本版本检测接口,判断是否需要下载js脚本,下载脚本成功后,进行加载,运行,进而修复app bug

2.2流程图

3安全策略

3.1存在的安全隐患

   SPatch的安全隐患主要在js脚本的传输过程中,js脚本可以调用任意object c方法,权限非常大,若被中间人攻击替换代码,会迁成较大的危害,网络安全有好多种,我们这里主要采用的RSA校验的方法来确保js脚本的传输安全。

3.2RSA使用流程

 RSA校验属于数字签名,用了跟 HTTPS 一样的非对称加密,只是简化了,把非对称加密只用于校验文件,而不解决传输过程中数据内容泄露的问题,而我们的目的只是防止传输过程中数据被篡改,对于数据内容泄露并不是太在意。整个校验过程如下:

 

1)服务端计算出脚本文件的 MD5值,作为这个文件的数字签名。

2)服务端通过私钥加密第 1步算出的 MD5值,得到一个加密后的 MD5值。

3)把脚本文件和加密后的 MD5值一起下发给客户端。

4)客户端拿到加密后的 MD5值,通过保存在客户端的公钥解密。

5)客户端计算脚本文件的 MD5值。

对比第 4/5步的两个 MD5值(分别是客户端和服务端计算出来的 MD5值),若相等则通过校验。

 

4服务端功能实现

4.1制作RSA密钥对

服务端通过OpenSSL生成RSA公私密钥,私密用于服务端对js脚本的md5值进行加签,公钥,用于客户端的RSA的校检。

 

4.2js脚本处理

首先对js脚本进行md5加密,然后利用4.1中生成的私密对md5值进行加签。

4.3提供版本检测接口

   提供版本检测接口,传入当前app版本号和js脚本版本号。服务端根据这个两参数判断当前客户端的js脚本是不是最新的,如不是则需要返回当前js版本号和js下载地址。

  输入参数:1.当前app版本号.

            2.js脚本版本号

  返回json结构:

   {

       resultCode = 0;

       appVerion = "";

              jsonVersion ="";

       jsUrl = "";

   };

 

4.4提供js脚本和效检码下载功能

服务端 需要提供js脚本下载功能,同时返回4.2中产生的效验码,这个效验码可以在版本检测接口中返回也可以放在一个文件中和js脚本打包一起作为下载文件。

4.5提供js脚本管理功能

由于app,不同的版本下有可有不同版本的角本,服务端需要对js脚本进行版本管理。具体怎么实现管理功能,由服务端实现。

 

5Ios端功能实现

5.1部署JSPatch环境

1.https://github.com/bang590/JSPatch下载JSPatch插件导入自己的项目中,或通过CocoaPod引入JSpatch插件。

2.工程中引入系统框架JavaScriptCore.framework

3.工程中引入服务端生成的RSA校验所需的公钥

5.2判断是否需要从服务端加载js脚本

客户端通过服务端提供的js脚本版本接口,把app的版本号和js脚本的版本号传给服务器,服务器根据这两个信息判断是否需要下载js脚,并返回给客户端需要下的的版本号(下载版本号和js代码失败不会影响程序的正常运行)js下载地址。

5.3下载、校验、保存js脚本

   客户端通过从4.2中获取的url下载js脚本和RSA校验码。下载完成后对js脚本进行md5加密,得到的md5值对RSA校验码进行校验。校验成功,保存js脚本,js脚本的版本号。

5.4运行JS脚本,修复app bug

appDelegate中引入JPEngine.h文件 ,在didFinishLaunchingWithOptions函中执行

[JPEngine startEngine]启动JSPatch,接着把从服务器中下载的js文件内容读到字符串scriptk中,通[JPEngine evaluateScript:script];运行脚本文件,修复appbug

 

 

6系统时序图


参考文档

http://blog.csdn.net/lmyuanhang/article/details/50818057



 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值