react-native熱更新
一、全域性安裝 code-push-cli
$ npm i -g code-push-cli
二、註冊 App Center
執行以下命令
$ code-push register
或直接開啟 https://appcenter.ms/ 註冊
三、登入App Center
回車後,會開啟 App Center 的網址。根據提示覆制金鑰到命令列中回車即可:
四、 在App Center註冊App
為了讓 App Center 有我們的App,我們需要 App Center 註冊App,輸入下面命令即可完成註冊,這裡需要注意如果我們的應用分為iOS和Android兩個平臺,這時我們需要分別註冊兩套key。
應用新增成功後就會返回對應的 production
和 Staging
兩個key,production
代表生產版的熱更新部署,Staging
代表開發版的熱更新部署,在 ios 中將 staging
的部署 key 複製在 info.plist
的 CodePushDeploymentKey
值中,在 android 中複製在 Application 的 getPackages 的 CodePush 中。
4.1 新增iOS平臺應用
$ code-push app add iOSRNHybrid ios react-native
執行結果:
4.2 新增 android 命令
$ code-push app add iOSRNHybridForAndroid Android react-native
執行結果:
五、檢視新增的App
$ code-push app list
六、RN 整合 code-push
6.1 安裝
執行
link
命令會讓你輸入Android
和iOS
兩個平臺的key
,可以忽略,也可以直接填寫。
在ios
中將staging
的部署key
複製在info.plist
的CodePushDeploymentKey
值中,
在android
中複製在Application
的getPackages
的CodePush
中。
$ yarn add react-native-code-push
$ react-native link react-native-code-push
6.2 配置
我們在RN專案的根元件中新增熱更新邏輯程式碼如下:
App.jsx
import React, { Component } from 'react'
import { StyleSheet, Image, View, Text } from 'react-native'
import CodePush from 'react-native-code-push'
import checkHotUpdate from './src/utils/checkHotUpdate'
const codePushOptions = {
// 設定檢查更新的頻率
// ON_APP_RESUME APP恢復到前臺的時候
// ON_APP_START APP開啟的時候
// MANUAL 手動檢查
checkFrequency: CodePush.CheckFrequency.ON_APP_RESUME,
}
class App extends Component {
componentDidMount() {
CodePush.disallowRestart()// 禁止重啟
checkHotUpdate(CodePush) // 開始檢查更新
}
render() {
return (
<View style={styles.container}>
<Image
resizeMode="cover"
source={{ uri: 'https://placeimg.com/400/400/any' }}
style={[styles.welcome]}
/>
<Text onPress={() => { alert('我是文字') }}>React Native Text</Text>
</View>
)
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F2F2F2',
},
welcome: {
width: 400,
height: 400,
},
})
export default CodePush(codePushOptions)(App)
checkHotUpdate.js
export default (CodePush) => {
CodePush.sync(
{
installMode: CodePush.InstallMode.IMMEDIATE,
// updateDialog: {},
},
(status) => {
switch (status) {
case CodePush.SyncStatus.CHECKING_FOR_UPDATE: // 檢查更新
break
case CodePush.SyncStatus.DOWNLOADING_PACKAGE: // 正在下載
break
case CodePush.SyncStatus.AWAITING_USER_ACTION: // 等待使用者操作
break
case CodePush.SyncStatus.INSTALLING_UPDATE: // 下載更新
break
case CodePush.SyncStatus.UP_TO_DATE: // 已更新
break
case CodePush.SyncStatus.UPDATE_IGNORED: // 忽略更新
break
case CodePush.SyncStatus.UPDATE_INSTALLED:
break
case CodePush.SyncStatus.UNKNOWN_ERROR: // 未知錯誤
break
}
},
({ receivedBytes, totalBytes }) => {
// const progress = parseFloat(receivedBytes / totalBytes).toFixed(2)
if (receivedBytes >= totalBytes) {
CodePush.allowRestart() // 強制更新
}
},
)
}
七、 如何釋出CodePush更新包
7.1、手動生成bundle包【可略過】
在將RN的
bundle
放到 AppCenter 伺服器之前,我們需要先生成bundle
,再將bundle
上傳到 AppCenter。用到的資料夾必須已經存在。
生成 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/main.jsbundle --assets-dest ./bundle/android --dev false
7.2、生成並上傳bundle
生成bundle檔案並上傳到CodePush,我們直接執行下面的命令即可
$ code-push release-react <AppName> <Platform> --t <本更新包面向的舊版本號> --des <本次更新說明>
CodePush 預設是更新 Staging 環境的,如果釋出生產環境的更新包,需要指定
-d
引數:-d Production
,如果釋出的是強制更新包,需要加上-m true
強制更新
$ code-push release-react iOSRNHybrid ios --t 1.0.0 --dev false --des '這是第一個更新包' -d Production -m true
7.3、檢視釋出的歷史記錄
$ code-push deployment history <projectName> <Staging/Production>
八、部署管理
8.1、新增部署環境(可選)
當一個用 AppCenter 服務註冊的應用,它預設包含兩個部署環境:Staging
和 Production
。這讓你可以理解發布更新到一個內部的環境,你可以在推送到終端使用者之前徹底的測試每個更新。這個工作流是至關重要的,以確保你的版本準備好給大眾,而且這是一個在Web上實踐很久的慣例。
如果你的App有 Staging
和 Production
環境其實已經滿足了你的需求,然後你不需要做任何事情。不過,如果你需要 alpha
,dev
等部署環境,那你可以簡單的使用如下命令建立:
$ code-push deployment add <appName> <deploymentName>
8.2、部署環境key配置
安卓
- 開啟
android/app/build.gradle
,找到android { buildTypes {} }
部分併為你的debug
和release
構建型別都定義buildConfigField
配置項。構建型別debug
對應 AppCenter 釋出型別Staging
,同理release
對應Production
。如果你喜歡,你可以定義把你的key定義在gradle.properties
,然後引用他們。怎麼配置全憑個人喜好。
android {
...
buildTypes {
debug {
...
// 注意: 由於會被 RN packager 覆蓋,所以CodePush 更新不應該在 Debug 模式下被測試。然而由於 CodePush 在所有模式下都會檢查更新,所有我們必須提供一個key(如果你在前端判斷了模式,那就不用)
buildConfigField "String", "CODEPUSH_KEY", '""'
...
}
releaseStaging {
...
buildConfigField "String", "CODEPUSH_KEY", '"<INSERT_STAGING_KEY>"'
...
}
release {
...
buildConfigField "String", "CODEPUSH_KEY", '"<INSERT_PRODUCTION_KEY>"'
...
}
}
...
}
- 提醒一句,你可以在命令列通過
code-push deployment ls <APP_NAME> -k
獲取他們的keys
。 -
releaseStaging
的命名是由於這一行 -
通過剛剛定義的構建配置將部署金鑰傳遞給CodePush建構函式,而不是字串文字。
開啟 src/main/.../MainApplication.java
檔案並做如下配置:
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
...
new CodePush(BuildConfig.CODEPUSH_KEY, MainApplication.this, BuildConfig.DEBUG), // Add/change this line.
...
);
}
九、附錄
9.1、參考
- Microsoft/code-push
- Microsoft/react-native-code-push
- code-push中文問檔
- CodePush熱更新詳細接入教程
- React Native熱更新部署/熱更新-CodePush最新整合總結(新)
9.2、命令
手動生成bundle
$ react-native bundle --platform 平臺 --entry-file 啟動檔案 --bundle-output 打包js輸出檔案 --assets-dest 資源輸出目錄 --dev 是否除錯
賬號相關
code-push register
: 註冊code-push login
: 登陸code-push login --accessKey <accessKey>
: 執行“無頭”身份驗證,而不是啟動一個瀏覽器code-push logout
: 登出code-push whoami
: 顯示與你當前認證會話相關的e-mail帳號
token相關
code-push access-key ls
: 列出登陸的tokencode-push access-key rm <accessKye>
: 刪除某個 access-keycode-push access-key add "VSTS Integration"
: 建立一個持久的Access Key(連同一個描述)
app相關
code-push app add iOSRNHybrid ios react-native
: 新增ios平臺應用code-push app add iOSRNHybridForAndroid Android react-native
: 新增android平臺應用code-push app ls
: 檢視新增的appcode-push app rm <appName>
: 在賬號裡移除一個appcode-push app rename <appName> <newAppName>
: 重新命名一個存在的appcode-push app transfer
: 把app的所有權轉移到另外一個賬號
應用合作
$ code-push collaborator add <appName> <collaboratorEmail>
: 和其它開發者在一起合作同一個CodePush應用code-push collaborator rm <appName> <collaboratorEmail>
: 解除合作者關係code-push collaborator ls <appName>
: 列出所有合作者
釋出相關
code-push release-react <AppName> <Platform> --t <本更新包面向的舊版本號> --des <本次更新說明> -d <Staging/Production> -m <是否強制更新>
: 釋出新的熱更新版本
部署相關
code-push deployment add <appName> <deploymentName>
: 新增部署環境code-push deployment rm <appName> <deploymentName>
: 刪除部署環境code-push deployment rename <appName> <deploymentName> <newDeploymentName>
: 重新命名部署環境code-push deployment ls <appName> [--displayKeys|-k]
: 檢視部署環境列表code-push deployment history <projectName> <Staging/Production>
: 檢視釋出歷史code-push deployment clear <appName> <deploymentName>
: 清除釋出歷史
私塾國際學府·技術團隊 創建於 2018/11/13 下午6:31:01
本部落格所有文章均採用CC BY-NC-SA 3.0許可協議。
原文 http://techblog.sishuxuefu.com/atricle.html?5beaa7e59f5454007039e01c