react-native-code-push集成以及打包更新

code push cli全局安装:

npm install -g code-push-cli 

1.常用命令集

code-push deployment history <appName> Staging

  可以看到Staging版本更新的时间、描述等等属性。 

 eg:

code-push release Equipment ./bundles 1.0.1

code-push的一些常用命令:

code-push login //登录
code-push loout //注销
code-push access-key ls //列出登录的token
code-push access-key rm <accesskey> //删除某个access-key
code-push app add <appName> <os> <platform> // 即可完成注册

关于code-push release-react更多的可选参数,可在终端输入以下查看:

code-push release-react

心得:

如果你的应用分为android和ios版,那么再向CodePush注册应用的时候需要注册两个App获取两套deployment key,如:

code-push app add myApp-Android android react-native
code-push app add myApp-ios android react-native

相关命令:

code-push app add <appName> <os> <platform> //在账号里面添加一个新的app
code-push app remove //或者 rm 在账号里移除一个app
code-push app remame //重命名一个存在app
code-push app list //或则ls列出账号下面的所有app

集成CodePush SDK:

#Android

第一步: 项目根目录安装react-native-code-push 插件,终端进入你的根项目目录:

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

第二部: 在Android project中安装插件。

CodePush 提供两种方式: RNPM和Manual,以下是RNPM

安装RNPM:(RN0.61及以上版本自动link,可以忽略二三步骤)

npm i -g rnpm

第三步:

运行

rnpm link react-native-code-push

这条命令将会自动帮我们在android文件中添加好设置

在终端运行此命令后,终端会提示你输入deploymentKey ,这时,你只需要将你的deployment staging key输入进去即可,如果不输入则直接单击enter跳过即可。

第四步: 在android/app/build.gradle文件中添加如下代码“

apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"

然后在/android/setting.gradle中添加如下代码:

include ':app', ':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 [APP_NAME] -k

上述命令获取部署密匙,默认的部署名是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 boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }
    @Override
    protected String getJSBundleFile() {
      return CodePush.getJSBundleFile();
    }
    @Override
    protected List<ReactPackage> getPackages() {
      // 3. Instantiate an instance of the CodePush runtime and add it to the list of
      // existing packages, specifying the right deployment key. If you don't already
      // have it, you can run "code-push deployment ls <appName> -k" to retrieve your key.
      return Arrays.<ReactPackage>asList(
        new MainReactPackage(),
        new CodePush("deployment-key-here", MainApplication.this, BuildConfig.DEBUG)
      );
    }
  };
  @Override
  public ReactNativeHost getReactNativeHost() {
      return mReactNativeHost;
  }
}

打包:

第一种打包更新:

code-push release-react MyApp-iOS ios  --t 1.0.0 --dev false --d Production --des "1.优化操作流程" --m true

第二种打包更新:

打包bundles:

第一步: 在工程目录里面新增bundles文件

第二部: 运行打包命令: react-native bundle --platform 平台 --entry-file 启动文件  --bundle-output 打包js输出文件  --assets-dest 资源输出目录 --dev 是否调试

android

react-native bundle --platform android --entry-file index.js  --bundle-output ./bundles/index.android.bundle  --assets-dest ./bundles --dev false

ios

react-native bundle --platform ios --entry-file index.js  --bundle-output ./bundles/main.jsbundle  --assets-dest ./bundles --dev false

需要注意的是:

忽略了资源输出是因为 输出资源文件后,会把bundle文件覆盖了。

输出的bundle文件名不叫其他,而是 index.android.bundle,是因为 在debug模式下,工程读取的bundle就是叫做 index.android.bundle。

平台可以选择 android 或者 ios。

发布更新:

打包结束后,就可以通过CodePush发布更新,在终端输入:

code-push release <应用名称> <Bundles所在目录> <对应的应用版本> --deploymentName: 更新环境 --description: 更新描述 --mandatory: 是否强制更新 

code push

code-push release GitHubPopular ./bundles/index.android.bundle 1.0.6 --deploymentName Production --description "1.支持文章缓存。" --mandatory true

需要注意的是:

CodePush默认是更新 staging 环境的,如果是staging,则不需要填写 deploymentName。

如果有 mandatory 则Code Push会根据mandatory 是true或false来控制应用是否强制更新。默认情况下mandatory为false即不强制更新。

对应的应用版本(targetBinaryVersion)是指当前app的版本(对应build.gradle中设置的versionName “1.0.6”),也就是说此次更新的js/images对应的是app的那个版本。不要将其理解为这次js更新的版本。 如客户端版本是 1.0.6,那么我们对1.0.6的客户端更新js/images,targetBinaryVersion填的就是1.0.6。

对于对某个应用版本进行多次更新的情况,CodePush会检查每次上传的 bundle,如果在该版本下如1.0.6已经存在与这次上传完全一样的bundle(对应一个版本有两个bundle的md5完全一样),那么CodePush会拒绝此次更新。 如图:

 

原文地址:https://www.cnblogs.com/dsweb/p/13531572.html