使用react-native-code-push热更新

壤驷向明
2023-12-01

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.");
                    }
                );
            }
        })
    };
 类似资料: