做爲一個跨平臺應用開發框架,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所示。