JSPatch简介
JSPatch 是一个开源项目(Github链接),只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。
JSPatch简单的使用
第一步:到JSPatch官方平台注册账号,创建应用,并获取appkey;
第二步:集成JSPatch到项目中,这里主要介绍使用cocoapods的方式集成,如果想使用手动导入SDK的方式,请参考文档JSPatch文档,使用cocoapods的方式导入JSPatch具体操作如下:
在podfile中添加如下代码:
pod 'JSPatchPlatform'
再执行pod install即可
第三步:如果app没有上线,可以采用线下测试的方式测试是否能够实时修复,具体操作如下:
在AppDelegate中导入头文件#import <JSPatchPlatform/JSPatch.h>
在application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中添加如下代码:
[JSPatch testScriptInBundle];
这里介绍的是实时修改按钮上面的字体和点击按钮后按钮背景颜色的变化,本来按钮的字体是hello_jspatch,点击按钮后的背景颜色为红色,修改后按钮上面的字体为成功修改,点击的背景颜色变为橘色。
在ViewController中的代码如下:
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self loadButton];
}
- (void)loadButton {
UIButton *tipBtn = [[UIButton alloc] initWithFrame:CGRectMake(10, 50, 200, 30)];
[tipBtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[tipBtn setTitle:@"hello_jspatch" forState:UIControlStateNormal];
[tipBtn addTarget:self action:@selector(clickedBtn:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:tipBtn];
}
- (void)clickedBtn:(UIButton *)sender {
sender.backgroundColor = [UIColor redColor];
}
新建一个后缀名为.js的文件,文件中的代码为js代码,具体代码如下:
require('UIButton,UIColor');
defineClass('ViewController', {
loadButton: function() {
var tipBtn = UIButton.alloc().initWithFrame({x:10, y:50, width:200, height:30});
tipBtn.setTitleColor_forState(UIColor.redColor(), 0);
tipBtn.setTitle_forState("成功修改", 0);
tipBtn.addTarget_action_forControlEvents(self, "clickedBtn:", 1<<6);
self.view().addSubview(tipBtn);
},
clickedBtn: function(sender) {
sender.setBackgroundColor(UIColor.orangeColor());
}
});
将该文件导入工程,运行程序,就可以看到按钮的字体变为成功修改,点击按钮后的颜色变为橘色了。
如果app已经上线,那么将AppDelegate中application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
的代码改为如下:
//这里的APP_KEY是在JSPatch平台上创建应用后自动生成的
[JSPatch startWithAppKey:APP_KEY];
[JSPatch sync];
然后将编写好的.js文件上传到JSPatch,具体如下图:
最后运行工程,就能达到预期的效果了。