CodePush 是微软提供的一套用于热更新 React Native 和 Cordova 应用的服务。
CodePush 是提供给 React Native 和 Cordova 开发者直接部署移动应用更新给用户设备的云服务。CodePush 作为一个中央仓库,开发者可以推送更新 (JS, HTML, CSS and images),应用可以从客户端 SDK 里面查询更新。CodePush 可以让应用有更多的可确定性,也可以让你直接接触用户群。在修复一些小问题和添加新特性的时候,不需要经过二进制打包,可以直接推送代码进行实时更新。
首先就是相关的命令:
code-push register 创建code-push账号
code-push login 登陆
code-push loout 注销
code-push access-key ls 列出登陆的token
code-push access-key rm <accessKye> 删除某个 access-key
code-push app add 在账号里面添加一个新的app
code-push app add MyApp-Android android react-native
code-push app add MyApp-Ios ios react-native
code-push app remove 或者 rm 在账号里移除一个app
code-push app rename 重命名一个存在app
code-push app list 或则 ls 列出账号下面的所有app
code-push app transfer 把app的所有权转移到另外一个账号
code-push release-react发布更新
code-push release-react MyApp-iOS ios
code-push release-react MyApp-Android android
code-push deployment add <appName> 部署
code-push deployment rename <appName> 重命名
code-push deployment rm <appName> 删除部署
code-push deployment ls <appName> 列出应用的部署情况
code-push deployment ls <appName> -k 查看部署的key
code-push deployment history <appName> Staging 可以看到Staging版本更新的时间、描述等等属性
一般情况下通过
npm install --save react-native-code-push
就可以直接安装了(同时要注意自己的版本是否对应)
别忘记了下面这一步,,不然会执行失败的
react-native link react-native-code-push
在 android/app/build.gradle中有个 android.defaultConfig.versionName属性,我们需要把 应用版本改成 1.0.0(默认是1.0,但是codepush需要三位数)。
android{
defaultConfig{
versionName "1.0.0"
}
}
其次设置更新策略:
什么时候检查更新?(在APP启动的时候?在设置页面添加一个检查更新按钮?)
什么时候可以更新,如何将更新呈现给终端用户?
所以如果我们要对某一个应用版本进行多次更新,只需要上传与上次不同的bundle/images即可。
对1.0.6的版本进行第一次更新:
code-push release <appName>./bundles/index.android.bundle 1.0.6 --deploymentName Production --description "1.支持文章缓存。" --mandatory true
对1.0.6的版本进行第二次更新:
code-push release <appName>./bundles/index.android.bundle 1.0.6 --deploymentName Production --description "1.新添加收藏功能。" --mandatory true
JavaScript API Reference
allowRestart
checkForUpdate
disallowRestart
getUpdateMetadata
notifyAppReady
restartApp
sync
checkUpdate = () => {
codePush.checkForUpdate(this.state.appKey).then((update) => {
if (!update) {
} else {
codePush.sync({
deploymentKey: this.state.appKey,
updateDialog: {
optionalIgnoreButtonLabel: '稍后',
optionalInstallButtonLabel: '立即更新',
optionalUpdateMessage: '有新版本了,是否更新?',
title: '更新提示'
},
installMode: codePush.InstallMode.IMMEDIATE,
},
(status) => {
switch (status) {
case codePush.SyncStatus.DOWNLOADING_PACKAGE:
break;
case codePush.SyncStatus.INSTALLING_UPDATE:
break;
}
},
(progress) => {
console.log(progress.receivedBytes + " of " + progress.totalBytes + " received.");
}
);
}
})
};