JSPatch实现热修复

对于苹果的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在这里

你可能感兴趣的:(JSPatch实现热修复)