iOS热更新/热修复JSPatch的使用

一、目的:

随着APP迭代更新,项目越写越庞大,每个功能间的关联性越来越多。再加上测试人员人手不足等情况,不可避免会发布带有bug的APP到appStore,所以我们就想尽快发布新版本进行覆盖。苹果公司对APP的审核速度现在虽然有所提高,但是仍需要时间。而在这段时间内很可能就会丧失大量用户。所以,在发现bug后立即解决并能同步到所有客户端内,这就是我们要达成的目的。然而使用JSPatch就可以解决这样的问题,只需在项目中引入JSPatch,就可以在发现bug时下发JS脚本补丁,替换原生方法,无需更新APP即时修复bug。

二、实现原理:

我们可以通过JavaScript代码来修改OC代码,归根结底还是OC运行时及消息转发机制。

三、JSPatch集成

1.cocoaPods集成

在Podfile文件引入:
pod 'JSPatchPlatform'
再pod update即可

2.手动集成

去网站下载SDK:http://jspatch.com/Index/sdk
下载完成后将JSPatchPlatform.framework 拖入工程后 在TARGETS ->Build Phases ->Link binary with libraries 添加libz.tbd

四、热更新和热修复的简单尝试

首先创建一个工程,使用上面的任意一种方式集成JSPatch,然后在viewController里添加如下代码(控件从storyboard拖拽的,代码亦可)。


测试代码.png

运行结果如下图所示:此时label的text为"原始文字",而button一点击就会crash。然而需求是:label的text为"修改后的文字",button点击后文字改为"按钮被点击了",那么在不上传新的APP到appStore时如何实现这个需求呢。这就要用到JSPatch了。


初始运行结果.png

1、在appDelegate引入头文件#import <JSPatchPlatform/JSPatch.h>并在didFinishLaunchingWithOptions方法里添加如下代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //初始化SDK [JSPatch startWithAppKey:@"你的appKey"]; //进入开发模式(开发测试时调用) [JSPatch setupDevelopment]; // 同步脚本 [JSPatch sync]; return YES; }

2、获得你的appKey

添加APP.png
  • 添加成功后会出现对应的appKey,这个就是上面需要你填写的appKey


    添加成功.png

    3、上传js脚本补丁进行修改/修复

  • 添加版本。!注意:这个版本号要与你工程的版本号一致,否则无法下载响应的补丁。


    添加版本.png
  • 上传js脚本,上传要求:JS脚本的文件名必须是main.js
    1、创建一个空的main.js格式文件,添加如下代码
    defineClass('ViewController', { test : function() { self.label().setText("修改后的文字"); } })

defineClass("ViewController", { btnClicked: function(sender) { sender.setTitle_forState("按钮被点击了", 0); } }, {});
ps:如果不熟悉js代码,可使用转换器将oc代码转换成js代码。http://jspatch.com/Tools/convertor
2、选择刚才创建的版本,进入如下界面,上传main.js文件,勾选开发预览,点击提交。

脚本上传.png

3、然后就到了你验证奇迹的时刻。运行你的项目试一下。!注:如果你的xcode8并且是用模拟器运行的则需要在项目 Capabilities 打开 Keychain Sharing 开关。
最终结果.png

看看你的运行结果是不是和我的一样,如果一样那么这个简单的尝试就结束了。但是JSPatch的操作还是挺繁多的,比如如何添加新方法、如何给一个类动态新增 Property等一系列操作任需要我们掌握。参见https://github.com/bang590/JSPatch/wiki/JSPatch-基础用法

当然我们也可以本地测试main.js文件是否正确且有用:首先将main.js文件拖入工程,再在didFinishLaunchingWithOptions方法里将[JSPatch startWithAppKey:@"你的appKey"];替换为[JSPatch testScriptInBundle];(注:这两个方法不能同时调用)。

PS:JSPatch 是一个开源项目,本文是在JSPatch平台的基础上操作的,如果想通过自己的服务器实现脚本的检测、下发等操作,可直接在github上下载源码进行操作。https://github.com/bang590/JSPatch

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 一、目的: 随着APP迭代更新,项目越写越庞大,每个功能间的关联性越来越多。再加上测试人员人手不足等情况,不可避免...
    lilei5阅读 1,621评论 7 22
  • JSPatch 是腾讯微信团队牛人bang开源的一种通过JavaScript调用iOS原生代码来实现热修复或者动态...
    杭研融合通信iOS阅读 795评论 2 23
  • 17/03/08更新有不少小伙伴反应苹果发送了邮件要求去除项目中用于动态改变应用的代码 ,看来 JSPatch 要...
    dy_zhang阅读 3,355评论 5 15
  • JSPatch是什么 JSPatch是一个开源项目,只需要在项目里引入极小的引擎文件,就可以使用 JavaScri...
    ImmortalSummer阅读 2,488评论 7 11
  • 上了大学不出去走走感觉大学就白上了,反正,我去的地方也不多,就: 东至上海 北达北京 南至湘西 我想这些地方你应该...
    我是帅气的火星阅读 165评论 0 0