如何实现iOS热更新

如何实现iOS热更新

字数803 阅读7169 评论19 喜欢42git

最近被苹果审核整怕了,每次提交版本都得等待一周到两周的审核时间,我是受不了这种速度了,因而决定研究有没有其余的方法跳过提交版本这个步骤,一样可以修复bug呢,因而我找到了JSPatch,也许也有不少人以为这是个很高大上的技术,其实否则,咱们只须要在项目里引入极小的引擎文件,就可使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。固然呢,目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。github

JSPatch的代码你们能够去github 上面下载数组

首先说一下JsPatch实现的内部原理:JsPatch能作到经过JS调用和改写OC方法最根本的缘由是 Objective-C 是动态语言,OC上全部方法的调用/类的生成都经过 Objective-C Runtime 在运行时进行,咱们能够经过类名和方法名反射获得相应的类和方法,也能够替换某个类的方法为新的实现,还能够新注册一个类,为类添加方法。这里就不详细介绍runtime了,相关的资料我会在后续的博客里介绍,你们再等等吧。因此 JSPatch 的原理就是:JS传递字符串给OC,OC经过 Runtime 接口调用和替换OC方法。这个很容易理解,JS的做用只是一个信使的做用,具体实现仍是得靠咱们OC,因此说OC仍是世界上最美的语言,哈哈。服务器

同时在这里给你们一个比较好的网站  点这里.这是一个OC转JS的一个工具网站。工具

下面给你们演示一下具体实现的步骤网站

- (void)viewDidLoad
{

    UITableView* tv = [[UITableView alloc]initWithFrame:self.view.bounds
                                                 style:UITableViewStylePlain];
    self.mqTableView = tv;
    self.mqTableView.delegate = self;
    self.mqTableView.dataSource = self;
    [self.view addSubview:self.mqTableView];

}
#pragma mark -- UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 3;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* i=  @"cell";
    UITableViewCell* cell = [tableView  dequeueReusableCellWithIdentifier:i];
    if (cell == nil ) {
        cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
                                    reuseIdentifier:i];
    }
    cell.textLabel.text = @"meiqing";
    cell.backgroundColor = [UIColor whiteColor];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.dataSource = @[@"1",@"2"];
    // 确定会超出数组范围致使 crash
    NSString *content = self.dataSource[indexPath.row];

}

显示的结果是这样的spa

屏幕快照 2015-12-10 上午12.09.15.pngcode

上面的图片是没有修改时候的显示,当我点击第三行必定会闪退,怎么修复呢?这个时候就不用发版本了,服务器能够给咱们传送一个js文件,文件里的内容是这样的接口

屏幕快照 2015-12-10 上午12.44.14.png图片

同时,咱们在APPDelegate里调用这个JS就能够了,以下:

屏幕快照 2015-12-10 上午12.45.25.png

再次运行就不会出现闪退了。 整个流程下来其实挺简单的,但愿你们可以接受,若是喜欢个人文章,能够关注我后续的文章。

相关文章
相关标签/搜索