RN中涉及到热更新使用微软提供的CodePush插件实现,具体使用如下:

更新流程

1、安装 code-push-cli插件(在项目根目录)

npm install -g code-push-cli        //全局安装code-push-cli插件

2、注册登录微软CodePush服务

code-push register

此时会打开一个网页

选择一个账号登录,登录成功会自动创建一个token

在terminal中继续输入上面获取的token

Enter your token from the browser:  6921*********************0c33

出现如下信息提示成功且自动登录CodePush服务(其中session被保存在.code-push.config文件中)

Successfully logged-in. Your session file was written to /Users/xxxxx/.code-push.config. You can run the code-push logout command at any time to delete this file and terminate your session.

打开.code-push.config文件可见accesskey

3、向CodePush微软服务添加APP

为了让CodePush服务器有我们的App,我们需要CodePush注册App(在项目根目录下执行)

//注册Android
code-push app add 应用名 android react-native
//注册iOS
code-push app add 应用名 ios react-native
code-push app add RNDemo01 Android react-native   //将当前应用Android平台RNDemo01注册到服务

向CodePush服务注册App之后会得到Production key和Staging key(Production-代表生产热更新部署,Staging-代表开发热更新部署),在ios中将Staging的部署key复制在info.plist的CodePushDeploymentKey值中,在android中复制在Application的getPackages的CodePush中。

注意:注意如果我们的应用分为iOS和Android两个平台,这时我们需要分别注册两套key。

查看已经在CodePush注册的APP

code-push app list

4、原生应用中配置CodePush

这里原生应用中配置CodePush我们需要分别配置iOS平台和Android平台

配置iOS平台

  • 使用Xcode打开项目,Xcode的项目导航视图中的PROJECT下选择你的项目,选择Info页签 ,在Configurations节点下单击 + 按钮 ,选择Duplicate "Release Configaration,输入Staging

  • 选择Build Settings tab,搜索Build Location -> Per-configuration Build Products Path -> Staging,将之前的值:
$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)改为:
$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

  • 选择Build Settings tab,点击 + 号,选择Add User-Defined Setting,将key设置为CODEPUSH_KEY,Release 和 Staging的值为前面创建的key,我们直接复制进去即可

  • 打开Info.plist文件,在CodePushDeploymentKey中输入$(CODEPUSH_KEY),并修改Bundle versions为三位

iOS平台CodePush环境集成完毕。

配置Android平台

在android中将部署key复制在Application的getPackages的CodePush中。

5、在RN代码中集成CodePush

在使用之前需要考虑的是检查更新时机,更新是否强制更新是否要求即时

更新时机

一般常见的应用内更新时机分为两种,一种是打开App就检查更新,一种是放在设置界面让用户主动检查更新并安装

打开APP就检查更新

最为简单的使用方式在React Natvie的根组件的componentDidMount方法中通过codePush.sync()(需要先导入codePush包:import codePush from 'react-native-code-push')方法检查并安装更新,如果有更新包可供下载则会在重启后生效。不过这种下载和安装都是静默的,即用户不可见。如果需要用户可见则需要额外的配置。具体可以参考codePush官方API文档,部分代码,完整代码请参照文档上面

