对于苹果的app来说,虽然在提交审核上线前会经过严格的测试,但是还是要保证有重大bug的情况下能够及时进行热修复,把损失降到最低。
JSPatch gitHub链接地址,里面有详细使用说明。
在主控制器中添加一个按钮,实现点击方法:
- (IBAction)crashAction:(id)sender {
NSArray *array = @[@1,@2];
NSNumber *number = [array objectAtIndex:4];
NSLog(@"%@",number);
}
很明显,点击就一定会闪退,这个就是模拟app中可能 出现的各种严重问题。我们要做的就是通过JSPatch框架,及时修复线上严重bug。
导入头文件
#import
在app启动时调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//测试热修复
[self testJSPatchHotFix];
return YES;
}
- (void)testJSPatchHotFix
{
//启动引擎
[JPEngine startEngine];
//弹框测试
[JPEngine evaluateScript:@"\
var alertView = require('UIAlertView').alloc().init();\
alertView.setTitle('Alert');\
alertView.setMessage('AlertView from js'); \
alertView.addButtonWithTitle('OK');\
alertView.show(); \
"];
//重写闪退的方法
[JPEngine evaluateScript:@"defineClass('ViewController',{\
crashAction: function(crashButton){\
var redColor = require('UIColor').redColor();\
crashButton.setBackgroundColor(redColor);\
}\
},{})"];
}
重新运行app,会发现可以弹出新增的alert框,并且点击button闪退现象消失,完美解决了问题。当然对于线上bug一般需要后端给.js文件下载地址,这里只是为了测试写了本地的js文件。
实际应用中可以这样从后台拿.js文件
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://cnbang.net/test.js"]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[JPEngine evaluateScript:script];
}];
Demo在这里