CodePush 是微软提供的一套用于热更新 React Native 和 Cordova 应用的服务。

CodePush简介

CodePush 是微软提供的一套用于热更新 React Native 和 Cordova 应用的服务。
CodePush 是提供给 React Native 和 Cordova 开发者直接部署移动应用更新给用户设备的云服务。
CodePush 作为一个中央仓库,开发者可以推送更新 (JS, HTML, CSS and images),
应用可以从客户端 SDK 里面查询更新。CodePush 可以让应用有更多的可确定性,
也可以让你直接接触用户群。在修复一些小问题和添加新特性的时候,不需要经过二进制打包,
可以直接推送代码进行实时更新。
CodePush 可以进行实时的推送代码更新:

  • 直接对用户部署代码更新
  • 管理 Alpha,Beta 和生产环境应用
  • 支持 React Native 和 Cordova
  • 支持JavaScript 文件与图片资源的更新
  • 暂不支持增量更新
    支持的平台:
  • iOS (7+)
  • Android (4.1+)
  • Windows (UWP)

目前只支持react native到0.35版本;
Github地址:https://github.com/Microsoft/react-native-code-push
微软地址:http://microsoft.github.io/code-push/

安装部署(Android)

##安装CodePush

npm install -g code-push-cli

##注册CodePush

code-push register

执行后会打开浏览器页面,如下:
图片
选择一个账户类型登录。
可使用github账户和微软账户
授权后,会提供key:
图片
将key复制到控制台:
图片
输入后,会提示登录成功,并且账号信息已保存在本机。如要删除登录信息,使用:

code-push logout  

添加项目:

1
2
3
code-push app add <appName>
eg:
code-push app add react-demo

其他相关命令:

1
2
3
4
5
code-push app add 在账号里面添加一个新的app
code-push app remove 或者 rm 在账号里移除一个app
code-push app rename 重命名一个存在app
code-push app list 或则 ls 列出账号下面的所有app
code-push app transfer 把app的所有权转移到另外一个账号

集成到Android

在react native项目根目录下,安装插件:

npm install --save react-native-code-push

配置Android项目

可使用RNPM,或者进行手动配置。在实验过程中发现使用RNPM自动配置会报错。故这里使用手动配置。可研究下自动配置问题。

  • 自动配置
    运行 react-native link react-native-code-push。这条命令将会自动帮我们在anroid文件中添加好设置(但是执行过程会报错)
  • 手动配置
    android/settings.gradle文件中设置如下:
    1
    2
    include ':app', ':react-native-code-push'
    project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')

android/app/build.gradle文件设置如下,添加code-push部分:

1
2
3
4
5
6
7
8
9
10
...
apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
...

...
dependencies {
...
compile project(':react-native-code-push')
}

  • 更改MainApplication.java文件:
  • 引入包:

    1
    import com.microsoft.codepush.react.CodePush;
  • 更改代码部分:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    ...
    //添加此部分
    @Override
    protected String getJSBundleFile() {
    return CodePush.getJSBundleFile();
    }

    @Override
    protected List<ReactPackage> getPackages() {
    //更改此部分,将“deployment-key-here”替换为具体的key。key使用命令:code-push deployment ls <appname> -k进行查看
    return Arrays.<ReactPackage>asList(
    new MainReactPackage(),
    new CodePush("deployment-key-here", MainApplication.this, BuildConfig.DEBUG)
    );
    }
    };

设置应用的版本号

android/app/build.gradle文件
图片
此处的versionName默认为1.0,
需要改为三位数字(code-push使用三位)
此处的版本号,在发布更新的时候设置的版本号跟这里一样。如发布的更新对应的APP的版本号为1.0.1,则发布时填的版本号应为1.0.1

使用

参照插件demo:
https://github.com/Microsoft/react-native-code-push/blob/master/Examples/CodePushDemoApp/demo.js

生成发布包

在根目录下新建目录bundles

生成:

1
2
3
react-native bundle --platform 平台 --entry-file 启动文件 --bundle-output 打包js输出文件 --assets-dest 资源输出目录 --dev 是否调试。
例子:
react-native bundle --platform android --entry-file index.android.js --bundle-output ./bundles/index.android.bundle --dev false

发布

1
2
3
4
code-push release <应用名称> <Bundles所在目录> <对应的应用版本> --deploymentName: 更新环境 。默认为staging
--description: 更新描述 --mandatory: 是否强制更新
例子:
code-push release react-demo ./bundles/index.android.bundle 1.0.0 --deploymentName Production --description "测试" --mandatory true

此处的版本号对应app的版本号,并不是更新文件的版本号。

部署的更多命令:

1
2
3
4
5
6
code-push deployment add 部署
code-push deployment rename 重命名
code-push deployment rm 删除部署
code-push deployment ls 列出应用的部署情况
code-push deployment ls -k 查看部署的key
code-push deployment history 查看历史版本(Production 或者 Staging)

4.具体的API使用参考官方文档

注意事项

1.如果使用对话框提示,第一次更新时只能强制更新,需要配置强制更新的提示信息。

搭建code-push服务器

https://github.com/lisong/code-push-server/blob/master/docs/react-native-code-push.md
https://github.com/lisong/code-push-server

本文地址: http://gehaiqing.com/2016/11/20/react-native-code-push/