App的热更新JSPatch的使用

情景假设

众所周知苹果的审核机制非常的严格,虽然现在审核时间缩短了,但是从提交到App Stroe、审核通过、上线也要数日。若线上的App出现很严重的Bug,或者临时改动些小东西(颜色,字体啊什么的)必须要解决要改的时候。如果下线重新审核,无形中又会浪费很多的时间。如果App的用户群很庞大的话,下线重新审核会给公司带来很大的损失,那可不可以在App不下线的情况下修复些Bug呢?这个时候我们就需要热更新
本文demo地址

JSPatch的配置

1.创建App工程(没什么好说的,注意在plist中开启网络)
2.下载JSPatch的SDK,解压后拖拽到工程里面。
注意Copy items if needed 要勾选

8F18ED01-76C7-41AF-8C58-41ED6B4D23F9.png

3.添加依赖框架 libz.tdb 和 JavaScriptCore.framework ,红色框里的依赖框架需要手动导入,正常情况下蓝色框系统默认添加(若没有则手动导入)

D0BAB919-E160-45D5-A23D-C41F5009EC46.png

JSPatch的简单例子

1.初始化控制器中的控件

创建一个UILabel控件,设置文字,边框等。稍后会通过JSPatch改变lable中的文字,控制器中代码如下:

//
//  ViewController.m
//  JspathDemo
//
//  Created by guo on 16/8/29.
//  Copyright © 2016年 guo. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong)UILabel *label;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 100)];
    self.label = label;
    label.layer.borderWidth = 1;
    label.layer.borderColor = [UIColor orangeColor].CGColor;
    label.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:label];
    [self test];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)test{
    
    self.label.text = @"我是lable";

}

@end

2.在AppDelegate中启动JSPatch

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
    //传入在平台申请的 appKey。会自动执行已下载到本地的 patch 脚本。
    [JSPatch startWithAppKey:@"fe981ccab3964ba6"];
    
    
    
/*
 事件回调
       type: 事件类型,详见 JPCallbackType 定义
       data: 回调数据
       error: 事件错误
       在 `+startWithAppKey:` 之前调用
 */
    [JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) {
        
        switch (type) {
            case JPCallbackTypeUnknow:
                NSLog(@"*****");
                break;
            case JPCallbackTypeRunScript:
                NSLog(@"执行脚本");
                break;
            case JPCallbackTypeUpdate:
                NSLog(@"已拉取新脚本");
                break;
            case JPCallbackTypeCondition:
                NSLog(@"条件下发");
                break;
            case JPCallbackTypeGray:
                NSLog(@"灰度下发");
                break;            
            default:
                break;
        }

        

 /*
 进入开发模式
     平台下发补丁时选择开发预览模式,会只对调用了这个方法的客户端生效。
     在 `+sync:` 之前调用,建议在 #ifdef DEBUG 里调。
 */
    [JSPatch setupDevelopment];
    
    
    
 /*
 与 JSPatch 平台后台同步,
     发请求询问后台是否有 patch 更新,如果有更新会自动下载并执行
     可调用多次(App启动时调用或App唤醒时调)
 */
    [JSPatch sync];
    
    
    return YES;
}

JSPatch服务器脚本

注册JSPacth

注册后点击我的App-》新建App

App名填写虽然没有限制但是尽量与应用名一致把这样规范些
如不是App没有上线的话 AppStore AppID可以不用填写

84B30B93-8533-4A17-9593-603333FD0A7F.png

新建App后得到appKey 在此方法中使用
[JSPatch startWithAppKey:@""];
填写版本号与App的版本号一致(新建应用默认版本号为1.0)

2AD1812A-D44E-4691-B077-6CC66FFA5E9B.png

点击版本(App Version)选择补丁文件。(JSPacth支持多个补丁更新。不需点击加号,加号意为添加多个补丁,我们这里只加一个补丁)

111.png

这个时候我们还没有补丁,需要自己创建个main.js补丁

defineClass('ViewController',{
    test : function() {
        self.label().setText("label改变了9887");
    },
})

选择好补丁后,勾选开发预览,并提交,发布新补丁。(勾选,以及发布方式没有限制,看具体需求吧。)

ok,这个时候可以看看例子中UILabel的文字是不是已经被JSPatch改变了。

补充

关于iOS的热更新有

  1. 阿里百川HotFix(8月27开始公测)

    阿里百川HotFix能够帮助开发者将修复Bug的补丁,实时发布到APP内,当用户启动APP时,补丁将自动加载安装,用户全程无感知,而Bug已经修复。相比发版到应用市场,等待通过审核,再等到用户下载更新的冗长路径,有的用户甚至对频繁发版的APP会有抵触而不更新,HotFix,将帮助您在第一时间,修复多平台的问题

  1. JSPatch
    JSPatch 是一个开源项目(Github链接),只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。

参考文章

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

推荐阅读更多精彩内容

  • 一、目的: 随着APP迭代更新,项目越写越庞大,每个功能间的关联性越来越多。再加上测试人员人手不足等情况,不可避免...
    LQWAWAIOS阅读 431评论 0 2
  • JSPatch作为热更新技术的黑科技,已经不是什么前沿的新闻了,像腾讯、美团等大公司也在使用JSPatch。前段时...
    任尔东西南北疯阅读 1,485评论 0 3
  • 一、目的: 随着APP迭代更新,项目越写越庞大,每个功能间的关联性越来越多。再加上测试人员人手不足等情况,不可避免...
    lilei5阅读 1,667评论 7 22
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,373评论 25 707
  • Poj 1664 题意 中文题。。。略了 思路 没做出来,上网查了之后发现用递归的思想。分为两种情况1.至少一个盘...
    vanadia阅读 542评论 0 0