iOS热更新方案

iOS的APP上线到苹果市场需要经过苹果审核,而苹果审核周期往往有时候会很长,这有可能会影响到APP的正常使用;如何才能尽可能少的发布版本,在发现旧版本有bug时,不更新APP也能够修复 bug呢,于是我找到了JSPatch,也许也有很多人觉得这是个很高大上的技术,其实不然,我们只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。当然呢,目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。

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 = [[UITableViewalloc]initWithFrame:self.view.boundsstyle:UITableViewStylePlain];self.mqTableView= tv;self.mqTableView.delegate=self;self.mqTableView.dataSource=self;    [self.viewaddSubview:self.mqTableView];}#pragma mark -- UITableViewDataSource- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{return3;}- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{staticNSString* i=@"cell";UITableViewCell* cell = [tableView  dequeueReusableCellWithIdentifier:i];if(cell ==nil) {        cell =[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:i];    }    cell.textLabel.text=@"meiqing";    cell.backgroundColor= [UIColorwhiteColor];returncell;}- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{self.dataSource= @[@"1",@"2"];// 肯定会超出数组范围导致 crashNSString*content =self.dataSource[indexPath.row];}

显示效果:


iOS热更新方案_第1张图片

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


iOS热更新方案_第2张图片

同时,我们在APPDelegate里调用这个JS就可以了,如下:


iOS热更新方案_第3张图片

再次运行就不会出现闪退了。

整个流程下来其实挺简单的,希望大家能够接受,如果喜欢我的文章,可以关注我后续的文章。

你可能感兴趣的:(iOS热更新方案)