11. 部署和打包
React Native支持大家用React Native技术开发APP,并打包生成一个APP。在动态更新方面ReactNative只是提供了动态更新的基础,对将应用部署到哪里,如何进行动态更新并没有支持的那么完善。好在微软开发了CodePush,填补React Native 应用在动态更新方面的空白。CodePush 是微软提供的一套用于热更新 React Native 和 Cordova 应用的服务。下面将向大家分享如何使用CodePush实时更新你的应用,后期会分享不采用CodePush,如何自己去实现React Native应用热更新。
CodePush简介
CodePush 是微软提供的一套用于热更新 React Native 和 Cordova 应用的服务CodePush 是提供给 React Native 和 Cordova 开发者直接部署移动应用更新给用户设备的云服务。CodePush 作为一个中央仓库,开发者可以推送更新(JS,HTML,CSS and images),应用可以从客户端 SDK 里面查询更新。CodePush 可以让应用有更多的可确定性,也可以让你直接接触用户群。在修复一些小问题和添加新特性的时候,不需要经过二进制打包,可以直接推送代码进行实时更新。
CodePush 可以进行实时的推送代码更新:
- 直接对用户部署代码更新
- 管理 Alpha,Beta 和生产环境应用
- 支持 React Native 和 Cordova
- 支持JavaScript 文件与图片资源的更新
CodePush开源了react-native版本,react-native-code-push托管在GitHub上
安装与注册CodePush
使用CodePush之前首先要安装CodePush客户端。本文以OSX10.11.5作为平台进行演示
安装 CodePush CLl
管理 CodePush 账号需要通过 NodeJS-based CLl。
只需要在终端输入 npm -g code-push-cli,就可以安装了!
安装完毕后,输入 code-push -v 查看版本,如看到版本代表成功。
创建一个CodePush 账号
在终端输入code-push register,会打开如下注册页面让你选择授权账号
授权通过之后,CodePush会告诉你“access key”,复制此key到终端即可完成注册
然后终端输入 code-push login 进行登陆,登陆成功后,你的session文件将会写在 /Users/你的用户名/.code-push.config。
code-push相关命令
code-push login 登陆
code-push logout 注销
code-push access-key ls 列出登陆的token
code-push access-key rm <accessKey>删除某个 access-key
code-push app add <appName> <os> <platform> 在账号里面添加一个新的app
code-push app remove 或者 rm 在账号里移除-个app
code-push app rename 重命名一个存在app
code-push app list 或则Is 列出账号下面的所有app
在CodePush服务器注册app
为了让CodePush服务器知道你的app,我们需要向它注册app:在终端输入 code-push app add<appName> <os> <platform> 即可完成注册。
code-push app add MyApp-Android android react-native
code-push app add MyApp-i0S ios react-native
集成CodePush SDK
Android
下面我们通过如下步骤在Android项目中集成CodePush。
- 第一步:在项目中安装 react-native-code-push插件,终端进入你的项目根目录然后运行npm install --save react-native-code-push
- 第二步:在Android project中安装插件。
CodePush提供了两种方式:RNPM 和 ,本次演示所使用的是RNPM.
3. 运行 npm i -g rnpm,来安装RNPM。
4. 第三步: 运行 rnpm link react-native-code-push 。这条命令将会自动帮我们在anroid文件中添加好设置。
在终端运行此命令之后,终端会提示让你输入deploymentkey,这是你只需将你的deploymentStaging key输入进去即可,如果不输入则直接单击enter跳过即可。
5. 第四步:在 android/app/build.gradle文件里面添如下代码:
apply from: "../../node modules/react-native-code-push/android/codepush.gradle"
然后在/android/settings.gradle中添加如下代码:
include ':react-native-code-push'
project(':react-native-code-push').projectDir = new File(rootProject.projectDir, "../no
6. 第五步: 运行 code-push deployment ls [APP_NAME] -k 获取 部署秘钥。默认的部署名是staging,所以部署秘钥(deployment key)就是 staging。
使用CodePush进行热更新
设置更新策略
在使用CodePush更新你的应用之前需要,先配置一下更新控制策略,即:
- (在APP启动的时候?在设置页面添加一个检查更新按钮?)·什么时候检查更新?
- ·什么时候可以更新,如何将更新呈现给终端用户?
最简单的方式是在根component中进行上述策略控制。
1.在 js中加载 CodePush模块:
import codePush from 'react-native-code-push'
2.在 componentDidMount 中调用 sync 方法,后台请求更新
codePush.sync()
如果可以进行更新,CodePush会在后台静默地将更新下载到本地,等待APP下一次启动的时候应用更新,以确保用户看到的是最新版本
如果更新是强制性的,更新文件下载好之后会立即进行更新。如果你期望更及时的获得更新,可以在每次APP从后台进入前台的时候去主动的检查更新:在应用的根component的componentDidMount 中添加如下代码:
AppState.addEventListener("change",(newstate)=>{
newState =="active"" && codePush.sync();
});
发布更新
CodePush支持两种发布更新的方式,一种是通过 code-push release-react 简化方式,另外一种是通过 code-push release 的复杂方式。
第一种方式:通过 code-push release-react 发布更新
这种方式将打包与发布两个命令合二为一,可以说大大简化了我们的操作流程,建议大家多使用这种方式来发布更新。
命令格式:
codefpush release-react <appName> <platform>
eg:
code-push release-react MyApp-i0s ios
code-push release-react MyApp-Android android
再来个更高级的:
code-push release-react MyApp-i0S 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进行查看。
另外,我们可以通过 code-push deployment ls <appName>来查看发布详情与此次更新的安装情况。
第二中方式:通过 code-push release 发布更新
code-push release发布更新呢我们首先需要将js与图片资源进行打包成 bundle。
生成bundle
发布更新之前,需要先把 js打包成 bundle,如:
第一步: 在 工程目录里面新增 bundles文件: mkdir bundles
第二步:运行命令打包 react-native bundle --platform 平台 --entry-file 启动文件 --bundle-output 打包js输出文件 --assets-dest 资源输出目录 --dev 是否调试 。
ios:
react-native bundle --platform ios --entry-file index.js --bundle-output./bundles/main.isbundle --assets-dest ./bundles --dev false
Android :
react-native bundle --platform android --entry-file index.js --bundle-output ./bundles/index.android.bundle --assets-dest ./bundles --dev false