文章部份内容参考:http://www.javashuo.com/article/p-zpcjhzti-bv.htmlhtml
可是我在这个基础上进行了补充java
code-push已经迁移到 APP Center node
-------------- react
React Native的出现为移动开发领域带来了两大革命性的创新:android
本文将向你们分享React Natvie应用部署/动态更新方面的内容。ios
React Native支持你们用React Native技术开发APP,并打包生成一个APP。在动态更新方面React Native只是提供了动态更新的基础,对将应用部署到哪里,如何进行动态更新并无支持的那么完善。好在微软开发了CodePush,填补React Native 应用在动态更新方面的空白。CodePush 是微软提供的一套用于热更新 React Native 和 Cordova 应用的服务。下面将向你们分享如何使用CodePush实时更新你的应用,后期会分享不采用CodePush,如何本身去实现React Native应用热更新。git
CodePush 是微软提供的一套用于热更新 React Native 和 Cordova 应用的服务。
CodePush 是提供给 React Native 和 Cordova 开发者直接部署移动应用更新给用户设备的云服务。CodePush 做为一个中央仓库,开发者能够推送更新 (JS, HTML, CSS and images),应用能够从客户端 SDK 里面查询更新。CodePush 可让应用有更多的可肯定性,也可让你直接接触用户群。在修复一些小问题和添加新特性的时候,不须要通过二进制打包,能够直接推送代码进行实时更新。github
CodePush 能够进行实时的推送代码更新:shell
CodePush开源了react-native版本,react-native-code-push托管在GitHub上。npm
使用CodePush以前首先要安装CodePush客户端。本文以OSX 10.11.5做为平台进行演示。
管理 CodePush 帐号须要经过 NodeJS-based CLI。
只须要在终端输入 npm install -g code-push-cli
,就能够安装了。
安装完毕后,输入 code-push -v
查看版本,如看到版本表明成功。
目前个人版本是 2.1.9
PS. npm
为NodeJS的包管理器,若是你没安装NodeJS请先安装。(关于nodejs、npm详细讲解及安装)
在终端输入code-push register
,会打开以下注册页面让你选择受权帐号,其实也就是跳转到官网https://appcenter.ms/sign-in
能够选择用微软帐号登陆或GitHub帐号登陆
经过以后,code-push会告诉你 “access key”,复制到终端完成注册。
而后终端输入code-push login
进行登录,登录成功后,你的session文件将会写在 /Users/你的用户名/.code-push.config
PS.相关命令
code-push login
登录code-push loout
注销code-push access-key ls
列出登录的tokencode-push access-key rm <accessKye>
删除某个 access-key为了让CodePush服务器知道你的app,咱们须要向它注册app: 在终端输入code-push app add <appName>
便可完成注册。
注册完成以后会返回一套deployment key,该key在后面步骤中会用到。
心得:若是你的应用分为Android和iOS版,那么在向CodePush注册应用的时候须要注册两个App获取两套deployment key,如:
PS.相关命令
code-push app add
在帐号里面添加一个新的appcode-push app remove
或者 rm 在帐号里移除一个appcode-push app rename
重命名一个存在appcode-push app list
或则 ls 列出帐号下面的全部appcode-push app transfer
把app的全部权转移到另一个帐号
下面咱们经过以下步骤在Android项目中集成CodePush。
第一步:在项目中安装 react-native-code-push插件,终端进入你的项目根目录而后运行npm install --save react-native-code-push
第二步:在Android project中安装插件。
CodePush提供了两种方式:RNPM 和 Manual,本次演示所使用的是RNPM。
运行npm i -g rnpm
,来安装RNPM。
在React Native v0.27及之后版本RNPM已经被集成到了 React Native CL中,就不须要再进行安装了。
第三步: 运行 rnpm link react-native-code-push
。这条命令将会自动帮咱们在anroid文件中添加好设置。iOS、Android都配好了 successful linked ,下面的步骤已经自动完成了你只检查下就行。
在终端运行此命令以后,终端会提示让你输入deployment key,这是你只需将你的deployment Staging key输入进去便可,若是不输入则直接单击enter跳过便可。
第四步: 在 android/app/build.gradle文件里面添以下代码:
from: "../../node_modules/react-native-code-push/android/codepush.gradle"apply
而后在/android/settings.gradle中添加以下代码:
include ':react-native-code-push'project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')
第五步: 运行 code-push deployment ls -k <appName>
获取 部署秘钥。默认的部署名是 staging,因此 部署秘钥(deployment key ) 就是 staging
第六步: 添加配置。当APP启动时咱们须要让app向CodePush咨询JS bundle的所在位置,这样CodePush就能够控制版本。更新 MainApplication.java文件:
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
protected String getJSBundleFile() {
// gradlew assembleRelease会把全部用到的JavaScript代码都打包内置到APK中
if (BuildConfig.IS_CODE_PUSH) {
return CodePush.getJSBundleFile(); // code-push热更新
}
return UpdateContext.getBundleUrl(MainApplication.this); // pushy热更新
}
// 设置为 true 将不弹出 toast
private boolean SHUTDOWN_TOAST = false;
// 设置为 true 将不打印 log
private boolean SHUTDOWN_LOG = false;
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new RNFetchBlobPackage(),
new WeChatPackage(),
new UpdatePackage(),
new RNDeviceInfo(),
new RNI18nPackage(),
new RNCWebViewPackage(),
new RNGestureHandlerPackage(),
new WeChatPackage(),
new ReactVideoPackage(),
new VectorIconsPackage(),
new SplashScreenReactPackage(),
new LinearGradientPackage(),
new ImagePickerPackage(),
new JPushPackage(SHUTDOWN_TOAST, SHUTDOWN_LOG),
new CodePush(BuildConfig.CODE_PUSH_KEY, MainApplication.this, BuildConfig.DEBUG)
);
}
@Override
protected String getJSMainModuleName() {
return "index";
}
};
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
}
}
热更新有两张方案 中文社区提供的Pushy 和 微软提供CodePush
关于deployment-key的设置 (关于Grande)
在上述代码中咱们在建立CodePush实例的时候须要设置一个deployment-key,由于deployment-key分生产环境与测试环境两种,因此建议你们在build.gradle中进行设置。在build.gradle中的设置方法以下:
打开android/app/build.gradle文件,找到android { buildTypes {} }
而后添加以下代码便可:
buildTypes {
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.config
buildConfigField "String", "CODE_PUSH_KEY", CODE_PUSH_KEY_PRODUCTION
buildConfigField "boolean", "IS_CODE_PUSH", "true"
}
debug {
buildConfigField "String", "CODE_PUSH_KEY", CODE_PUSH_KEY_STAGING
buildConfigField "boolean", "IS_CODE_PUSH", "true"
}
}
心得:另外,咱们也能够将deployment-key存放在gradle.properties中:
# gradle.properties专门用来配置全局键值对数据的
# 将它从git版本控制中排除不用担忧keystore文件等敏感信息泄漏
# BuildConfig或代码中应用取值 ${KEY}
MYAPP_RELEASE_STORE_FILE=./keystores/release.keystore
MYAPP_RELEASE_KEY_ALIAS=release
MYAPP_RELEASE_STORE_PASSWORD=111111
MYAPP_RELEASE_KEY_PASSWORD=111111
VERSION_CODE=6
VERSION_NAME=1.0.0
CODE_PUSH_KEY_PRODUCTION="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
CODE_PUSH_KEY_STAGING="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
在android/app/build.gradle设置好deployment-key以后呢,咱们就能够这样使用了:
@Override
protected String getJSBundleFile() {
// gradlew assembleRelease会把全部用到的JavaScript代码都打包内置到APK中
if (BuildConfig.IS_CODE_PUSH) {
return CodePush.getJSBundleFile(); // code-push热更新
}
return UpdateContext.getBundleUrl(MainApplication.this); // pushy热更新
}
第七步:修改versionName。
在 android/app/build.gradle中有个 android.defaultConfig.versionName属性,咱们须要把 应用版本改为 1.0.0(默认是1.0,可是codepush须要三位数)。
至此Code Push for Android的SDK已经集成完成。
CodePush官方提供RNPM、CocoaPods与手动三种在iOS项目中集成CodePush的方式,接下来我就以RNPM的方式来说解一下如何在iOS项目中集成CodePush。
第一步:在项目中安装react-native-code-push插件,终端进入你的项目根目录而后运行
native-code-pushnpm install --save react-
第二步: 运行 rnpm link react-native-code-push
。这条命令将会自动帮咱们在ios中添加好设置。
在终端运行此命令以后,终端会提示让你输入deployment key,这是你只需将你的deployment Staging key输入进去便可,若是不输入则直接单击enter跳过便可。
关于deployment-key的设置
在咱们想CodePush注册App的时候,CodePush会给咱们两个deployment-key分别是在生产环境与测试环境时使用的,咱们能够经过以下步骤来设置deployment-key。
----------------------
先讲一下Xcode配置相关知识
配置分为Project和Target,一个Project能够包含多个Target,每一个Target能够定义不一样的配置,也就是Project的配置整个项目通用,Target的配置优先级较高,是集成自Project
例如:公司有两套环境 测试test 和 线上prod,那么我能够定义两个 superbuy-test 、superbuy-prod (这是一种解决方案固然还有其余的作法,例如预编译宏 BETA 等...)
rnpm link以后code-push-key配置在了Info.plist文件中(Info.plist至关于Android中的清单文件AndroidMainFest.xml)
如何让code-push-key自动区分测试环境仍是正式环境能?
Xcode中 User Defined 登场
问题来了:是配置在Project中仍是Target中?
答案是均可以,其实你copy一个target,会生成两个Info.plist文件,因此我选择配置在target中
----------------------
1.用Xcode 打开项目 ➜ Xcode的项目导航视图中的PROJECT
下选择你的Target ➜
选择Build Settings
页签 ➜ 单击 + 按钮而后选择添加User-Defined Setting
2.而后输入CODE_PUSH_KEY(名称能够自定义)
提示:你能够经过
code-push deployment ls -k <APP_NAME> -k
命令来查看deployment key。
3.打开 Info.plist文件,在CodePushDeploymentKey列的Value中输入$(CODE_PUSH_KEY)
4.AppDelegate设置jsLocationPath,因为是兼容pushy和code-push,因此两种热更新方式能够切换
怎么切换?添加预编译宏
配置 IS_CODE_PUSH=1
but 编译失败
有两个文件同样的命名,由于Objective-C一直没有Java中Package的概念,因此对于命名空间开发者都很无奈,都是经过加前缀来区别保证不一样名
这是因为Pushy和code-push都引用到了SSZipArchive(三方解压神器SSZipArchive)
虽然Google Play和内部分布式应用程序(例如Enterprise,Fabric,HockeyApp)对如何使用CodePush发布更新没有限制,但iOS App Store及其相应的指南在您将解决方案集成到您的内容以前,应该注意更准确的规则。应用。
第3.3.2段,自2015年以来,Apple开发者计划许可协议彻底容许对JavaScript和资产进行无线更新 - 在此处可下载的最新版本(20170605)中,这一裁决更为普遍:
解释的代码能够下载到应用程序,但只要这样的代码:(a)不会经过提供与提交给App的应用程序的预期和广告目的不一致的特性或功能来改变应用程序的主要目的。存储,(b)不为其余代码或应用程序建立商店或店面,而且(c)不绕过操做系统的签名,沙箱或其余安全功能。
CodePush容许您彻底听从这些规则,只要您推送的更新不会使您的产品与其原始App Store批准的意图明显不一样。
为了进一步遵照Apple的指导原则,咱们建议App Store分发的应用程序updateDialog
在调用时不启用该选项sync
,由于在App Store Review Guidelines中,它写成:
应用不得强制用户对应用评分,审核应用,下载其余应用或其余相似操做,以便访问应用的功能,内容或使用。
这不必定是这种状况updateDialog
,由于它不会强迫用户下载新版本,但至少若是你决定展现它,你应该知道这个裁决。
在使用CodePush更新你的应用以前须要,先配置一下更新控制策略,即:
最简单的方式是在根component中进行上述策略控制。
import codePush from 'react-native-code-push'
componentDidMount
中调用 sync
方法,后台请求更新 codePush.sync()// 第一种:
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
当应用从后台返回时
若是能够进行更新,CodePush会在后台静默地将更新下载到本地,等待APP下一次启动的时候应用更新,以确保用户看到的是最新版本。
若是更新是强制性的,更新文件下载好以后会当即进行更新。
若是你指望更及时的得到更新,能够在每次APP从后台进入前台的时候去主动的检查更新:
在应用的根component的componentDidMount
中添加以下代码:
"change", (newState) => {newState === "active" && codePush.sync();});AppState.addEventListener(
CodePush支持两种发布更新的方式,一种是经过code-push release-react
简化方式,另一种是经过code-push release
的复杂方式。
第一种方式:经过
code-push release-react
发布更新
这种方式将打包与发布两个命令合二为一,能够说大大简化了咱们的操做流程,建议你们多使用这种方式来发布更新。
命令格式:
code-push release-react <appName> <platform>
eg:
再来个更高级的:
code-push release-react MyApp-iOS ios --t 1.0.0 --dev false --d Production --des "1.优化操做流程" --m true
其中参数--t为二进制(.ipa与apk)安装包的的版本;--dev为是否启用开发者模式(默认为false);--d是要发布更新的环境分Production与Staging(默认为Staging);--des为更新说明;--m 是强制更新。
关于code-push release-react
更多可选的参数,能够在终端输入code-push release-react
进行查看。
release-react
经常使用命令
# Release a mandatory update with a changelog 强制更新包 code-push release-react MyApp-iOS ios -m --description "Modified the header color" # Release an update for an app that uses a non-standard entry file name, and also capture # the sourcemap file generated by react-native bundle code-push release-react MyApp-iOS ios --entryFile MyApp.js --sourcemapOutput ../maps/MyApp.map # Release a dev Android build to just 1/4 of your end users 灰度测试覆盖25%的用户 code-push release-react MyApp-Android android --rollout 25% --dev true # Release an update that targets users running any 1.1.* binary Android版本在1.1.*的用户会获得更新,其余的版本不会更新 code-push release-react MyApp-Android android --targetBinaryVersion "~1.1.0"
CodePush客户端支持差别更新,所以即便您在每次更新时发布JS包和资源,您的最终用户也只会实际下载所需的文件。
有关release-react
命令如何工做的更多详细信息,以及它公开的各类参数,请参阅CLI文档。此外,若是您但愿本身处理react-native bundle
命令,所以须要更灵活的解决方案release-react
,请参阅release
命令以获取更多详细信息。
另外,咱们能够经过code-push deployment ls <appName>
来查看发布详情与这次更新的安装状况。
第二中方式:经过
code-push release
发布更新
code-push release
发布更新呢咱们首先须要将js与图片资源进行打包成 bundle。
发布更新以前,须要先把 js打包成 bundle,如:
第一步: 在 工程目录里面新增 bundles文件:mkdir bundles
第二步: 运行命令打包 react-native bundle --platform 平台 --entry-file 启动文件 --bundle-output 打包js输出文件 --assets-dest 资源输出目录 --dev 是否调试
。
eg:react-native bundle --platform android --entry-file index.android.js --bundle-output ./bundles/index.android.bundle --dev false
须要注意的是:
打包bundle结束后,就能够经过CodePush发布更新了。在终端输入code-push release <应用名称> <Bundles所在目录> <对应的应用版本> --deploymentName: 更新环境 --description: 更新描述 --mandatory: 是否强制更新
eg:code-push release GitHubPopular ./bundles/index.android.bundle 1.0.6 --deploymentName Production --description "1.支持文章缓存。" --mandatory true
注意:
因此若是咱们要对某一个应用版本进行屡次更新,只须要上传与上次不一样的bundle/images便可。如:
eg:
对1.0.6的版本进行第一次更新:code-push release GitHubPopular ./bundles/index.android.bundle 1.0.6 --deploymentName Production --description "1.支持文章缓存。" --mandatory true
对1.0.6的版本进行第二次更新:code-push release GitHubPopular ./bundles/index.android.bundle 1.0.6 --deploymentName Production --description "1.新添加收藏功能。" --mandatory true
code-push deployment history <appName> Staging
能够看到Staging版本更新的时间、描述等等属性。code-push release Equipment ./bundles 1.0.1
下面咱们启动事先安装好的应用,看有什么反应:
更多部署APP相关命令
查看这些日志的最简单方法是运行code-push debug
您当前使用的特定平台的命令(例如code-push debug ios
)。这将输出一个日志流,该日志流将被过滤为指定平台的CodePush消息。这样能够轻松识别问题,无需使用特定于平台的工具,也能够轻松浏览大量日志。
此外,若是您对它们更熟悉,您还可使用任何特定于平台的工具来查看CodePush日志。简单启动Chrome DevTools控制台,Xcode控制台(iOS),OS X控制台(iOS)和/或ADB logcat(Android),并查找带有前缀的消息[CodePush]
。
请注意,默认状况下,在发布版本中iOS上禁用了React Native日志,所以若是要在发布版本中查看它们,则须要对AppDelegate.m
文件进行如下更改:
添加一个#import <React/RCTLog.h>
声明。对于RN <v0.40,请使用:#import "RCTLog.h"
将如下语句添加到application:didFinishLaunchingWithOptions
方法的顶部:
RCTSetLogThreshold(RCTLogLevelInfo);
其实咱们能够将这些API分为两类,一类是自动模式,一类是手动模式。
sync
为自动模式,调用此方法CodePush会帮你完成一系列的操做。其它方法都是在手动模式下使用的。
codePush.sync codePush.sync(options: Object, syncStatusChangeCallback: function(syncStatus: Number), downloadProgressCallback: function(progress: DownloadProgress)): Promise<Number>;
经过调用该方法CodePush会帮咱们自动完成检查更新,下载,安装等一系列操做。除非咱们须要自定义UI表现,否则直接用这个方法就能够了。
sync方法,提供了以下属性以容许你定制sync方法的默认行为
installMode
为InstallMode.ON_NEXT_RESUME
状况下有效。codePush.allowRestart
codePush.allowRestart(): void;
容许从新启动应用以完成更新。
若是一个CodePush更新将要发生而且须要重启应用(e.g.设置了InstallMode.IMMEDIATE模式),但因为调用了disallowRestart
方法而致使APP没法经过重启来完成更新,
能够调用此方法来解除disallowRestart
限制。
但在以下四种状况下,CodePush将不会当即重启应用:
disallowRestart
被调用,没有新的更新。installMode
为InstallMode.ON_NEXT_RESTART
的状况下。installMode
为InstallMode.ON_NEXT_RESUME
,而且程序一直处于前台,并无从后台切换到前台的状况下。disallowRestart
被调用,没有再调用restartApp
。codePush.checkForUpdate
codePush.checkForUpdate(deploymentKey: String = null): Promise<RemotePackage>;
向CodePush服务器查询是否有更新。
该方法返回Promise,有以下两种值:
null 没有更新
一般有以下状况致使RemotePackage为null:
A RemotePackage instance
有更新可供下载。
eg:
(update) => {if (!update) {console.log("The app is up to date!");} else {console.log("An update is available! Should we download it?");}});codePush.checkForUpdate().then(
codePush.disallowRestart
codePush.disallowRestart(): void;
不容许当即重启用于以完成更新。
eg:
class OnboardingProcess extends Component {...componentWillMount() {// Ensure that any CodePush updates which are// synchronized in the background can't trigger// a restart while this component is mounted.codePush.disallowRestart();}componentWillUnmount() {// Reallow restarts, and optionally trigger// a restart if one was currently pending.codePush.allowRestart();}...}
codePush.getUpdateMetadata codePush.getUpdateMetadata(updateState: UpdateState = UpdateState.RUNNING): Promise<LocalPackage>;
获取当前已安装更新的元数据(描述、安装时间、大小等)。
eg:
// Check if there is currently a CodePush update running, and if// so, register it with the HockeyApp SDK (https://github.com/slowpath/react-native-hockeyapp)// so that crash reports will correctly display the JS bundle version the user was running.codePush.getUpdateMetadata().then((update) => {if (update) {hockeyApp.addMetadata({ CodePushRelease: update.label });}});// Check to see if there is still an update pending.codePush.getUpdateMetadata(UpdateState.PENDING).then((update) => {if (update) {// There's a pending update, do we want to force a restart?}});
codePush.notifyAppReady codePush.notifyAppReady(): Promise<void>;
通知CodePush,一个更新安装好了。当你检查并安装更新,(好比没有使用sync方法去handle的时候),这个方法必须被调用。不然CodePush会认为update失败,并rollback当前版本,在app重启时。
当使用sync
方法时,不须要调用本方法,由于sync
会自动调用。
codePush.restartApp codePush.restartApp(onlyIfUpdateIsPending: Boolean = false): void;
当即重启app。
当如下状况时,这个方式是颇有用的:
sync
或 LocalPackage.install
方法时,指定的 install mode
是 ON_NEXT_RESTART
或 ON_NEXT_RESUME时
。 这两种状况都是当app重启或resume
时,更新内容才能被看到。代码签名是一种为捆绑建立数字签名的方法,之后能够在安装以前在客户端进行验证。
开发人员想知道他们发布的代码是他们编写的代码。代码签名是提供此类保证的主要机制,能够帮助减轻或消除一大类中间人攻击。
首先,开发人员生成一个非对称密钥对:私钥将用于签署捆绑包; 捆绑签名验证的公钥。该CodePush CLI而后使用私钥签名过程当中捆绑release
,release-react
并release-cordova
命令。公钥随移动应用程序一块儿提供。控制密钥的生成和管理掌握在开发人员手中。
在release命令结束时,cli计算bundle的内容哈希并将此值放入使用私钥签名的JWT中。当codepush插件将包下载到设备时,它会检查.codepushrelease
包含JWT 的文件,并使用公钥验证JWT签名。若是验证失败,则不会安装更新。
代码签名支持用于签名的PEM编码的RSA密钥(非证书)。您能够经过openssl生成它们,以下所示:
#生成私有RSA密钥并将其写入private.pem文件
openssl genrsa -out private.pem
#将private.pem中的公钥导出到public.pem
openssl rsa -pubout -in private.pem -out public.pem
操做步骤:
--privateKeyPath
(或简称-k
)参数值eg:
code-push release-react superbuy-android android --t 1.0.0 --des "test android code-push,带有公钥签名的更新包要加上参数-privateKeyPath指定私钥路径" -k ./private.pem-----------------------------
关于代码签名常见错误
这是由于发布更新时没有指定-k参数,私钥位置
code-push release-react superbuy-android android --t 1.0.0 --des "test android code-push,带有公钥签名的更新包要加上参数-privateKeyPath指定私钥路径" -k ./private.pem
上文已经介绍了CodePush在动态更新方面的一些特性,但CodePush也存在着一些缺点:
------------------
code-push经常使用命令
安装: npm install -g code-push-cli
注册帐号: code-push register
登录: code-push login
注销: code-push logout
添加项目: code-push app add [app名称]
删除项目: code-push app remove [app名称]
列出帐号下的全部项目: code-push app list
显示登录的token: code-push access-key ls
删除某个access-key: code-push access-key rm <accessKey>
添加协做人员:code-push collaborator add <appName> next@126.com
部署一个环境: code-push deployment add <appName> <deploymentName>
删除部署: code-push deployment rm <appName>
列出应用的部署: code-push deployment ls <appName>
查询部署环境的key: code-push deployment ls <appName> -k
查看部署的历史版本信息: code-push deployment history <appName> <deploymentName>
重命名一个部署: code-push deployment rename <appName> <currentDeploymentName> <newDeploymentName>
---------------
实际发布更新时经常使用操做步骤
登陆: code-push login
列出帐号下的全部项目: code-push app list
列出应用的部署: code-push deployment ls MyApp
查看部署的历史版本信息: code-push deployment history MyApp Staging
发布版本更新: code-push release-react MyApp ios -d Staging --des 'UI调整' --t '1.0.0'
把更新推到另外一个环境: code-push promote MyApp Staging Production
---------------
参考:
https://docs.microsoft.com/en-us/appcenter/distribution/codepush/
https://github.com/Microsoft/react-native-code-push