iOS开发热更新JSPatch

  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

时间: 2024-10-13 16:01:10

iOS开发热更新JSPatch的相关文章

iOS 动态更新

iOS 动态更新 App 动态更新 1.控件到 window 的层级关系: 2.分析控件的详细路径: 3.动态修改控件: 4.工具篇: 视图的层级关系: 每个 App , 至少有一个根 Window , 通常情况下我们只用一个 .window 有一个 rootViewController , 这就是我们所谓的根视图 , 我们所有的控制器都是放在 rootViewController 里面的. 这个是最简单的层级关系 如果在项目里有了这么一个路径 , 我们可以做什么呢? 在当项目很复杂 , 可以其

iOS项目更新之升级Xcode7 & iOS9

前言      Apple 的WWDC所发布内容在给大家带来惊喜之际,给各位iOS开发的同仁却也带来了不同程度的麻烦.首先不讲新功能,就单指原来老版本的项目升级.代码升级,就是一堆问题,而且是不得不面临的问题.下面就跟着笔者一起来回顾下,此次在项目升级过程中,所遇到的各个问题点,以及解决方案,与各位已经做过和正在做iOS代码升级的同仁共勉,也给各位将要做Xcode 7和iOS9兼容的同仁以参考. 开发环境安装 原本运行得好好的项目,要升级Xcode7,首先就得安装Xcode7,具体的可以从开发者

如何删除IOS软件更新包

iOS软件更新包是什么? 每次通过iTunes 更新iPhone, iPad 或者 iPod软件的时候,下载的ios更新文件就会保存在mac中.当更新完成之后,这些更新文件就不在需要了,删除它们将释放大量的mac空间.如果你还需要这些文件,可以重新下载. 如何手动删除iOS软件更新包? 1.启动Finder,在菜单栏中点击“前往”-“前往文件夹”. 2.如果是iTunes文件,可以在~/资源库/iTunes中找到要删除的软件更新. 3.同样的,iPad固件文件将被保存在 ~/资源库/iPad中:

ios后台更新和下载

ios后台更新和下载 by 伍雪颖 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]; NSLog(@"Launched in backgrou

IOS热更新-JSPatch实现原理+Patch现场恢复

关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IOS应用来说就显得尤其重要. 现在业内基本上都在使用WaxPatch方案,由于Wax框架已经停止维护四五年了,所以waxPatch在使用过程中还是存在不少坑(比如参数转化过程中的问题,如果继承类没有实例化修改继承类的方法无效, wax_gc中对oc中instance的持有延迟释放...).另外苹果对于

iOS第三方类库JSPatch(热更新)

原文地址: 一.前言 场景一:我们在做iOS开发的过程中,难免会由于自己的不细心导致一些小问题.如果产品没上线之前发现还好,如果上线了才发现问题,那么问题就大了,可能直接影响KPI,更严重的甚至直接面临着fire. 场景二.一旦上线的产品,如果临时遇到需求变动,那么久必须重新修改代码.一旦修改了项目代码的话,我们就必须重新发版.这样岂不是很麻烦? 现在就来让我们看一下JSPatch,它的出现可以在不发版的情况下动态的自行修复或者添加新的需求. 二.JSPatch简介 JSPatch:它是一个第三

iOS 热更新技术探索

最近在找工作,所以有时间研究一些BAT用到的一些框架和技术,今天要写的是热更新. 1.什么是热更新. 受限于iOS平台需要先审核在上线,一旦线上发现bug,想要修复还需要等到下次版本提交,这无形中会带给我们一些困扰,尤其是一些BAT量APP,所以热更新技术应运而生. 2.热更新解决方案. 我目前知道的有两种 第一种:微信使用的JSPatch JSPatch看名字就知道它是通过JS来实现的,大致原理就是通过下发JS脚本,通过消息转发调一些OC原生的方法,这个框架主要是用到一些JS高阶和运行时结合消

iOS热更新的几种方案

iOS APP的上架审核一直是个令人困扰的问题,动辄一个星期甚至半个月的审核时间,往往会耽误产品的运营计划. 尤其是,审核过程中难以避免的会被苹果拒绝,然后又是一个周期,很是痛苦. 除了在提交审核前,尽可能的保证产品没有Bug,以及充分研究苹果的app审核政策外,从技术开发层面如果能解决热更新问题,则再好不过了. 所以我简单整理了以下一些技术,可用于产品的内部更新,而不用重新提交给苹果审核.如果有更多的方案,或是错误,也请提出. 1. Hybrid App 混合架构,借助于Html,JS等前端技

iOS 10 更新

1.解决工程中输出无关日志 Edit Scheme -> Run -> Arguments, 在Environment Variables里边添加   OS_ACTIVITY_MODE        disable 遗留问题: 还会出现下面这个问题5]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform