简介

 
JSPatch 可以让你用 JavaScript 书写原生 iOS APP。只需在项目引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原生代码实时修复 bug。

JSPatch 在 Github 开源 4 个月已经有2K+ star,公司内已应用在微信/微信读书/腾讯地图上,公司外许多知名产品像美团/蚂蜂窝/去哪儿/蘑菇街/同程等都已接入上线。

Github 项目主页:https://github.com/bang590/JSPatch

功能清单

JSPatch 相对于另一个 hotfix 框架 waxPatch,有以下优势:

  1. 小巧:只有 1300 行 OC 代码与 170 行 JS 代码
  2. JS语言:终端应用最广泛的脚本语言,无需另外学习
  3. 完善的功能支持:线程安全,支持64位,支持Block,支持任意类型参数的传递转换
  4. 完善的单元测试:每一个功能点都有单元测试保证健壮性
  5. 断点调试脚本:通过接入 Safari 控制台可以断点调试 JS 脚本
  6. 完善的文档:大量文档资料可供参考
  7. 开源社区支持:大量知名 APP 使用,Github关注度高,至今已有10位社区成员贡献代码
  8. 符合苹果审核规则:苹果不允许下发可执行代码,但通过 JavaScriptCore.framework 执行的JS代码除外,详见这里

快速上手

例如线上 APP 有一段代码出现 bug 导致大量 crash:

  1. @implementation JPTableViewController
  2. ...
  3. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  4. {
  5. NSString *content = self.dataSource[[indexPath row]];  //可能会超出数组范围导致crash
  6. JPViewController *ctrl = [[JPViewController alloc] initWithContent:content];
  7. [self.navigationController pushViewController:ctrl];
  8. }
  9. ...
  10. @end

可以通过下发这样一段 JS 代码,覆盖掉原方法,修复这个 bug:

  1. //JS
  2. defineClass("JPTableViewController", {
  3. //instance method definitions
  4. tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {
  5. var row = indexPath.row()
  6. if (self.dataSource().length > row) {  //加上判断越界的逻辑
  7. var content = self.dataArr()[row];
  8. var ctrl = JPViewController.alloc().initWithContent(content);
  9. self.navigationController().pushViewController(ctrl);
  10. }
  11. }
  12. }, {})

FAQ常见问题

源码概况

源码路径: http://tc-svn.tencent.com/components/JSPatch_proj
该组件已有 1 次源码更新操作。
最近提交:
bangchen 在 JSPatch 组件中提交了89个源码变更,版本号: 2 。
提交备注:init
2015-09-14 19:42:19
 
 
 
http://pub.code.oa.com/project/home?comeFrom=task_cc_weekly_personal_20151012&projectName=JSPatch&ticket=15D7EB787388C77B72FE3437987F068C36B68AFA86BBC3C726BFD6A65EFC77FA907EC23EE985ABD6A2E957FD38BA388
 

JSPatch 可以让你用 JavaScript 书写原生 iOS APP的更多相关文章

  1. React Native:使用 JavaScript 构建原生应用

    [转载] 本篇为联合翻译,译者:寸志,范洪春,kmokidd,姜天意 数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生 ...

  2. React Native – 使用 JavaScript 开发原生应用

    前不久,Facebook 在F8开发者大会上正式开源了 React Native 项目.不过目前只有 iOS 版,Android 版还需要再等一段时间,这是最新的用 JavaScript 语言开发原生 ...

  3. 深入浅出 React Native:使用 JavaScript 构建原生应用

    深入浅出 React Native:使用 JavaScript 构建原生应用 链接:https://zhuanlan.zhihu.com/p/19996445 原文:Introducing React ...

  4. 如何使用javascript书写递归函数

    递归函数大家都应该比较熟吧?那么,如何在javascript中书写一个完美的递归函数呢?且听我娓娓道来. 递归函数 写的时候,查了一下维基百科对递归函数的定义,恕我愚钝,简直太深奥了!所以,我还是简单 ...

  5. React Native:使用 JavaScript 构建原生应用 详细剖析

    数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了! 基于 Pho ...

  6. Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头、麦克风等。

    Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等. Cordova还提供了一组统一的JavaScript类库,以及为这 ...

  7. 用javascript写原生ajax(笔记)

    AJAX  的全名叫做  Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并 ...

  8. javascript实现原生ajax

    自从javascript有了各种框架之后,比如jquery,使用ajax已经变的相当简单了.但有时候为了追求简洁,可能项目中不需要加载jquery这种庞大的js插件.但又要使用到ajax这种功能该如何 ...

  9. JavaScript AJAX原生写法

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. (转)十分钟了结MySQL information_schema

    十分钟了结MySQL information_schema  原文:http://www.cnblogs.com/shengdimaya/p/6920677.html information_sche ...

  2. litespeed 下配置 伪静态,反向代理

    <IfModule mod_rewrite.c>RewriteEngine onRewriteBase / RewriteRule ^(.*).html$ index.php?static ...

  3. Android Studio打开非本机项目比较慢的问题。

    使用Android Studio打开其他项目的时候,如果使用的AS版本.gradle不同的话,会在打开项目的时候下载gradle版本,网速不好的情况下回非常的慢. 解决方案: 1.将本机创建的AS项目 ...

  4. MyEclipse *的下载

    找到MyEclipse的各种历史版本下载页面 : MyEclipse官方中文网 欢迎大家,加入我的微信公众号:大数据躺过的坑        人工智能躺过的坑       同时,大家可以关注我的个人博客 ...

  5. libevent安装总结

    1.先用:ls -al /usr/lib | grep libevent 查看是否已安装:如果已安装且版本低于1.3,则先通过:rpm -e libevent —nodeps进行卸载. 2.下载lib ...

  6. linux ping 命令解析

    不管在windows平台,还是在linux平台,ping都是非常常用的网络命令:ping命令通过ICMP(Internet控制消息协议)工作:ping可以用来测试本机与目标主机是否联通.联通速度如何. ...

  7. pcap简单使用和简单解释

    数据类型bpf_u_int32实际上就是u_int的一个别名,还有吧bpf_int32实际上就是int的别名.当然这个int是32位的,如果操作系统对int的定义不是4字节,bpf_int32就对应另 ...

  8. no awt in java.libary.path

    缺少依赖包. linux下进入jdk安装路径/jre/lib/i386 使用ldd查看依赖包情况: ldd libawt.so 如果发现有not found的,就安装上,或者从jdk下查找,使用软连接 ...

  9. 使用gitlab, jenkins搭建CI(持续集成)系统(2) -- 配置webhook触发构建

    1. 在gitlab上配置192.168.1.30的ssh秘钥,使jenkins可以操作gitlab上的project 进入gitlab,点击右上角 点击 Settings -> SSH key ...

  10. Behave 基础

    在你使用behave或其他BDD框架之前, 你应该选择一个断言库. python有很多这方面的第三方库.例如: hamcrest,nose.tools,  should-dsl, sure, comp ...