移动端热更新部署方案

作者: 合欢猪 | 来源:发表于2019-03-28 11:38 被阅读35次

    前言

    目前采用的热更新方案是微软提供的( cordova-plugin-code-push ),大平台,稳定性等方面更可靠。
    本文也主要是通过以下方面进行介绍:

    • mac环境搭建
    • 热更新服务器连接
    • 常用命令介绍
    • app环境部署
    • 部分用法介绍

    一、环境部署及实现

    1、mac端环境准备

    全局安装code-push-cli

    npm install -g code-push-cli
    

    注:code-push-cli是连接热更新服务端的工具,我们把要更新的代码上传至服务端,客户端(我们的app)安装cordova-plugin-code-push插件来从服务端下载代码.

    2、登录热更新服务端

    主要流程:

    2.1、命令行登录code-push服务器

    code-push login 
    //扩展
    //注销登录
    code-push loout
    

    该命令会打开浏览器窗口让我们登录code-push服务端

    2.2、登录成功后会获取授权token

    此处用github登录,成功后会返回一个授权token,复制此token

    2.3、终端输入授权token

    token作用是将来与服务端做校验,将获取到的token复制到命令行,回车则登录成功, 至此,code-push服务端算是登录成功了。

    //扩展
    //列出登录的token
    code-push access-key ls
    //删除某个token
    code-push access-key rm <accessKey>
    

    3、code-push 命令介绍

    此处先介绍api,伴随api强调注意事项:

    3.1、给app在热更新服务端创建应用

    code-push app add <appName> <os> <platform>
    

    eg> code-push app add test-ios ios cordova

    • <appName> : 应用在服务端名称(建议以app名称加"android"或"ios"后缀,以防忘记)
    • <os> : 应用所属系统 (ios \ android),全小写
    • <platform> : 平台名称 ,此处都为 cordova

    注意事项:

    注意的是服务端在创建应用的时候会默认为每个应用生成两种部署类型("Production"和"Staging"),这两种类型分别代表生产环境和开发环境,一定要记下该过程中生成的这四个key值,key是用来连接客户端和服务端的,此处以Staging举例:

    Staging案例

    3.2、删除应用

    code-push app rm <appName>
    

    3.3、查看热更新服务端上创建的应用

    code-push app list
    

    3.4、发布应用

    code-push release-cordova <appName> <platform> [options]
    

    Options参数(常用的几个):

    • --deploymentName(或“-d”),指定部署类型,默认“Staging”,可以选择“Production”或其他;
    • --label(-l),指定标签版本更新,默认最新
    • --description(或“--des”),添加描述;
    • --mandatory(或“-m”),指定是否需要强制更新;
    • --targetBinaryVersion(或“-t”),指定推送版本号
    • --rollout(-r):只支持一定比例的用户安装更新
    • --disabled( -x):将发布更新标记为禁用,这样更新能正常发布,但用户用不了
      案例说明:
    // 1、发布更新
    code-push release-cordova test-ios ios --des "描述"
    // 2、部署“Production”更新
    code-push release-cordova test-ios ios -d "Production" --des  "描述信息"
     // 3、添加强制更新
    code-push release-cordova test-ios ios -m 
    // 4、指定版本推送
    code-push release-cordova test-ios ios --targetBinaryVersion "~1.0.0"
    

    范围规则

     1.2.3 仅仅只有1.2.3的版本
     *所有版本
     1.2.x 主要版本1,次要版本2的任何修补程序版本
     1.2.3 - 1.2.7 1.2.3版本到1.2.7版本
     >=1.2.3 <1.2.7 大于等于1.2.3版本小于1.2.7的版本
     ~1.2.3 大于等于1.2.3版本小于1.3.0的版本
    ^1.2.3 大于等于1.2.3版本小于2.0.0的版本
    

    注意事项:

    • 一般生产环境的包是压缩过的,所以在发布正式热更新环境之前,先执行“cordova build --prod”压缩代码;
    • 用“-m”设置为强制更新后,code-push插件从服务端下载完代码,会立即重启app
    • 每次app发布新应用到商店的时候都应该同时往code-push服务器推送一个初始版本(后续每次提交版本,都会与初始版本比较并生成补丁包)

    3.5、查看部署状态

    code-push deployment list <appName>
    

    eg:

     // 查看test-ios部署状态
    code-push deployment list test-ios
     //查看test-ios部署状态及key值(忘记key值可以这样找)
    code-push deployment list test-ios -k
    

    3.6、清空部署纪录

    code-push deployment clear <appName> <deploymentName>
    

    eg:

    // 清空test-ios 在Staging状态下的部署纪录
    code-push deployment clear test-ios Staging
    

    3.7、添加部署状态

    默认只有“Staging”和“Production”两种状态

    code-push deployment add <appName> <deploymentName>
    
    //eg>
    code-push deployment add test-ios Staging
    

    3.8、删除自定义部署状态

    code-push deployment rm <appName> <deploymentName>
    

    3.9、查看历史版本

    code-push deployment history <appName> <deploymentName> 查看历史版本
    

    3.10、重命名一个部署

    code-push deployment rename <appName> <currentDeploymentName> <newDeploymentName>
    

    3.11、重命名一个已存在app

    code-push app rename 重命名一个存在 app
    

    3.12、把app所有权转移到另一账号

    code-push app transfer
    

    3.13、修改更新

    code-push patch <appName> <deploymentName>  [--label <label>] <options>
    //eg:
    code-push patch myApp Staging  --label v1 --des "修改更新" -m false -x true
    

    3.14、升级环境

    code-push promote <appName> <sourceDeploymentName> <destDeploymentName> <Options>
    //eg:
    //"MyApp"中"Staging"部署的最新更新发布到"Production"部署中
    code-push promote MyApp Staging Production
    

    3.15、回滚更新

    //指定回归到哪个标签,默认回滚到上一个
    //--targetRelease (-r)
    // 不能跨版本回滚
    code-push rollback <appName> <deploymentName> [--targetRelease <releaseLabel>]
    //eg:
    code-push rollback myApp Staging
    

    4、app环境准备

    4.1、进入app目录,安装热更新插件及插件依赖

    cd "app目录"
    cordova plugin add cordova-plugin-code-push
    

    4.2、查看是否安装白名单插件,没有则安装

    // 查看命令
    cordova plugin list
    // 安装命令
    cordova plugin add cordova-plugin-whitelist
    

    4.3、配置config.xml环境代码

    添加如下配置以允许code-push服务器通讯

    <access origin="*"/>
    或者
    <access origin="https://codepush.azurewebsites.net" />
    <access origin="https://codepush.blob.core.windows.net" />
    <access origin="https://codepushupdates.azureedge.net" />
    

    4.4、配置热更新key

    在config.xml中添加deployment key,key和平台是一一对应的

    <platform name="android">
        <preference name="CodePushDeploymentKey" value="YOUR-ANDROID-DEPLOYMENT-KEY" />
    </platform>
    <platform name="ios">
        <preference name="CodePushDeploymentKey" value="YOUR-IOS-DEPLOYMENT-KEY" />
    </platform>
    

    4.5、配置index.html

    在index.html中添加如下代码

    <meta http-equiv="Content-Security-Policy" content="default-src https://codepush.azurewebsites.net 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *" />
    

    目的也是为了允许code-push服务器通讯

    5、code-push api介绍

    5.1、询问code-push服务端是否有更新

    codePush.checkForUpdate(onSuccess, onError?, deploymentKey?: String);
    

    eg:

    codePush.checkForUpdate(function (update) {
        if (!update) {
            console.log("The app is up to date.");
        } else {
            console.log("An update is available! Should we download it?");
        }
    });
    

    6、用法

    6.1、在app deviceready时直接使用

    //一般直接用这个,每次ready后自动获取
    codePush.sync();
    

    6.2、如果希望app能够尽快的获取更新信息,则

    //这个是每次从后台唤醒都会检查更新
    document.addEventListener("resume", function () {
        codePush.sync();
    });
    

    6.3、常用三种更新方案

    如果有发布热更新时 mandatory 则 Code Push 会根据 mandatory 是 true 或false 来控制应用是否强制更新。默认情况下 mandatory 为 false 即不强制更新。mandatory 为 false时以下三种设置方法才有效
     
    // 第一种:
    codePush.sync();
     
    // 第二种:
    codePush.sync({
        updateDialog: false,
        installMode: codePush.InstallMode.IMMEDIATE
    });
     
    // 第三种:
    CodePush.sync({
        deploymentKey: 'deployment-key-here',
        updateDialog: {
            optionalIgnoreButtonLabel: '稍后',
            optionalInstallButtonLabel: '后台更新',
            optionalUpdateMessage: '有新版本了,是否更新?',
            title: '更新提示'
        },
        installMode: CodePush.InstallMode.IMMEDIATE
    });
     
    三种更新的策略: 配置到installMode: 之后即可生效
    * IMMEDIATE 立即更新APP
    * ON_NEXT_RESTART 到下一次启动应用时
    * ON_NEXT_RESUME 当应用从后台返回时
    

    6.4、其他
    官方文档出了不少,好多目前没用到,大家可以看下官方介绍
    官方文档

    二、注意事项

    • 1、app内版本号如果为1.0.0,则热更新打包上传的版本也必须为1.0.0,需要和app保持一致,服务器会根据你最新上传的且版本号和app一致的版本作为最新版本
    • 2、真正集成过程中还需要考虑更新回滚问题,活着指定版本发布,这个需要结合上面api合理搭配处理;

    三、参考文献

    gitHub官方文献
    code-push常用命令

    相关文章

      网友评论

        本文标题:移动端热更新部署方案

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