iOS——为你的项目引入超轻量级JS引擎JSPatch
来源:互联网 发布:win10磁盘优化闪退 编辑:程序博客网 时间:2024/05/04 22:30
欢迎进入我的个人域名博客:http://zhoulingyu.com
1. JSPatch
简介
JSPatch是由国内一位年轻帅气的大牛bang编写的极小的JS引擎文件
这个开源项目(主页、Github连接),让你只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。
我了解这个项目的原因是因为项目的大神率先用了这个Mini引擎解决了我们线上BUG的燃眉之急,当我去学习这个引擎的时候,我觉得我的移动编码观被震撼了,这绝对是有重大意义的项目,所以推荐给所有还不了解人
JSPatch解决了什么问题
JSPatch可以调用一段JS替换OC原生方法。而最关键的是JSPatch调用的JS不仅可以是本地的,还可以是网络请求来的。
试想一下,当你的项目已经上线了,用户反馈给你一堆BUG,作为一个优秀的程序员,你一定会第一时间修正BUG并且在一定修复量之后发布新的版本。但是问题是:你的用户不一定会更新新版本的app。
这里暴露了移动端的一个弊端:不能像服务器端一样实时发布,即使修复了BUG用户却可以不选择更新。
而JSPatch由于可以从网络请求JS替换你原本的代码,你可以在在服务器端设置一个借口获取一个JS文件,当你的项目出现问题是,你可以通过向JS文件中编写代码来实时修复你的BUG。所以JSPatch可以完美的实时修复线上bug。
2. 使用
安装
常规的两种:
CocoaPods
# Your Podfileplatform :ios, '6.0'pod 'JSPatch'
手动导入
简历JSPatch/目录,拖入:JSEngine.mJSEngine.hJSPatch.js
使用
非常简单,在AppDelegate
的didFinishLaunchingWithOptions
方法中加入JSPatch的初始化代码
[JPEngine startEngine];// 导入本地存放的jsNSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"js"];NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];[JPEngine evaluateScript:script];
上面这些代码,是小鱼在本次演示中使用的,sourcePath指向的是项目中的sample.js(sample.js现在是空的)
除了上面我写的这种本地加载JS,更常用的是通过向服务器请求JS,JSPatch提供了非常全面的加载方法:
[JPEngine startEngine];// 直接用NSString写一段JS[JPEngine evaluateScript:@"\ var alertView = require('UIAlertView').alloc().init();\ alertView.setTitle('Alert');\ alertView.setMessage('AlertView from js'); \ alertView.addButtonWithTitle('OK');\ alertView.show(); \"];// 从网络请求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];}];// exec local js fileNSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"js"];NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];[JPEngine evaluateScript:script];
OK,继续,我们来写一段错误代码
- ViewController的Storyboard中拖入了一个UILabel,并且拖好线
给ViewController加一个数组
// 现在的属性有:@property (weak, nonatomic) IBOutlet UILabel *lblText;@property (nonatomic, strong) NSMutableArray *array;
给数组加个懒加载
- (NSMutableArray *)array { if (_array == nil) { _array = [NSMutableArray array]; } return _array;}
- 在viewDidLoad中这样写
- (void)viewDidLoad { [super viewDidLoad]; [self.array addObject:@"first"]; [self.array addObject:@"second"]; [self.array addObject:@"third"]; [self test];}- (void)test { NSLog(@"%@", self.array[3]); self.lblText.text = self.array[3];}
显然会出错是不是?毕竟数组中只有3个元素
OK,运行,然后程序崩了
我们尝试用JSPatch解决
现在我们原来空空如也的sample.js派上了用场,在里面写入
// sample.jsdefineClass('ViewController', { test: function() { // 获取数组中第一个元素 var content = self.array().objectAtIndex(0); // 获取label控件 var label = self.lblText(); // 设置label控件的文字 label.setText(content); } });
再运行,你会发现不会出错,页面中的Label显示了”first”字样
以上的JS起到的作用是:重新编写『ViewController』中的『test』方法
是不是非常简单,关于语法,在这里查看JSPatch的wiki,不要害怕,都是非常易懂的,就算你没有学JS,妹子我觉得这是见过最良心的文档了,简单易读还是中文,bang帅哥棒棒的
小结
想想一下,上面的问题,如果这时候你的项目已经上线了,所有用户浏览这个页面时都会崩溃,必须及时修复。Don’t worry,如果你已经预先在AppDelegate
的didFinishLaunchingWithOptions
中做了网络加载,你只需要去修改那段js,所有线上的用户问题都会被及时解决
3. 源码
老规矩,这里奉上上面demo的源码
有什么问题都可以在博文后面留言,或者微博上私信我。
博主主要写javaee和iOS的。
希望大家一起进步。
CSDN: CSDN博客地址
我的微博:小鱼周凌宇
- iOS——为你的项目引入超轻量级JS引擎JSPatch
- 轻量级的的视差引擎Parallax.js
- 轻量级的的视差引擎Parallax.js
- 轻量级的的视差引擎Parallax.js
- 从框架到完整项目搭建,实战项目《约个球》(3)-为library引入超全的工具类
- 超轻量级异步JS框架
- 超轻量级缓存技术——EhCache
- 超轻量级缓存技术——EhCache
- 超轻量级缓存技术——EhCache
- NicEditor——超轻量级文本编辑器
- 超轻量级缓存技术——EhCache
- 超轻量级缓存技术——EhCache
- 超轻量级缓存技术——EhCache
- 超轻量级缓存技术——EhCache
- iOS轻量级布局引擎 BLSmartLayoutEngine
- iOS引入JavaScriptCore引擎框架
- iOS JSPatch
- 关于iOS项目中引入Html5文件(html/js/css)的路径问题
- 常用linux命令大全
- 老韩思考:卖点----卖豆腐的能转行IT
- sqlite配置选项
- 严重: Exception starting filter struts2 java.lang.NullPointerException
- sqlite 交叉编译-转
- iOS——为你的项目引入超轻量级JS引擎JSPatch
- 使用docker搭建部署hadoop分布式集群
- Linux下Gcc生成和使用静态库和动态库详解(转)
- 在mac上安装mysql5.7.10
- P1025 数的划分
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- P18 (**) Extract a slice from a list.
- Apache常见编译选项-转
- 关于sqlite断电或者存储空间不足造成的数据文件损坏问题-转