App的热更新JSPatch的使用

作者: 鸟人扎墨客 | 来源:发表于2016-08-29 17:20 被阅读199次

    情景假设

    众所周知苹果的审核机制非常的严格,虽然现在审核时间缩短了,但是从提交到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。

    参考文章

    相关文章

      网友评论

        本文标题:App的热更新JSPatch的使用

        本文链接:https://www.haomeiwen.com/subject/vhzxettx.html