做为一个跨平台应用开发框架,React Native虽然在动态更新方面提供了动态更新的基础,可是动态更新技术并无想象的那么完善。好在微软开发了CodePush,填补了React Native应用在动态更新方面的空白。node
CodePush是微软提供的一套用于React Native和Cordova的热更新服务,借助CodePush,开发者能够直接部署移动应用更新并快速实现代码的热更新,CodePush的官方地址为https://microsoft.github.io/code-push/。react
CodePush做为一个中央仓库,开发者能够实时推送更新,而后客户端应用能够在应用启动时查询更新。借助CodePush,不须要从新审核和安装应用,就能够解决应用的缺陷和添加新特性。CodePush支持的功能以下: • 支持直接对用户部署代码更新; • 管理Alpha、Beta和生产环境应用; • 支持React Native和Cordova跨平台技术的热更新; • 支持JavaScript文件与图片资源的更新;android
使用CodePush以前,须要先安装CodePush命令行工具,并注册CodePush帐号和应用,安装命令以下:ios
npm install -g code-push-cli
复制代码
安装完成后能够经过code-push -v命令进行验证。而后,在终端输入命令 code-push register,会打开注册页面让开发者选择受权帐号,如图11-11所示。 git
code-push app add <appName> <platform> react-native
复制代码
其中,appName表示应用的名称,platform表示应用的平台。在终端输入命令后便可完成应用的注册,如图11-13所示。github
完成CodePush帐号的建立和应用的注册操做以后,接下来还须要集成CodePush SDK到React Native应用中。 首先,使用react-native init命令新建一个React Native项目,以下所示:npm
react-native init codepush
复制代码
而后,安装react-native-code-push插件,安装命令以下:json
npm install --save react-native-code-push
复制代码
而后,运行link命令将react-native-code-push插件添加到原生工程中,以下所示:react-native
react-native link react-native-code-push
复制代码
此时,系统会提示输入iOS和Android应用的deployment key,此时输入应用的Staging便可,若是不输入则能够直接点击【Enter】键跳过,以下所示:xcode
? What is your CodePush deployment key for Android (hit <ENTER> to ignore)
? What is your CodePush deployment key for iOS (hit <ENTER> to ignore)
复制代码
若是忘记deployment key的话,能够经过以下命令进行查看,如图11-14所示。
使用react-native link连接原生库时,若是跳过输入deployment key,也能够在原生端手动进行配置。 对于iOS来讲,使用Xcode打开ios/codepush.xcodeproj目录下的iOS工程,而后Xcode的导航视图的PROJECT下选中项目,而后依次选择【Info】→【Configurations】→【添加】→【Duplicate Release Configuration】,而后输入Staging的key,如图11-15所示。
include ':react-native-code-push'
project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')
复制代码
而后,在app/build.gradle文件中关联react-native-code-push库的依赖,以下所示:
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
dependencies {
compile project(':react-native-code-push')
}
复制代码
接下来,在MainApplication类的getPackages()方法中注册CodePush,以下所示:
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new CodePush(BuildConfig.codepushkey,getApplicationContext(), BuildConfig.DEBUG)
);
}
复制代码
因为CodePush的deployment-key分为生产环境与测试环境两种,因此能够在build.gradle文件中进行设置,以下所示:
android {
releaseStaging {
buildConfigField "String", "CODEPUSH_KEY", '"<INSERT_STAGING_KEY>"'
}
release {
buildConfigField "String", "CODEPUSH_KEY", '"<INSERT_PRODUCTION_KEY>"'
}
}
}
复制代码
到此,CodePush热更新所须要的原生配置就完成了,接下来只须要修改React Native的逻辑便可。
使用Xcode打开ios/codepush.xcodeproj文件,而后打开AppDelegate.m文件,能够看到此时jsCodeLocation相关代码以下:
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
return [CodePush bundleURL];
#endif
}
复制代码
从上面的代码能够看出,在非Debug状态下,系统默认加载的资源地址为CodePush的bundleURL,为了加载CodePush的Bundle资源,须要手动修改编译选项为Release。具体来讲,打开Xcode的菜单,而后依次选择【Product】→【Scheme】→【Edit Scheme】,如图11-19所示。
import React, {Component} from 'react';
import {AppRegistry, Platform, StyleSheet, Text, View} from 'react-native';
import {name as appName} from './app.json';
import codePush from 'react-native-code-push'
type Props = {};
export default class App extends Component<Props> {
constructor(props) {
super(props);
this.state = {
message: ''
};
}
componentDidMount() {
codePush.checkForUpdate().then((update) => {
if (update) {
this.setState({message: '有新的更新!'})
} else {
this.setState({message: '已经是最新,不须要更新!'})
}
})
}
render() {
return (
<View style={styles.container}>
<Text style={styles.welcome}>版本号 1.0</Text>
<Text style={styles.instructions}>{this.state.message}</Text>
</View>
);
}
}
//省略样式文件
AppRegistry.registerComponent(appName, () => codePush(App));
复制代码
如上所示,能够componentDidMount生命周期函数会检查CodePush应用是否须要更新,若是检测须要更新则下载CodePush应用的更新。从新编译和运行应用,效果如图11-21所示。
render() {
return (
<View style={styles.container}>
<Text style={styles.welcome}>版本号 1.1</Text>
<Text style={styles.instructions}>{this.state.message}</Text>
</View>
);
}
复制代码
接下来,使用CodePush的code-push release命令行工具发布iOS的更新,以下所示:
code-push release-react codepush ios
复制代码
等待系统打包并发布热更新的bundle文件,发布成功后关闭并从新打开应用,就能够看到应用启动时会提示更新,如图11-22所示。