JSPatch,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的原生接口,获得脚本语言的能力:动态更新APP,替换项目原生代码修复bug。

  是否有过这样的经历:新版本上线后发现有个严重的bug,可能会导致crash率激增,可能会使网络请求无法发出,这时能做的只是赶紧修复bug然后提交等待漫长的AppStore审核,再盼望用户快点升级,付出巨大的人力和时间成本,才能完成此次bug的修复。

  使用JSPatch可以解决这样的问题,只需在项目中引入JSPatch,就可以在发现bug时下发JS脚本补丁,替换原生方法,无需更新APP即时修复bug。

@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

上述代码中取数组元素处可能会超出数组范围导致crash。如果在项目里引用了JSPatch,就可以下发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);
}
}
}, {})

  这样 JPTableViewController 里的 -tableView:didSelectRowAtIndexPath: 就替换成了这个JS脚本里的实现,在用户无感知的情况下修复了这个bug。

原理

  JSPatch用iOS内置的JavaScriptCore.framework作为JS引擎,但没有用它JSExport的特性进行JS-OC函数互调,而是通过Objective-C Runtime,从JS传递要调用的类名函数名到Objective-C,再使用NSInvocation动态调用对应的OC方法。

  JSPatch更符合Apple的规则。iOS Developer Program License Agreement里3.3.2提到不可动态下发可执行代码,但通过苹果JavaScriptCore.framework或WebKit执行的代码除外,JS正是通过JavaScriptCore.framework执行的。

动态更新方案对比:JSPatch vs React Native

最新文章

  1. svn回滚版本
  2. ADO.net操作数据库
  3. R-数据结构
  4. BZOJ 1297: [SCOI2009]迷路( dp + 矩阵快速幂 )
  5. Android studio ElasticDownloadView
  6. poj 2478 Farey Sequence(欧拉函数是基于寻求筛法素数)
  7. 在域信任环境中使用 Team Foundation Server (TFS 2013)
  8. iOS根据获取的月和日星座名称
  9. 【机器学习】使用gensim 的 doc2vec 实现文本相似度检测
  10. this在java中的用法
  11. 外部python脚本调用django 手动清理session
  12. UI动画优化技巧
  13. Kanboard简单的可视化任务板,项目管理
  14. 结合以太通道的VLAN配置
  15. CONTINUOUS MIGRATION
  16. 【deep learning】斯坦福CS231n—深度学习与计算机视觉(资料汇总)
  17. Python str() 函数
  18. session的创建与销毁
  19. Python time & datetime & string 相互转换
  20. MVC-READ3(视图引擎主要类关系图)

热门文章

  1. Nginx(haproxy)+keepalived+Tomcat双主高可用负载均衡
  2. day 23 模块2
  3. JPMML解析PMML模型并导入数据进行分析生成结果
  4. AS5600磁编码器开发记录
  5. Java学习笔记二十五:Java面向对象的三大特性之多态
  6. ACM1000:A + B Problem
  7. 如何将github项目上传至gitlab
  8. 上海Uber优步司机奖励政策(1月4日~1月10日)
  9. netty之管道处理流程
  10. java-IO处理类的序列化与反序列化