最近,在项目DYTT集成了热更新,简单来说,就是不用重新下载安装包即可达到更新应用的目的,也不算教程吧,这里记录一下。

1.热更新方案

目前网上大概有两个比较广泛的方式,分别是

前者是由ReactNative中文网推出的代码热更新服务,后者是由微软老大哥推出的,当然不仅仅是为React Native,还包括其他原生方式。

综合考虑之下,选择了react-native-code-push

2.安装code-push

1.安装code-push

npm install -g code-push-cli

2.注册登录账号

code-push register

这时候会自动启动浏览器打开网页并提供一个codePush AccessKey,然后命令行里出现需要输入access key

输入之后就登录成功了。

(貌似在本机上以后都不用登录了,暂不清楚保持登录持续多久)

3.添加一个CodePush应用

code-push app add myProject android react-native

注意填写app的名称,OS(android/ios),平台(react-native),并且androidios需要创建两个应用

创建完成会出现两个key

name Deployment Key
Production (一串37位的key)
Staging (一串37位的key)

Production是对应生产环境的,Staging是对应开发环境的。

这个对于我们来说其实没什么区别,只是为了方便测试,所以搞了两个环境

3.react-native应用接入code-push

1.安装react-native-code-push

yarn add react-native-code-push

link

react-native link react-native-code-push

2.原生配置

目前只测试了androidios有兴趣的可以自行测试

上面提到了两个key值,现在需要配置在原生目录里

1.打开android/app/build.gradle

android {
...
buildTypes {
debug {
...
// Note: CodePush updates should not be tested in Debug mode as they are overriden by the RN packager. However, because CodePush checks for updates in all modes, we must supply a key.
buildConfigField "String", "CODEPUSH_KEY", '""'
...
}
    releaseStaging {
...
buildConfigField "String", "CODEPUSH_KEY", '"<INSERT_STAGING_KEY>"'//注意这里的引号
...
} release {
...
buildConfigField "String", "CODEPUSH_KEY", '"<INSERT_PRODUCTION_KEY>"'
...
}
}
...

}

如果遇到打包错误,可加上matchingFallbacks = ['release', 'debug'],不知道是不是个别情况,如果没有的请忽略。

修改versionName为3位数的版本号(code-push要求)

defaultConfig {
applicationId "com.dytt"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 2
versionName "2.1.0"//默认为2位版本号
// ndk {
// abiFilters "armeabi-v7a", "x86"
// }
}
release {
//...
matchingFallbacks = ['release', 'debug']//加上这一句
buildConfigField "String", "CODEPUSH_KEY", '"<INSERT_PRODUCTION_KEY>"'
//...
}

2.打开MainApplication.java

@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
...
new CodePush(BuildConfig.CODEPUSH_KEY, MainApplication.this, BuildConfig.DEBUG), // Add/change this line.
...
);
}

这样就实现了key的动态部署,即在什么环境下使用什么key

以上文档参考自https://github.com/Microsoft/react-native-code-push/blob/master/docs/multi-deployment-testing-android.md

4.客户端更新策略

1.导入react-native-code-push

这里需要在应用的根组件上添加CodePush配置

import CodePush from "react-native-code-push";

如果你的环境支持Decorator(修饰符),可以这样

@codePush(options: CodePushOptions)
class MyApp extends Component<{}> {}

普通的写法

class MyApp extends Component<{}> {}
MyApp = codePush(codePushOptions)(MyApp);
export default MyApp;

这里的codePushOptions是更新的配置选项

  • checkFrequency (codePush.CheckFrequency) 指定您要检查更新的时间,默认为codePush.CheckFrequency.ON_APP_START
  • installMode (codePush.InstallMode) 指定何时安装可选更新,默认为codePush.InstallMode.ON_NEXT_RESTART
  • ...

详细的配置可参考https://github.com/Microsoft/react-native-code-push/blob/master/docs/api-js.md

2.更新策略

默认情况下,CodePush会在app每次启动的时候去检测是否有更新,如果有,app会自动下载并在下次打开app时安装

这种更新方式是静默的,用户根本察觉不到。

