IOS热修复之JSPatch

icon

前言


IOS热修复一直是关注的重点之一。由于appstore的审核上架机制的局限,新发布的版本往往要等待很长时间才能上架。如果旧版本有重大bug,并且用户不更新,那么安装了有bug版本的用户永远都不能修复(不可挽回的失误)。

所谓热修复,就是不需要重新上架就修复线上bug。去年比较流行的React Native可以解决这一问题。但是React Native需要用JS编写代码,这一点对于我来说还是很不情愿的。

IOS热修复技术我一直认为很不成熟,但是当我使用JSPatch的时候,我的观念完全改变了,这简直就是不可多得的神器!JSPatch是去年3月份第一次在GitHub上提交,也算是新事物吧。

gitHub提交截图

JSPatch简介


  • JSPatch 可以让你用 JavaScript 书写原生 iOS APP。只需在项目引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原生代码动态修复 bug。

  • 作者Bang (以前一直觉得Bang博客很有清爽,特别喜欢,没想到是JSPatch的作者。。)

  • cocoaPods安装:pod 'JSPatchSDK', '~> 1.5.2'

  • gitHub地址:https://github.com/bang590/JSPatch/blob/master/README-CN.md

  • 实现原理:可以参考唐巧的文章戳这里

  • 脚本管理平台:http://jspatch.com/

  • objective-c转js工具:转换工具

JSPatch实战体验(线下)


首先我们创建一个简单的项目,导入podFile,然后添加一个Label,添上约束,随便写点字。代码如下:

- (void)viewDidLoad {
    [super viewDidLoad]; 
    self.testLabel.text = @"this is a bug";
}
简单效果

然后在AppDelegate.m中写上头文件和代码#import <JSPatch/JSPatch.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //线下使用这个代码,系统会自动查找项目中的main.js文件,然后完成热修复
    [JSPatch testScriptInBundle];
    return YES;
}

最后在项目中添加main.js文件,里面写上js代码,运行就好了。不知道怎么写js?作者早就考虑到了这点,为了方便开发者,作者写了一个oc转js的脚本工具,只要在左侧写入oc代码,右边就能装换成符合规范的js文件(真的很用心)。
工具地址

工具演示
文件中的main.js

最后运行项目看看效果吧。

成功修复了!
defineClass('ViewController', {
        viewDidLoad: function() {
        self.super().viewDidLoad();
        
        self.testLabel().setText("Hot  Fix!");
        },
        });

从js代码我们可以得出JSPatch的实现原理。首先找到ViewController类,再找到viewDidLoad:方法,将js用正则匹配或者其他方法转换成oc代码,在通过runtime机制将viewDidLoad:替换成新的方法,这样就实现了热修复。

我们再写点复杂的代码,给view上加一个Label。

复杂点代码

这里需要注意的是,CGRectMake等结构体转成js的时候,工具并不能帮我们转换成功,这也是一处Bug吧。可以参考文档:文档
正确代码如下:

require('UILabel,UIColor');
defineClass('ViewController', {
    viewDidLoad: function() {
        self.super().viewDidLoad();

        self.testLabel().setText("hotFix!");
        var label = UILabel.alloc().initWithFrame({x:100, y:100, width:100, height:100});
        label.setText("hello World");
        label.setBackgroundColor(UIColor.redColor());
        self.view().addSubview(label);
    },
});

效果:


最终效果

JSPatch实战体验(线上)


热修复,当然在线上测试才有意义。首先登入JSPatch平台(有能力的完全可以自己搭建)http://jspatch.com/注册一个账号,申请一个appKey。

测试平台

然后修改AppDelegate.m里的方法,改成线上测试。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [JSPatch startWithAppKey:@"728a7c0548d35106"];
#ifdef DEBUG
     [JSPatch setupDevelopment];
 #endif
     [JSPatch sync];
//    [JSPatch testScriptInBundle];
     return YES;
 }

把工程里的main.js移出工程,上传到平台上。这样就完成了,线上的配置。运行代码,第一次还是显示this is a bug,因为工程要把线上的main.js文件下载到本地。第二次进入就能看见hot Fix啦。

上传main.js

总结


总体体验下来,JSPatch的使用真的很简单!而且作者真的很用心,为开发者专门设计了转换工具(对于js三脚猫功夫的我简直痛哭流涕),不愧为IOS热修复第一方案。

值得注意的是,有热修复就有安全问题。如果泄露修复方法,黑客就能修改你的源代码,这一点十分恐怖。JSPatch管理平台上提供了很多加密方案比如RSA等,具体的可以自行查看开发文档开发文档

最后附上目前正在使用的app截图,阵容很强大哦~

强大阵容

我是翻滚的牛宝宝,欢迎大家评论交流~

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

推荐阅读更多精彩内容