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阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容