如果我们需要给一点更新提示,可以使用默认的弹出框,也就是react-native自带的Alert,点击后立即安装

class MyApp extends Component {}
MyApp = codePush({
updateDialog: true,
installMode: codePush.InstallMode.IMMEDIATE
})(MyApp);

当然,你可以对弹出框做少量的自定义,比如标题,按钮的文字等

updateDialog: {
optionalIgnoreButtonLabel: '稍后',
optionalInstallButtonLabel: '立即更新',
optionalUpdateMessage: '有新版本了,是否更新?',
title: '更新提示'
},

这些是默认的更新方式,那么如何自定义呢。

我们可以用到CodePush.checkForUpdate来手动检查更新,然后弹出一个自定义窗口

const RemotePackage = await CodePush.checkForUpdate(deploymentKey);
if(RemotePackage){
this.modal.init(RemotePackage);//打开弹窗
}

这里需要注意的是,在checkForUpdate(或其他需要填写deploymentKey的地方)的时候,如果在debug模式下,如果不填写deploymentKey,会提示缺少deploymentKey,我们可以临时写一个固定的方便测试。在正式环境下,这里是不需要填写,它会根据系统自动获取我们在之前配置的那些deploymentKey

然后可以通过RemotePackage.downloadLocalPackage.install来完成下载和安装

install = async () => {
LayoutAnimation.easeInEaseOut();
this.setState({status:1})//download
const LocalPackage = await this.RemotePackage.download((progress)=>{
this.setState({
receivedBytes:progress.receivedBytes
})
Animated.timing(
this.width,
{
toValue: parseFloat(progress.receivedBytes / progress.totalBytes).toFixed(2),
duration: 150
}
).start();
})
this.setState({status:2})//downloadComplete
await LocalPackage.install(LocalPackage.isMandatory?CodePush.InstallMode.IMMEDIATE:CodePush.InstallMode.ON_NEXT_RESUME);
if(!LocalPackage.isMandatory){
this.setState({status:3})
this.setVisible(false);
}else{
ToastAndroid && ToastAndroid.show('下次启动完成更新', ToastAndroid.SHORT);
}
}

具体实现可以参考项目DYTT

3.打包Release

cd android

生成Release(Production)包

gradlew assembleRelease

生成Release(Staging)包

gradlew assembleReleaseStaging

其实都一样,只是环境区别

5.发布code-push更新

这一步很简单,集成了打包和发布

code-push release-react dyttAndroid android --t 2.1.0 --dev false --d Production --des "1.修复了已知BUG\n 2.测试code push" --m true

这里注意--t 2.1.0,有以下几种规则

1.2.3 仅仅只有1.2.3的版本
  • 所有版本
1.2.x 主要版本1,次要版本2的任何修补程序版本 1.2.3 - 1.2.7 1.2.3版本到1.2.7版本 >=1.2.3 <1.2.7 大于等于1.2.3版本小于1.2.7的版本 ~1.2.3 大于等于1.2.3版本小于1.3.0的版本 ^1.2.3 大于等于1.2.3版本小于2.0.0的版本

--d表示开发版本,可选择ProductionStaging

--m表示是否强制更新

当然还有很多操作,比如删除某些更新,回滚等,可以参考官方文档https://github.com/Microsoft/react-native-code-push

小节

总的来说,这次热更新集成还是挺容易,里面碰到的几个误区在上面也已经提到过,欢迎大家多多关注我的项目DYTT^^

原文地址:https://segmentfault.com/a/1190000017856985

