最近JSPatch挺火的,于是抽时间学习一下留着备用
在网上查询了不少关于JSPatch的文章,总结下来有两种不同的用法
方法一:
1、拷贝 JSPatch/目录下的三个文件 JSEngine.m/ JSEngine.h/ JSPatch.js到项目里即可。demo下载地址:https://github.com/a130785/JSPatchDemo
2、在AppDelegate里的代码如下:(需要事先写好js脚本)
#import “JPEngine.m"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[JPEngine startEngine];
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://test.net/bugfix.JS"]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (script) {
[JPEngine evaluateScript:script];
}
}];
return YES;
}
@end
这样的话有个麻烦的问题,就是需要每个app自己搭建一个服务器,用于js脚本文件的管理。幸好, JSPatch 平台已经帮我们做了这个!
方法二:
什么是 JSPatch 平台?
JSPatch 需要使用者有一个后台可以下发和管理脚本,并且需要处理传输安全等部署工作,JSPatch 平台帮你做了这些事,提供了脚本后台托管,版本管理,保证传输安全等功能,让你无需搭建一个后台,无需关心部署操作,只需引入一个 SDK 即可立即使用 JSPatch。
不过,JSPatch是收费的,收费标准如下:
具体步骤:
1、去JSPatch官网 http://www.jspatch.com 注册appkey
2、下载SDK,下载后将.framework文件拖到项目中,在link binary中导入两个库libz和JavaScriptCore两个框架:
3、添加依赖库
4、在appdelegate中加入以下代码:
#import <JSPatch/JSPatch.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JSPatch startWithAppKey:@"你的AppKey"];
[JSPatch sync];
}
@end
5、使用xcode新建一个main.js的空文件,至于为什么叫main.js,这个我们就不要深究了,这是别人要求的规范写法
为了方便代码自动补全,建议添加JSPatchX插件:https://github.com/bang590/JSPatchX
6、下面做个测试,修改某个页面的title标题和背景颜色。首先打开 testScriptInBundle,这个用户本地测试,同时注释掉startwithappkey。
7、下面开始在main.js里面写入js代码,对于简单的修改可以直接通过http://bang590.github.io/JSPatchConvertor/ 将OC代码转换成JS代码,但是,这个转换不是万能的,稍微复杂的就会出错,所以要谨慎使用!!!
具体使用方法请参考:https://github.com/bang590/JSPatch/wiki/JSPatch-基础用法
转换后的效果:
JSPatch的安全策略
JSPatch脚本的执行权限很高,若在传输过程中被中间人篡改,会带来很大的安全问题,为了防止这种情况出现,需要在传输过程中对JS文件进行了RSA签名加密,流程如下:
服务端:
计算 JS 文件 MD5 值。
用 RSA 私钥对 MD5 值进行加密,与JS文件一起下发给客户端。
客户端:
拿到加密数据,用 RSA 公钥解密出 MD5 值。
本地计算返回的 JS 文件 MD5 值。
对比上述的两个 MD5 值,若相等则校验通过,取 JS 文件保存到本地。
由于 RSA 是非对称加密,在没有私钥的情况下第三方无法加密对应的 MD5 值,也就无法伪造 JS 文件,杜绝了 JS 文件在传输过程被篡改的可能。
1、关于加密传输的详细介绍请看JSPatch作者bang的博客
http://blog.cnbang.net/tech/2879/
2、加密使用的是非对称RSA 校验的方式,会涉及到公钥和私钥,可参考下面的博客
http://www.cnblogs.com/hxwj/p/5163635.html
3、具体的加密步骤可参看下面的博客内容
http://www.cnblogs.com/hxwj/archive/2016/01/28/5165436.html