# code-push是什么?

CodePush 是一个微软开发的云服务器。

# 为什么使用code-push?

支持Apache Cordova和React Native移动应用的热更新功能,本文只涉及cordova

# Appcenter

  1. Cordova codepush 借助appcenter平台,首先要下载appcenter-cli
npm install -g appcenter-cli
  1. 成功安装appcenter-cli后,执行appcenter login命令为您的App Center帐户详细信息配置CLI。
  2. appcenter (opens new window)中创建应用
  3. 创建deployment key
appcenter codepush deployment add -a <groupName>/<appname> Staging //测试环境
appcenter codepush deployment add -a <groupName>/<appname> Production //生产环境

# appcenter-cli(非必要)

以下内容是appcenter-cli的扩展,并不是使用code-push的必要条件,不想看的可以直接查看将CodePush添加到你的程序

# 创建应用

appcenter apps create -d <appDisplayName> -o <operatingSystem>  -p <platform> 
// 例如:
appcenter apps create -d MyApp-Android -o Android -p React-Native
appcenter apps create -d MyApp-iOS -o iOS -p Cordova

# 添加deployments(部署)

默认appcenter没有deployments,需要手动创建,没有数量限制。

appcenter codepush deployment add -a <ownerName>/<appName> Staging
appcenter codepush deployment add -a <ownerName>/<appName> Production

# 删除修改deployment

// 删除
appcenter codepush deployment remove -a <ownerName>/<appName> <deploymentName>
// 修改
appcenter codepush deployment rename -a <ownerName>/<appName> <deploymentName> <newDeploymentName>

# 查看应用已有的deployments

appcenter codepush deployment list -a <ownerName>/<appName>

尾部追加-k,可以查看所有的key

appcenter codepush deployment list -a <ownerName>/<appName> -k

# 修改应用名称

appcenter apps update -n <newName> -a <ownerName>/<appName>

该应用程序的名称仅旨在从管理方面进行识。由于更新查询是通过部署密钥进行的,因此它实际上不会影响正在运行的应用程序。

# 删除应用

appcenter apps delete -a <ownerName>/<appName>

# 查看所有应用

appcenter apps list

# 将CodePush添加到你的程序

需要:

  • cordova5.0.0+
  • Android (cordova-android 4.0.0+)
  • iOS (cordova-ios 3.9.0+)

查看当前应用platform版本:

cordova platform ls

安装cordova-plugin-code-push插件:

cordova plugin add cordova-plugin-code-push@latest

设置config.xml文件:

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

为确保您的应用可以访问CodePush服务器,在index.html文件中添加meta标签如下:

// 官网提供的csp规则在调用第三方接口时会被禁止
- <meta http-equiv="Content-Security-Policy" content="default-src https://codepush.appcenter.ms 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *" />
// 推荐使用该规则
+ <meta http-equiv="Content-Security-Policy" content="default-src https://codepush.azurewebsites.net 'self' data: gap: cdvfile: https://ssl.gstatic.com 'unsafe-eval' 'unsafe-inline' https: http: wss: ws:; style-src 'self' 'unsafe-inline'; img-src * filesystem: cdvfile: data:; media-src * blob:">

# 插件使用

最简单的方式,是在deviceready事件中添加:

codePush.sync(); //静默更新

当然,更新的时机可以根据自己需求进行选择

# 发布更新

发布指令集成了cordova prepare操作,更新本地文件后就可以直接运行release-cordova

// 更新之后客户端会在下次启动时进行更新检测,这取决于你检测更新的时机。 
appcenter codepush release-cordova -a <ownerName>/MyApp -d Production  
//发布应用
appcenter code-push release-cordova -a <ownerName>/MyApp [options]
 Options参数:
[-t|--target-binary-version <targetBinaryVersion>]
[--is-release-build-type]
[-b|--build]
[-r|--rollout <rolloutPercentage>]
[--disable-duplicate-release-error]
[-k|--private-key-path <privateKeyPath>]
[-m|--mandatory] // 指定此版本是否为强制更新版本,从服务端下载完代码,会立即自动重启app
[-x|--disabled]
[--description <描述>]
[-d|--deployment-name <指定部署的类型>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
[-v|--version]
  注意:一般生产环境的app是压缩过的,所以在发布正式环境热更新之前,先压缩代码

客户端只能发现和下载deployment中最新的50条

# 查看发布历史

appcenter codepush deployment history -a <ownerName>/<appName> <deploymentName>

# 清除发布历史

此操作不可逆,不建议使用在生产环境

appcenter codepush deployment clear -a <ownerName>/<appName> <deploymentName>

# codePush API

其他API未记录,可以前往API Reference (opens new window)查看

属性 说明 参数
getCurrentPackage 获取当前版本,会返回俩种值,一种是null,在用户没有热更新过,或者安装了新客户端时出现,还有一种是LocalPackage onSuccess,onError
checkForUpdate 询问CodePush服务是否已配置的应用程序部署具有可用的更新 onSuccess,onError

checkForUpdate onSuccess接受参数remotePackage,返回的具体数据 参考 (opens new window)

# 问题

# 无法发起更新请求?

corodva创建的模板自身是带一个http-equiv="Content-Security-Policy"的meta标签的:

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

我在其之下添加了:

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

发现这样是无效的,把模板自带的那个去掉后可以正常使用。

也有可能是因为微软服务器不稳定导致的,可以添加vconsole在移动端应用查看网络调用返回

# 参考

  1. CodePush (opens new window)
  2. Cordova Client SDK (opens new window)
  3. Releasing CodePush updates using the App Center CLI (opens new window)
  4. Cordova Appcenter 应用整理 (opens new window)