JSPatch 可以让你用 JavaScript 书写原生 iOS APP
简介
JSPatch 可以让你用 JavaScript 书写原生 iOS APP。只需在项目引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原生代码实时修复 bug。 JSPatch 在 Github 开源 4 个月已经有2K+ star,公司内已应用在微信/微信读书/腾讯地图上,公司外许多知名产品像美团/蚂蜂窝/去哪儿/蘑菇街/同程等都已接入上线。 Github 项目主页:https://github.com/bang590/JSPatch
功能清单
JSPatch 相对于另一个 hotfix 框架 waxPatch,有以下优势:
- 小巧:只有 1300 行 OC 代码与 170 行 JS 代码
- JS语言:终端应用最广泛的脚本语言,无需另外学习
- 完善的功能支持:线程安全,支持64位,支持Block,支持任意类型参数的传递转换
- 完善的单元测试:每一个功能点都有单元测试保证健壮性
- 断点调试脚本:通过接入 Safari 控制台可以断点调试 JS 脚本
- 完善的文档:大量文档资料可供参考
- 开源社区支持:大量知名 APP 使用,Github关注度高,至今已有10位社区成员贡献代码
- 符合苹果审核规则:苹果不允许下发可执行代码,但通过 JavaScriptCore.framework 执行的JS代码除外,详见这里
快速上手
例如线上 APP 有一段代码出现 bug 导致大量 crash:
- @implementation JPTableViewController
- ...
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- {
- NSString *content = self.dataSource[[indexPath row]]; //可能会超出数组范围导致crash
- JPViewController *ctrl = [[JPViewController alloc] initWithContent:content];
- [self.navigationController pushViewController:ctrl];
- }
- ...
- @end
可以通过下发这样一段 JS 代码,覆盖掉原方法,修复这个 bug:
- //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);
- }
- }
- }, {})
FAQ常见问题
详见Github wiki:https://github.com/bang590/JSPatch/wiki
源码概况
JSPatch 可以让你用 JavaScript 书写原生 iOS APP的更多相关文章
- React Native:使用 JavaScript 构建原生应用
[转载] 本篇为联合翻译,译者:寸志,范洪春,kmokidd,姜天意 数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生 ...
- React Native – 使用 JavaScript 开发原生应用
前不久,Facebook 在F8开发者大会上正式开源了 React Native 项目.不过目前只有 iOS 版,Android 版还需要再等一段时间,这是最新的用 JavaScript 语言开发原生 ...
- 深入浅出 React Native:使用 JavaScript 构建原生应用
深入浅出 React Native:使用 JavaScript 构建原生应用 链接:https://zhuanlan.zhihu.com/p/19996445 原文:Introducing React ...
- 如何使用javascript书写递归函数
递归函数大家都应该比较熟吧?那么,如何在javascript中书写一个完美的递归函数呢?且听我娓娓道来. 递归函数 写的时候,查了一下维基百科对递归函数的定义,恕我愚钝,简直太深奥了!所以,我还是简单 ...
- React Native:使用 JavaScript 构建原生应用 详细剖析
数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了! 基于 Pho ...
- Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头、麦克风等。
Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等. Cordova还提供了一组统一的JavaScript类库,以及为这 ...
- 用javascript写原生ajax(笔记)
AJAX 的全名叫做 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并 ...
- javascript实现原生ajax
自从javascript有了各种框架之后,比如jquery,使用ajax已经变的相当简单了.但有时候为了追求简洁,可能项目中不需要加载jquery这种庞大的js插件.但又要使用到ajax这种功能该如何 ...
- JavaScript AJAX原生写法
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
随机推荐
- Eclipse for android 实现代码自动提示智能提示功能
Eclipse for android 实现代码自动提示智能提示功能,介绍 Eclipse for android 编辑器中实现两种主要文件 java 与 xml 代码自动提示功能,解决 eclips ...
- Visual Studio 2015中使用gdb远程调试linux程序
VS的debug功能非常强大,相比而言linux上的图形化调试一直不是很好用. 如果可以使用VS来调试linux程序,应该是一件比较愉快的事情. 这在2015中变得可能,因为从2015开始VS支持An ...
- 9.png图片制作详细教程
1.背景自适应且不失真问题的存在 制作自适应背景图片是UI开发的一个广泛问题,也是界面设计师渴望解决的问题,我相信我们彼此都深有体会. 比如,列表的背景图一定,但是列表的高度随着列 ...
- OpenGL-非实时渲染与实时混合使用(有图有真相)
视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 一个朋友在问(我也曾经遇到过这样的事情),尤其是在地理信息上面 ...
- WPF设置控件获得焦点FocusManager
简单用法如下: 在父类容器中通过附加属性FocusManager.FocusedElement来绑定需要强制获得焦点的控件,用法如下: <Grid FocusManager.FocusedE ...
- 术语CDATA,其实可以理解为一种特殊的转移字符
参考:http://www.w3school.com.cn/xml/xml_cdata.asp 常见于XML文档,所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(Charact ...
- Java指定保留小数位数的方法
package com.qiyuan.util; import java.math.BigDecimal; import java.math.RoundingMode; import java.tex ...
- Java中float和double转换的问题
为什么double转float不会出现数据误差,而float转double却误差如此之大? double d = 3.14; float f = (float)d; System.out.prin ...
- 基于python的多线程暴破脚本
搭建了一个本地wordpress,写一个基于多线程异步I/O的暴力破解 1 测试 提交错误的表单数据时,查看请求参数 登录时发送的cookie 2 登录分析 经过多次测试,发现无论是输入正确的密码还是 ...
- docker1-安装和使用
docker安装和使用 一.安装docker 1.1 centos7.2安装docker 环境:centos7.2 安装方法:https://docs.docker.com/engine/instal ...