JSPatch 可以让你用 JavaScript 书写原生 iOS APP
2024-10-19 03:28:53
简介
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
源码概况
源码路径: http://tc-svn.tencent.com/components/JSPatch_proj
该组件已有 1 次源码更新操作。
http://pub.code.oa.com/project/home?comeFrom=task_cc_weekly_personal_20151012&projectName=JSPatch&ticket=15D7EB787388C77B72FE3437987F068C36B68AFA86BBC3C726BFD6A65EFC77FA907EC23EE985ABD6A2E957FD38BA388
最新文章
- WCF快速上手
- -bash: pod: command not found
- House Building---hdu5538(求表面积水题)
- linux之SQL语句简明教程---BETWEEN
- python 文本编辑基础记录
- centos7 设备 mariadb-10
- JavaScript 运动框架 Step by step(转)
- MQ队列管理
- Longest Palindromic Substring - 字符串中最长的回文字段
- SQL&;SQLite
- Flask的Context(上下文)学习笔记
- js callback 和 js 混淆
- springboot-27-整合mybatis,druid连接池
- window.location对象详解
- 计蒜客 30999 - Sum - [找规律+线性筛][2018ICPC南京网络预赛J题]
- luogu P2073 送花 线段树
- linux parallel rsync 拷贝N多文件
- C基础 如何让代码只执行一次
- 第八章.Spring MVC
- mvc中RedirectToAction()如何传参?
热门文章
- error: failed to push some refs to 'https://github.com/username/python.git'
- P1494 小Z的袜子
- C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter的区别
- Docker学习--docker的基本认识
- (转)Linux中的位图
- python上安装requests
- Eclipse *的安装(图文详解)
- Fiddler HTTPS抓包
- printf()函数中\t,水平制表符,空格的个数
- 玩转mongodb(二):mongodb基础知识