RN中热更新CodePush使用
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使用相关推荐
- RN 实现热更新及手动热更新,记录实现的方式
需求:App需要一个热更新的功能,可以默认更新用来修正线上问题 实现路线: 使用微软的依赖包 react-native-code-push 实现步骤 全局安装code-push-cli npm i - ...
- app实现热更新codepush
本人之前从事ios原生开发,自去年11月接触react-native,就对其"learn once, write anywhere",深深吸引,我们公司开发的是一款在线定制衣服的软 ...
- android中热更新模式,Android热更新与开启Instant Run
配置完热更新后,直接run模式运行,程序会报以下错误: Tinker does not support instant run mode, please trigger build by assemb ...
- android中热更新模式,热更新再牛,也少不了Android 增量更新
码个蛋(codeegg)第 785 次推文 作者: C_YQ 原文: https://juejin.im/post/5da845cdf265da5b7244c63e 码妞看世界 接骨草~ 虽然没有增量 ...
- React Native 实现热更新方案CodePush过程中遇到的问题 ( 搭建自己的CodePush服务器 )
前言 CodePush官方: https://github.com/Microsoft/react-native-code-push 自搭建CodePushServer: https://github ...
- cordova+codepush 热更新实践 (微软 cordova-plugin-code-push)
系统环境 windows 10 所需工具 node.js, android studio, 安装方法自行百度/谷歌 cordova-hot-code-push 不再维护, 转而使用 cordova-p ...
- CodePush 热更新之自定义更新弹框及下载进度
code-push的提示面板可能不符合产品设计的要求,这时就需要我们去自定义一个更新提示框.下面是一个简单的例子: 1. 检查是否需要更新 首先判断是否需要更新,如果有新版本,显示更新面板,根据用户行 ...
- React Native带你一步步实现热更新(CodePush-Android)
前言:无奈研究了一下CodePush,遇到了很多坑-- 但是原理呢不是很难理解,就是配置有点多,原理可以简单的参考一下我之前的一篇博客React-Native 热更新尝试(Android),下面说一下 ...
- [置顶] 【稀饭】react native 实战系列教程之热更新原理分析与实现
很多人在技术选型的时候,会选择RN是因为它具有热更新,而且这是它的一个特性,所以实现起来会相对比较简单,不像原生那样,原生的热更新是一个大工程.那就目前来看,RN的热更新方案已有的,有微软的CodeP ...
最新文章
- C语言编程课后训练,C语言编程课后训练20道题.doc
- Spring MVC 完整示例
- 【如何利用idea提交本地代码到git远程仓库,史上最详细教程,建议收藏!】
- usb接口供电不足_1个USB接口变成4个?什么东西那么“牛”?请你花2分钟了解一下...
- 职称计算机考试有哪些题,职称计算机考试判断复习题「有答案」
- ffmpeg常用数据结构4
- caffe+CPU︱虚拟机+Ubuntu16.04+CPU+caffe安装笔记
- 【每日算法Day 95】美团笔试题:四面体方案个数
- Mybaits的运行原
- PR视频旋转处理方法
- FastDFS 原理 以及 简单使用
- webview适配(一):文件选择,相机拍照,相册选择
- Apex英雄下载慢的解决方法|Apex英雄离线包分享
- python爬虫之爬取捞月狗直播信息
- 量化投资之工具篇一:Backtrader从入门到精通(3)-Cerebro源代码解读
- matplotlib函数库使用imshow绘制像素图片
- Ubuntu、Debian 系统安装 PHP 7.4 教程,超简单,一把梭!
- python列表增加行_openpyxl追加行、指定位置插入行
- 使用Jquery、HTML、CSS、JS实现下拉菜单列表
- 打造数字孪生社区,极视角助力成都市成华区杉板桥社区智能感知体系建设
热门文章
- 如何在图片上编辑文字?在图片上编辑文字这样做很简单
- 硕盟 HDMI转VGA 笔记本台式主机HDMI转VGA显示器转接头
- 【C语言进阶】字符串函数模拟实现
- BUUCTF misc 二维码1解题思路
- git常用操作--分支同步master 本地库提交到远程分支
- 爱情大数据 | 你的专属微信聊天记录统计
- java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法 ? stop() 和 suspend() 方 法为何不推荐使用?
- Linux账户设置能su不能ssh,ssh无法登录可以su切换的问题
- ps 粗糙的练习磨皮小结实现的步骤---粗略的版本
- U盘容量从16G变成8M解决办法