JSPatch 是一个开源项目(Github链接),只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。
集成 SDK
1、通过 cocoapods 导入
在 podfile 中添加命令:
pod 'JSPatchPlatform', :git => 'https://github.com/bang590/JSPatchPlatform.git'
再执行 pod install 即可。
2、手动导入
下载 SDK 后解压,将** JSPatchPlatform.framework** 拖入项目中,勾选 "Copy items if needed",并确保 "Add to targets" 勾选了相应的 target。
pods 导入或手动导入SDK后添加依赖框架:TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加libz.dylib(Xcode7之后是libz.tbd)和 JavaScriptCore.framework。
测试使用
1、测试本地脚本
本地测试 AppDelegate.m 按如下写法即可,SDK 提供了+testScriptInBundle
方法用于开发状态下测试。
然后在我们的 demo 中新建一个 empty 文件,叫 main.js,注意这是 JSPatch 平台规范,js 脚本文件名必须是 main.js。
现在我们就可以通过在 main.js 写 js 修复 demo 中的 bug,代码如下:
defineClass('ViewController', {
createJsPatchDemo: function() {
console.log("全市污水处理厂在线监控系统9项指标运营维护项目");
},
});
2、线上版本测试
热修复针对的是线上版本,所以本地测试只是验证可行性,重要的还是线上 bug 的修复。下面我们进行线上测试。
到 JSPatch官网 注册,登录,我的 App,添加 App,获取 app key,添加 App 版本,发布补丁.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/** */
[JSPatch startWithAppKey:@"1b823abb1c059409"];
[JSPatch setupRSAPublicKey:@"-----BEGIN PUBLIC KEY-----\nMIG0GKBgQDo9OLb7RYBCsST0Nq7EPRmfcAt\nZ4W6dhPE3Lrew+0JfiUCiTt2ruhPXQLSJN2OcGKVV4eXXR1KxI6BC3yBZvoXF\n/tQ/rIsMgknHMYGnh817tYAq/SSLu6BhfygK40\n6Ixyha1mbfQJwIDAQAB\n-----END PUBLIC KEY-----"];
// [JSPatch setupDevelopment];
[JSPatch sync];//检查补丁更新
/*
用于发布前测试脚本。先把脚本放入项目中,调用后,会在当前项目的 bundle 里寻找 main.js 文件执行
测试完成后请删除,改为调用 +startWithAppKey: 和 +sync
[JSPatch testScriptInBundle];*/
self.window =[[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor=[UIColor whiteColor];
[self.window makeKeyAndVisible];
ViewController *vCont=[[ViewController alloc]init];
UINavigationController *nav =[[UINavigationController alloc]initWithRootViewController:vCont];
self.window.rootViewController = nav;
return YES;
}
注意:+testScriptInBundle
不能与+startWithAppKey:
一起调用,+testScriptInBundle
只用于本地测试,测试完毕后需要去除,项目中的 main.js 文件也要删除(可拷贝一份至桌面留作上传的补丁使用)。另外,通过 JSPatch 平台上传的脚本文件都会保存在七牛云存储上,而七牛云存储的下载使用的是 http 协议,因此需要在项目的 info.plist 文件中添加如下字段.
通过测试如果项目中其他没有网络请求,最新的“补丁”不会被及时下载更新。
有OC转换工具:转换JS: 转换JS
平台原理详解:如何使用补丁语言:补丁语言