情景假设
众所周知苹果的审核机制非常的严格,虽然现在审核时间缩短了,但是从提交到App Stroe、审核通过、上线也要数日。若线上的App出现很严重的Bug,或者临时改动些小东西(颜色,字体啊什么的)必须要解决要改的时候。如果下线重新审核,无形中又会浪费很多的时间。如果App的用户群很庞大的话,下线重新审核会给公司带来很大的损失,那可不可以在App不下线的情况下修复些Bug呢?这个时候我们就需要热更新。
本文demo地址
JSPatch的配置
1.创建App工程(没什么好说的,注意在plist中开启网络)
2.下载JSPatch的SDK,解压后拖拽到工程里面。注意Copy items if needed 要勾选
3.添加依赖框架 libz.tdb 和 JavaScriptCore.framework ,红色框里的依赖框架需要手动导入,正常情况下蓝色框系统默认添加(若没有则手动导入)
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服务器脚本
注册后点击我的App-》新建App
App名填写虽然没有限制但是尽量与应用名一致把这样规范些
如不是App没有上线的话 AppStore AppID可以不用填写
新建App后得到appKey 在此方法中使用
[JSPatch startWithAppKey:@""];
填写版本号与App的版本号一致(新建应用默认版本号为1.0)
点击版本(App Version)选择补丁文件。(JSPacth支持多个补丁更新。不需点击加号,加号意为添加多个补丁,我们这里只加一个补丁)
这个时候我们还没有补丁,需要自己创建个main.js补丁
defineClass('ViewController',{
test : function() {
self.label().setText("label改变了9887");
},
})
选择好补丁后,勾选开发预览,并提交,发布新补丁。(勾选,以及发布方式没有限制,看具体需求吧。)
ok,这个时候可以看看例子中UILabel的文字是不是已经被JSPatch改变了。
补充
关于iOS的热更新有
-
阿里百川HotFix(8月27开始公测)
阿里百川HotFix能够帮助开发者将修复Bug的补丁,实时发布到APP内,当用户启动APP时,补丁将自动加载安装,用户全程无感知,而Bug已经修复。相比发版到应用市场,等待通过审核,再等到用户下载更新的冗长路径,有的用户甚至对频繁发版的APP会有抵触而不更新,HotFix,将帮助您在第一时间,修复多平台的问题