在React Native中集成热更新的更多相关文章

  1. React Native拆包及热更新方案 · Solartisan

    作者:solart 版权声明:本文图文为博主原创,转载请注明出处. 随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行 ...

  2. 教你轻松在React Native中集成统计(umeng)的功能(最新版)

    关于在react-native中快速集成umeng统计,网上的文章或者教程基本来自----贾鹏辉老师的文章http://www.devio.org/2017/09/03/React-Native-In ...

  3. React Native中集成友盟社会化分享-----童叟无欺

    1.下载所需的jar,下载地址https://developer.umeng.com/sdk/reactnative?spm=a211g2.211692.0.0.28967d238GW6mC 2.将以 ...

  4. 在 React Native 中使用 Redux 架构

    前言 Redux 架构是 Flux 架构的一个变形,相对于 Flux,Redux 的复杂性相对较低,而且最为巧妙的是 React 应用可以看成由一个根组件连接着许多大大小小的组件的应用,Redux 也 ...

  5. [转] 「指尖上的魔法」 - 谈谈 React Native 中的手势

    http://gold.xitu.io/entry/55fa202960b28497519db23f React-Native是一款由Facebook开发并开源的框架,主要卖点是使用JavaScrip ...

  6. React Native 轻松集成分享功能(iOS 篇)

    产品一直催我在 RN 项目中添加分享功能,一直没找到合适的库,今天让我看到了一个插件分享给大家. 在集成插件之前,需要在各大开放平台上成功注册应用,并通过审核(支持 3 个可选的主流平台).支持的平台 ...

  7. React Native 轻松集成统计功能(Android 篇)

    关于推送的集成请参考这篇文章,本篇文章将引导你集成统计功能,只需要简单的三个步骤就可以集成统计功能. 第一步 安装 在你的项目路径下执行命令: npm install janalytics-react ...

  8. React Native 轻松集成分享功能(Android 篇)

    关于推送的集成请参考这篇文章,关于统计的集成请参考这篇文章,本篇文章将引导你集成分享功能. 在集成插件之前,需要在各大开放平台上成功注册应用,并通过审核(支持 3 个可选的主流平台).支持的平台如下: ...

  9. React Native 轻松集成统计功能(iOS 篇)

    最近产品让我加上数据统计功能,刚好极光官方支持数据统计 支持了 React Native 版本 第一步 安装: 在你的项目路径下执行命令: npm install janalytics-react-n ...

随机推荐

  1. php7.0.24-nts配置步骤

    php-cgi.exe文件运行 php-cgi.exe -b 127.0.0.1:9000 -c D:/myphp2017/php7-nts/php.ini nginx命令 启动 start ngin ...

  2. hash冲突解决和javahash冲突解决

    其实就是四种方法的演变 1.开放定址法 具体就是把数据的标志等的对长度取模 有三种不同的取模 线性探测再散列 给数据的标志加增量,取模 平方探测再散列 给数据的标志平方,取模 随机探测再散列 把数据的 ...

  3. js对象动态赋值

    <view class="movies-template"> <template is="movieListTemplate" data=&q ...

  4. 9种Java单例模式详解

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象. 懒汉式(线程不安全) 其主要表现在单例类在外部 ...

  5. 链表例题2:链表的倒数第k个节点是多少

    解题思想: 1.创建一个结点类(为后面实现链表做基础) 2.创建一个查询倒数元素的方法 3.使用快慢指针的思想(主要的部分) 图中的表示的是查询倒数第k个结点的操作: 创建一个快慢指针后pre(慢指针 ...

  6. maven课程 项目管理利器-maven 4-1 使用maven创建web项目 5星

    本节主要讲了使用maven创建web项目 主要分这三大类: 1 新建maven  web项目 2 后续处理普通java项目转web项目需要关注的点 3 maven特色转web需要关注的点 1 新建ma ...

  7. mac笔记本上的工具

    svn可是换工具:cornerstone host修改工具:switchHosts!

  8. LotusScript_导出数据库路径和名称

    对服务器有些数据库需要建立复本,新建拷贝,修改权限(ACL),或是修改数据库标识符(ID)需要找到这些数据库.这个方法是导出指定服务器上所有数据库的路径,数据库名,标识符等信息,导出后对Excel表格 ...

  9. Android学习笔记4——Activity详解

    在 Android 开发过程中,与程序员打交道最多的应该就是作为四大组件之一的 Activity 了.接下来我们就一起来揭开 Activity 的神秘面纱吧~ 一.概述 什么是 Activity(活动 ...

  10. 缺陷=bug?

    Defect(缺陷):是指静态处在于软件工作产品(文档.代码)中的错误,也指软件运行时由于这些错误被激发导致的软件产品与其属性的偏离现象. Bug:Bug通常是软件缺陷(Defect)导致的一些软件故 ...