首页 > 代码库 > 热修复

热修复

热修复也是在线修复。由于苹果的审核周期相对较长,遇到重大bug怎么办呢?这时候热修复就显得特别重要。  我也是最近了解到热修复,参考相关资料,来和大家分享一下我所了解到的热修复。

   

   JSPatch,也是今天的主角,这个方案小巧易懂,一个IOS开发者很容易就能上手,它巧妙的运用了runtime的消息转发机制来实现了在线修复,关于消息转发大家可以看看runtime相关的资料,不过值得注意的是JSPatch只能支持ios7以上。想更多了解原理和代码的可以阅读下面的文献:

   

  • ·JSPatch实现原理详解 http://blog.cnbang.net/tech/2808/
  • ·JSPatch Git源码和使用说明 https://github.com/bang590/JSPatch

  下面我们直接看看如何使用JSPatch:

  参考的是cocochina社区的一篇文章(http://www.cocoachina.com/ios/20150708/12468.html),因为相比其他大篇幅说JSPatch,这篇文章更简洁。

1

2

3

4

5

6

7

8

9

10

@implementation JPTableViewContro

ller

...

- (void)tableView:(UITableView *)

tableView didSelectRowAtIndex

Path:(NSIndexPath *)indexPath

{

  NSString *content = self.dataSource[[indexPath row]];  

//可能会超出数组范围导致crash

  JPViewController *ctrl = 

[[JPViewController alloc] initWith

Content:content];

  [self.navigationController 

pushViewController:ctrl];

}

...

@end

上述代码中取数组元素处可能会超出数组范围导致crash。

第一步:导入JSPatch的相关文件

第二步:

#import “JPEngine.m"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application 

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    [JPEngine startEngine];

    [NSURLConnection sendAsynchronous

Request:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://cnbang.net/bugfix.JS"]] queue:[NSOperationQueue mainQueue] completion

Handler:^(NSURLResponse *response, 

NSData *data, NSError *connectionError) {

    NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    if (script) {

      [JPEngine evaluateScript:script];

    }

}];

   ….

    return YES;

}

@end

 

第三步:按照Demo的JS格式,把你需要一启动需要

更换的方法写成文件上传到管理平台

//JS

defineClass("JPTableViewController", 

{

  //instance method definitions

  tableView_didSelectRowAtIndexPath: 

function(tableView, indexPath) {

    var row = indexPath.row()

    if (self.dataSource().length > row)

 {  //加上判断越界的逻辑

      var content = self.dataArr()[row];

      var ctrl = JPViewController.

alloc().initWithContent(content);

      self.navigationController().

pushViewController(ctrl);

    }

  }

}, {})

这样 JPTableViewController 里的 -tableView:didSelectRowAtIndexPath: 就替换成了这个JS脚本里的实现

 

 

热修复