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