对于苹果官方对于App的审核过于严格,每次App进行修改,都需要进行版本更新与迭代,还得重新提交给苹果审核,,从提交、审核、上线需要的时间也并没有一次次的缩短,如果已上线的App出现了bug或者需要进行修改的话,如果将产品下线,则会影响用户的使用,或者说浪费时间,对于公司也会造成一些不必要的影响,但现在可以用热更新进行修复一些bug,可以不需要提交的情况下进行修改bug,这就是所谓的热更新。我想大家都明白热更新的意义何在,话不多说,代码搞起。下面主要介绍的JSPatch,至于阿里百川的HotFix后期会更新。
ios的热更新现在出现的主要有两个:
1、JSPatch
JSPatch 是一个开源项目(Github链接),只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。
2、阿里百川HotFix
阿里百川HotFix能够帮助开发者将修复Bug的补丁,实时发布到APP内,当用户启动APP时,补丁将自动加载安装,用户全程无感知,而Bug已经修复。相比发版到应用市场,等待通过审核,再等到用户下载更新的冗长路径,有的用户甚至对频繁发版的APP会有抵触而不更新,HotFix,将帮助您在第一时间,修复多平台的问题。
1、JSPatch的配置
1)、创建工程(注意:配置.plist文件的网络配置)
2)、下载JSPatch的SDK,解压后拖入工程,要将copy items if needed勾选上
JSPatch的下载链接:http://jspatch.com/Index/sdk
3)、添加框架libz.tbd 和JavaScriptCore.framework,截图如下:
2、创建代码:
代码如下:
//
// MainViewController.m
// JSPatchDemo
//
// Created by marcus on 16/8/30.
// Copyright © 2016年 marcus. All rights reserved.
//
#import "MainViewController.h"
@interface MainViewController ()
@property (nonatomic,strong)UILabel *label;
@end
@implementation MainViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor grayColor];//设置背景色
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width/2, 100)];
self.label = label;
label.layer.borderWidth = 1;
label.layer.borderColor = [UIColor orangeColor].CGColor;
label.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:label];
[self test];
}
-(void)test{
self.label.text = @"第一次的显示的内容";
}
在AppDelegate中的代码
在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
<span style="font-size:14px;"><span style="color:#CC0000;">//传入在平台申请的 appKey。会自动执行已下载到本地的 patch 脚本。</span>
[JSPatch startWithAppKey:@"5a90adc4c29027fc"];
/*
事件回调
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;
}
}];</span>
<span style="font-size:14px;">/*
<span style="color:#CC0000;">进入开发模式
平台下发补丁时选择开发预览模式,会只对调用了这个方法的客户端生效。
</span> 在 `+sync:` 之前调用,建议在 #ifdef DEBUG 里调。
*/
[JSPatch setupDevelopment];
/*
<span style="color:#CC0000;">与 JSPatch 平台后台同步,
发请求询问后台是否有 patch 更新,如果有更新会自动下载并执行
可调用多次(App启动时调用或App唤醒时调)
</span> */
[JSPatch sync];</span>
3、在JSPatch上设置脚本:
注册JSPatch 链接:http://jspatch.com/Index/reg
注册后点击我的App ---- > 新建App , App名填写尽量与应用名一致把这样规范些 (App名称没有具体的要求),如果App没有上线的话 AppStore AppID可以不用填写。
完成填写后会获取到Appkey
新建App后得到appKey 在此方法中使用,将Appkey填入即可。
[JSPatch startWithAppKey:@""];
填写完成后:添加版本号(注意:版本号要与自己的App的版本号一致)
要记得选开发预览
这个时候需要的是一个js脚本才可以进行选择文件,这个之后直接点”浏览“,”浏览“是选择一个文件,而选择”+“是选择多个文件
4、创建JS脚本:
点开刚刚创建的工程,command+n 选择 Other 选择 Empty
点击 next 会跳转到下面这个界面, 要保证Save As 的名称为 main.js,
创建成功之后你就可以看到你创建一个js的脚本文件,在脚本文件中写你所需要改的内容,代码如下:
defineClass('MainViewController',{
test : function() {
self.label().setText("第二次更新");
},
})
在这个脚本中,将你需要修改的内容修改就可以了。
最后选择补丁,勾选开发预览,提交,发布新补丁。(根据自己需求来,选择发布方式都由根据自己的需求进行控制)