CodePush.sync( {//更新是否要求即时//ON_NEXT_RESUME 下次恢复到前台时//ON_NEXT_RESTART 下一次重启时//IMMEDIATE 马上更新installMode : CodePush.InstallMode.IMMEDIATE ,//对话框updateDialog : {//是否显示更新描述appendReleaseDescription : true ,//更新描述的前缀。 默认为"Description"descriptionPrefix : "更新内容:" ,//强制更新按钮文字,默认为continuemandatoryContinueButtonLabel : "立即更新" ,//强制更新时的信息. 默认为"An update is available that must be installed."mandatoryUpdateMessage : "必须更新后才能使用" ,//非强制更新时,按钮文字,默认为"ignore"optionalIgnoreButtonLabel : '稍后' ,//非强制更新时,确认按钮文字. 默认为"Install"optionalInstallButtonLabel : '后台更新' ,//非强制更新时,检查到更新的消息文本optionalUpdateMessage : '有新版本了,是否更新?' ,//Alert窗口的标题title : '更新提示'} ,} ,);

上面的配置在检查更新时会弹出提示对话框, mandatoryInstallMode表示强制更新,appendReleaseDescription表示在发布更新时的描述会显示到更新对话框上让用户可见

用户点击检查更新按钮

在用户点击检查更新按钮后进行检查,如果有更新则弹出提示框让用户选择是否更新,如果用户点击立即更新按钮,则会进行安装包的下载(实际上这时候应该显示下载进度,这里省略了)下载完成后会立即重启并生效(也可配置稍后重启),部分代码如下

codePush.checkForUpdate(deploymentKey).then((update) => {if (!update) {Alert.alert("提示", "已是最新版本--", [{text: "Ok", onPress: () => {console.log("点了OK");}}]);} else {codePush.sync({deploymentKey: deploymentKey,updateDialog: {optionalIgnoreButtonLabel: '稍后',optionalInstallButtonLabel: '立即更新',optionalUpdateMessage: '有新版本了,是否更新?',title: '更新提示'},installMode: codePush.InstallMode.IMMEDIATE,},(status) => {switch(status) {case codePush.SyncStatus.CHECKING_FOR_UPDATE:console.log("Checking for updates.");break;case codePush.SyncStatus.DOWNLOADING_PACKAGE:console.log("Downloading package.");break;case codePush.SyncStatus.INSTALLING_UPDATE:console.log("Installing update.");break;case codePush.SyncStatus.UP_TO_DATE:console.log("Installing update.");break;case codePush.SyncStatus.UPDATE_INSTALLED:console.log("Update installed.");break;}},(progress) => {console.log(progress.receivedBytes + " of " + progress.totalBytes + " received.");});}}

更新是否强制

如果是强制更新需要在发布的时候指定,发布命令中配置--m true

更新是否要求即时

在更新配置中通过指定installMode来决定安装完成的重启时机,亦即更新生效时机

  • codePush.InstallMode.IMMEDIATE:表示安装完成立即重启更新

  • codePush.InstallMode.ON_NEXT_RESTART:表示安装完成后会在下次重启后进行更新

  • codePush.InstallMode.ON_NEXT_RESUME:表示安装完成后会在应用进入后台后重启更新

6、如何发布CodePush更新包

在将RN的bundle放到CodePush服务器之前,我们需要先生成bundle,在将bundle上传到CodePush

生成bundle

  • 我们在RN项目根目录下线创建bundle文件夹,再在bundle中创建创建ios和android文件夹,最后将生成的bundle文件和资源文件拖到我们的项目工程中

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

react-native bundle --platform android --entry-file index.js --bundle-output ./bundle/android/android.bundle --assets-dest ./android/app/src/main/res/ --dev false

执行命令后bundle文件会自动生成在我们指定的文件夹下面。

上传bundle到CodePush服务器

code-push release-react <Appname> <Platform> --t <本更新包面向的旧版本号> --des <本次更新说明>

code-push release-react RNDemo01 android --t 1.0.1 --des "这是第一个更新包"

注意: CodePush默认是更新Staging 环境的,如果发布生产环境的更新包,需要指定--d参数:--d Production,如果发布的是强制更新包,需要加上 --m true强制更新

查看发布的历史记录,命令如下

查询Production

code-push deployment history projectName Production

查询Staging

code-push deployment history projectName Staging

code-push deployment history RNDemo01 Staging

PS:

  • 发布更新包命令中的 -- t 对应的参数是和我们项目中的版本号一致的,这个不要误理解为是更新包的版本号,例如项目中的版本号为1.0.0, 这时如果我们需要对这个1.0.0 版本的项目进行第一次热更新,那么命令中的 -- t 也为1.0.0,第二次热更新任然为1.0.0

  • 项目的版本号需要改为三位的,默认是两位的,但是CodePush需要三位数的版本号

  • 发布更新应用时,应用的名称必须要和之前注册过的应用名称一致

7、CodePush常用命令

// 账户相关
code-push login 登陆
code-push loout 注销
code-push access-key ls 列出登陆的token
code-push access-key rm <accessKye> 删除某个 access-key
// app操作相关
code-push app add <appName> <platform> react-native  在账号里面添加一个新的app
code-push app remove 或者 rm 在账号里移除一个 app
code-push app rename 重命名一个存在 app
code-push app list 或则 ls 列出账号下面的所有 app
code-push app transfer 把app的所有权转移到另外一个账号
// 应用信息相关
code-push deployment add <appName> 部署
code-push deployment rm <appName> 删除部署
code-push deployment rename <appName> 重命名
code-push deployment ls <appName> 列出应用的部署情况
code-push deployment ls <appName> -k 查看部署的key
code-push deployment history <appName> <deploymentName> 查看历史版本
// 发布
code-push release-react <appName> <platform> -t 版本  -d 环境  --des 描述 -m true (强制更新)
// 清除历史部署记录
code-push deployment clear <appName> Production or Staging
// 回滚
code-push rollback <appName> Production --targetRelease v4(codepush服务部署的版本号)

注意事项
1. 更新规则

1.1 CodePush部署版本 > App版本

更新可用,但当前版本比运行版本高。不作更新

1.2. CodePush部署版本 < App版本

不执行更新处理

1.3. CodePush部署版本 == App版本

自动下载更新,并根据加载策略加载最新bundle

2. 回滚 

2.1当部署的版本不同时,不能跨版本回滚。

例如:CodePush历史版本中为2.10.1,此时发布2.10.2版本。当从2.10.2发起回滚操作回到2.10.1时,是不可行的。

8、部署信息参数

在部署了版本之后,执行 【code-push deployment ls uniApp-Android】可以查看当前版本、当前部署环境下的部署信息

. Update Metadata(更新信息)

Label:标识当前部署版本,每部署新版本,版本号增加1

App Version:当前部署的App版本号

Mandatory:是否强制更新

Release Time:部署时间

Released By:部署用户

Description:部署 描述信息

从上面内容不难发现,这些信息基本都会在我们执行 code-push release 时配置

2. Install Metrics(安装指标)

Active:成功安装并运行当前release的用户的数量,即表示当前下载更新部署的活跃用户数量,of 左边数会随着用户安装、卸载而 增加、减少。of右边数代表当前安装或收到部署版本的用户数,当有用户卸载App,该数值会降低。因此它很好的解释了当前更新包有多少活跃用户,多少用户接收过这个安装包

Total:成功安装部署当前release的用户量,只增不减    Pending:当前release版本被下载的数量,但是还没有被安装,该值会随着用户下载安装后增加, 在卸载时降低

原文地址

参考文章:

https://blog.csdn.net/u013718120/article/details/78344866

https://www.jianshu.com/p/9b39710ebb4e

RN中热更新CodePush使用相关推荐

  1. RN 实现热更新及手动热更新,记录实现的方式

    需求:App需要一个热更新的功能,可以默认更新用来修正线上问题 实现路线: 使用微软的依赖包 react-native-code-push 实现步骤 全局安装code-push-cli npm i - ...

  2. app实现热更新codepush

    本人之前从事ios原生开发,自去年11月接触react-native,就对其"learn once, write anywhere",深深吸引,我们公司开发的是一款在线定制衣服的软 ...

  3. android中热更新模式,Android热更新与开启Instant Run

    配置完热更新后,直接run模式运行,程序会报以下错误: Tinker does not support instant run mode, please trigger build by assemb ...

  4. android中热更新模式,热更新再牛,也少不了Android 增量更新

    码个蛋(codeegg)第 785 次推文 作者: C_YQ 原文: https://juejin.im/post/5da845cdf265da5b7244c63e 码妞看世界 接骨草~ 虽然没有增量 ...

  5. React Native 实现热更新方案CodePush过程中遇到的问题 ( 搭建自己的CodePush服务器 )

    前言 CodePush官方: https://github.com/Microsoft/react-native-code-push 自搭建CodePushServer: https://github ...

  6. cordova+codepush 热更新实践 (微软 cordova-plugin-code-push)

    系统环境 windows 10 所需工具 node.js, android studio, 安装方法自行百度/谷歌 cordova-hot-code-push 不再维护, 转而使用 cordova-p ...

  7. CodePush 热更新之自定义更新弹框及下载进度

    code-push的提示面板可能不符合产品设计的要求,这时就需要我们去自定义一个更新提示框.下面是一个简单的例子: 1. 检查是否需要更新 首先判断是否需要更新,如果有新版本,显示更新面板,根据用户行 ...

  8. React Native带你一步步实现热更新(CodePush-Android)

    前言:无奈研究了一下CodePush,遇到了很多坑-- 但是原理呢不是很难理解,就是配置有点多,原理可以简单的参考一下我之前的一篇博客React-Native 热更新尝试(Android),下面说一下 ...

  9. [置顶] 【稀饭】react native 实战系列教程之热更新原理分析与实现

    很多人在技术选型的时候,会选择RN是因为它具有热更新,而且这是它的一个特性,所以实现起来会相对比较简单,不像原生那样,原生的热更新是一个大工程.那就目前来看,RN的热更新方案已有的,有微软的CodeP ...

最新文章

  1. C语言编程课后训练,C语言编程课后训练20道题.doc
  2. Spring MVC 完整示例
  3. 【如何利用idea提交本地代码到git远程仓库,史上最详细教程,建议收藏!】
  4. usb接口供电不足_1个USB接口变成4个?什么东西那么“牛”?请你花2分钟了解一下...
  5. 职称计算机考试有哪些题,职称计算机考试判断复习题「有答案」
  6. ffmpeg常用数据结构4
  7. caffe+CPU︱虚拟机+Ubuntu16.04+CPU+caffe安装笔记
  8. 【每日算法Day 95】美团笔试题:四面体方案个数
  9. Mybaits的运行原
  10. PR视频旋转处理方法
  11. FastDFS 原理 以及 简单使用
  12. webview适配(一):文件选择,相机拍照,相册选择
  13. Apex英雄下载慢的解决方法|Apex英雄离线包分享
  14. python爬虫之爬取捞月狗直播信息
  15. 量化投资之工具篇一:Backtrader从入门到精通(3)-Cerebro源代码解读
  16. matplotlib函数库使用imshow绘制像素图片
  17. Ubuntu、Debian 系统安装 PHP 7.4 教程,超简单,一把梭!
  18. python列表增加行_openpyxl追加行、指定位置插入行
  19. 使用Jquery、HTML、CSS、JS实现下拉菜单列表
  20. 打造数字孪生社区,极视角助力成都市成华区杉板桥社区智能感知体系建设

热门文章

  1. 如何在图片上编辑文字?在图片上编辑文字这样做很简单
  2. 硕盟 HDMI转VGA 笔记本台式主机HDMI转VGA显示器转接头
  3. 【C语言进阶】字符串函数模拟实现
  4. BUUCTF misc 二维码1解题思路
  5. git常用操作--分支同步master 本地库提交到远程分支
  6. 爱情大数据 | 你的专属微信聊天记录统计
  7. java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法 ? stop() 和 suspend() 方 法为何不推荐使用?
  8. Linux账户设置能su不能ssh,ssh无法登录可以su切换的问题
  9. ps 粗糙的练习磨皮小结实现的步骤---粗略的版本
  10. U盘容量从16G变成8M解决办法