iOS通过 JSPatch实现 app的热更新
2016-02-18 11:22
573 查看
也许也有很多人觉得这是个很高大上的技术,其实不然,我们只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。当然呢,目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。
JSPatch的代码大家可以去github 上面下载,具体的安装与配置方法,你可以去JSPatch的官网进行学习,网址 : http://jspatch.com
首先说一下JsPatch实现的内部原理:JsPatch能做到通过JS调用和改写OC方法最根本的原因是 Objective-C 是动态语言,OC上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名和方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,还可以新注册一个类,为类添加方法。这里就不详细介绍runtime了,相关的资料我会在后续的博客里介绍,大家再等等吧。所以 JSPatch 的原理就是:JS传递字符串给OC,OC通过 Runtime 接口调用和替换OC方法。这个很容易理解,JS的作用只是一个信使的作用,具体实现还是得靠我们OC,所以说OC还是世界上最美的语言,哈哈。
同时在这里给大家一个比较好的网站 http://bang590.github.io/JSPatchConvertor/ .这是一个OC转JS的一个工具网站
下面给大家演示一下具体实现的步骤
显示的结果是这样的
上面的图片是没有修改时候的显示,当我点击第三行一定会闪退,怎么修复呢?这个时候就不用发版本了,服务器可以给我们传送一个js文件,文件里的内容是这样的
同时,我们在APPDelegate里调用这个JS就可以了,如下:
再次运行就不会出现闪退了。
整个流程下来其实挺简单的,希望大家能够接受,如果喜欢我的文章,可以关注我后续的文章。
附带github demo
JSPatch的代码大家可以去github 上面下载,具体的安装与配置方法,你可以去JSPatch的官网进行学习,网址 : http://jspatch.com
首先说一下JsPatch实现的内部原理:JsPatch能做到通过JS调用和改写OC方法最根本的原因是 Objective-C 是动态语言,OC上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名和方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,还可以新注册一个类,为类添加方法。这里就不详细介绍runtime了,相关的资料我会在后续的博客里介绍,大家再等等吧。所以 JSPatch 的原理就是:JS传递字符串给OC,OC通过 Runtime 接口调用和替换OC方法。这个很容易理解,JS的作用只是一个信使的作用,具体实现还是得靠我们OC,所以说OC还是世界上最美的语言,哈哈。
同时在这里给大家一个比较好的网站 http://bang590.github.io/JSPatchConvertor/ .这是一个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]; }
显示的结果是这样的
上面的图片是没有修改时候的显示,当我点击第三行一定会闪退,怎么修复呢?这个时候就不用发版本了,服务器可以给我们传送一个js文件,文件里的内容是这样的
同时,我们在APPDelegate里调用这个JS就可以了,如下:
再次运行就不会出现闪退了。
整个流程下来其实挺简单的,希望大家能够接受,如果喜欢我的文章,可以关注我后续的文章。
附带github demo
相关文章推荐
- iOS 实现应用之间的跳转
- iOS 52个技巧学习心得笔记 第一章 熟悉OC
- iOS环信3.0集成 (三)单聊集成
- 常用iOS第三方库以及XCode插件介绍
- iOS之OSX EI Capitan打包二进制文件提交审核失败
- iOS从plist文件里面读取内容
- iOS-代码提示如NS_AVAILABLE_IOS(4_2)的解释
- Metal-IOS-通用GPU计算:Data-Parallel Compute Processing: Compute Command Encoder
- iOS中本地化字符串
- Mac环境下svn的使用
- 分享 iOS
- 学习IOS之oc第一步基础必备
- ios 判断字符串是否包含指定字符串
- iOS ARC的使用注意事项
- 转 iOS宏定义的使用与规范
- iOS开发证书显示“此证书的签发者无效”的问题解决
- Missing iOS Distribution signing identity问题解决
- IOS开发之记录用户登陆状态
- IOS KVC(键值编码)模式
- 在iOS系统上设计用户登录(原创技巧)