对于苹果官方对于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("第二次更新");
            },
            })

在这个脚本中,将你需要修改的内容修改就可以了。

最后选择补丁,勾选开发预览,提交,发布新补丁。(根据自己需求来,选择发布方式都由根据自己的需求进行控制)