在此簡單記錄下CodePush的使用,以備以后使用。
環(huán)境版本
react-native:0.61
react-native-code-push:6.2.0
CodePush安裝
- 安裝App Center CLI
// 打開終端,直接輸入以下代碼,安裝App Center CLI
npm install -g appcenter-cli
- 登錄現(xiàn)有的CodePush帳戶或創(chuàng)建新的App Center帳戶
appcenter login
此命令將啟動一個(gè)瀏覽器窗口,要求您使用GitHub或Microsoft帳戶進(jìn)行身份驗(yàn)證。它將生成一個(gè)訪問密鑰,您必須將其復(fù)制/粘貼到CLI中(它將提示您輸入密碼)。
- 其他相關(guān)命令
// 退出登錄
appcenter logout
// 查看賬戶信息
appcenter profile list
- 在App Center創(chuàng)建應(yīng)用
// appDisplayName:創(chuàng)建的應(yīng)用名稱
// operatingSystem:iOS或者Android操作系統(tǒng)
appcenter apps create -d <appDisplayName> -o <operatingSystem> -p React-Native
// 針對iOS和Android單獨(dú)創(chuàng)建應(yīng)用 --
// 1、創(chuàng)建iOS應(yīng)用
appcenter apps create -d MyApp-iOS -o iOS -p React-Native
// 2、創(chuàng)建Android應(yīng)用
appcenter apps create -d MyApp-Android -o Android -p React-Native
- 其他相關(guān)命令
// 查詢賬號下的所有應(yīng)用
appcenter apps list
- 給應(yīng)用配置環(huán)境(開發(fā)、生產(chǎn))
// ownerName:用戶名稱
// appName:創(chuàng)建的應(yīng)用名稱
// 配置開發(fā)環(huán)境
appcenter codepush deployment add -a <ownerName>/<appName> Staging
// 配置生產(chǎn)環(huán)境
appcenter codepush deployment add -a <ownerName>/<appName> Productionn
- 其他相關(guān)命令
// ownerName:用戶名稱
// appName:創(chuàng)建的應(yīng)用名稱
// 刪除應(yīng)用的開發(fā)環(huán)境
appcenter codepush deployment remove -a <ownerName>/<appName> Staging
// 刪除應(yīng)用的生產(chǎn)環(huán)境
appcenter codepush deployment remove -a <ownerName>/<appName> Production
// appName:應(yīng)用名稱
// 查看該應(yīng)用下的所有配置環(huán)境
code-push deployment ls <appName> -k
以上是在App Center配置相關(guān)內(nèi)容的所有命令
除了使用指令來創(chuàng)建配置應(yīng)用外,還可以直接去App Center進(jìn)行配置查看
AppCenter可視化操作
- 點(diǎn)擊右上角
Add new按鈕選擇Add new app創(chuàng)建新應(yīng)用,然后根據(jù)提示框進(jìn)行填寫內(nèi)容。
注意:此處填寫,還是 建議將iOS和Android分開創(chuàng)建,方便后期管理。 - 點(diǎn)擊創(chuàng)建好的應(yīng)用,進(jìn)入配置界面(此處以“Test-iOS”作為例子)。點(diǎn)擊左側(cè)菜單欄,選擇
Distribute,選擇CodePush。
2.jpeg - 配置開發(fā)環(huán)境。點(diǎn)擊
Create standard deployments按鈕后,將自動給該應(yīng)用創(chuàng)建好Staging和Production兩種環(huán)境。 - 查看、修改、刪除配置環(huán)境。點(diǎn)擊右上角??按鈕,可以查看當(dāng)前應(yīng)用的兩種配置環(huán)境。點(diǎn)擊配置環(huán)境后的
...可以修改和刪除對應(yīng)的環(huán)境。
App Center的基本使用就這些,詳細(xì)的其他使用方法,可以根據(jù)界面提示自我探索。
RN應(yīng)用中配置CodePush
此處直接進(jìn)行多環(huán)境配置
- 項(xiàng)目安裝配置CodePush三方庫
npm install --save react-native-code-push
- 將
CodePush與組件綁定使用
import codePush from "react-native-code-push";
class MyApp extends Component {
// ...
}
let codePushOptions = {
// 何時(shí)檢查更新(ON_APP_START:程序啟動 ON_APP_RESUME:程序從后臺進(jìn)入前臺 MANUAL:手動控制)
checkFrequency: codePush.CheckFrequency.ON_APP_RESUME,
// 何時(shí)安裝(ON_NEXT_RESTART:下次程序啟動 ON_NEXT_RESUME:下次程序從后臺進(jìn)入前臺 ON_NEXT_SUSPEND:在后臺更新 IMMEDIATE:立即更新,并啟動程序)
installMode: codePush.InstallMode.IMMEDIATE,
// 表示重啟程序之前,在后臺呆的最短時(shí)間
minimumBackgroundDuration: 0,
// 強(qiáng)制更新,并啟動
mandatoryInstallMode: codePush.InstallMode.IMMEDIATE,
// 更新時(shí)候的提示更新框
updateDialog: {
// 標(biāo)題
title: '發(fā)現(xiàn)新版本',
// 確認(rèn)按鈕標(biāo)題
optionalInstallButtonLabel: '更新',
// 忽略按鈕標(biāo)題
optionalIgnoreButtonLabel: '忽略',
// 非強(qiáng)制更新情況下,提示框內(nèi)容
optionalUpdateMessage: '有新內(nèi)容,是否需要更新?',
// 強(qiáng)制更新按鈕標(biāo)題
mandatoryContinueButtonLabel: '立即更新',
// 強(qiáng)制更新情況下,提示框內(nèi)容
mandatoryUpdateMessage: '有新內(nèi)容,請立即更新',
// 是否將版本描述添加在提示框中
appendReleaseDescription: true,
// 添加的描述前綴
descriptionPrefix: '更新內(nèi)容:',
}
};
export default codePush(codePushOptions)(App);
iOS中配置環(huán)境
設(shè)置 iOS GitHub地址
配置iOS環(huán)境GitHub地址
- 打開
AppDelegate.m文件,添加頭文件
#import <CodePush/CodePush.h>
- 替換捆綁JS文件,只有在release狀態(tài)下,才會調(diào)用CodePush服務(wù)器中的代碼
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
return [CodePush bundleURL];
#endif
}
- 添加Staging配置環(huán)境。用
Xcode打開ios項(xiàng)目,選中項(xiàng)目,點(diǎn)擊PROJECT下的項(xiàng)目名,點(diǎn)擊菜單欄info,找到Configurations項(xiàng)點(diǎn)擊+選擇Duplicate "Release" Configuration進(jìn)行添加
4-3.jpeg
注意:上圖是已經(jīng)添加過Staging配置環(huán)境的 - 配置多環(huán)境的秘鑰。選擇
info旁邊的Build Settings按鈕,點(diǎn)擊菜單欄中+按鈕,選擇Add User-Defined Setting進(jìn)行添加
4-4.jpeg - 配置
User-Defined,一共需要添加2項(xiàng)自定義配置。
- 第一個(gè)配置,名稱設(shè)置為
CODEPUSH_KEY,將項(xiàng)目在CodePush中的Staging秘鑰對應(yīng)到Staging環(huán)境中,Production秘鑰對應(yīng)到Release環(huán)境中,Debug環(huán)境中置空。 - 第二個(gè)配置,名稱設(shè)置為
CONFIGURATION_BUILD_DIR,Staging環(huán)境中配置$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME),Release和Debug環(huán)境中配置$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)。
注意:第二個(gè)配置,需要先配置三個(gè)環(huán)境值,再設(shè)置名稱,否則Xcode會閃退,因?yàn)?code>CONFIGURATION_BUILD_DIR對應(yīng)下的值不能為空
4-5.png
- 配置
Info.plist,打開項(xiàng)目的Info.plist添加一組值,名為CodePushDeploymentKey,值為$(CODEPUSH_KEY)
4-6.png - 執(zhí)行
pod install - 運(yùn)行項(xiàng)目。用
Xcode打開項(xiàng)目,選擇對應(yīng)的環(huán)境運(yùn)行,如果運(yùn)行顯示成功,則項(xiàng)目配置完成。
注意:如果選擇Staging運(yùn)行報(bào)錯(cuò),則可以先運(yùn)行Release環(huán)境,等Release狀態(tài)運(yùn)行成功后,再切換為Staging來運(yùn)行,目前不知道為什么會這樣。 - 進(jìn)行測試,進(jìn)行更新。關(guān)閉運(yùn)行的應(yīng)用,此時(shí)相當(dāng)于在模擬器上打包了一個(gè)對應(yīng)環(huán)境的應(yīng)用程序。打開終端,進(jìn)入
RN應(yīng)用的根目錄,輸入以下命令進(jìn)行更新提交。提交后,點(diǎn)擊模擬器上安裝的應(yīng)用,進(jìn)行查看熱更新情況。
// ownerName:賬戶名稱
// 提交Staging環(huán)境下的代碼
appcenter codepush release-react -a <ownerName>/App-iOS -d Staging
// 提交Production環(huán)境下的代碼
appcenter codepush release-react -a <ownerName>/App-iOS -d Production
// 強(qiáng)制更新
appcenter codepush release-react -a <ownerName>/App-iOS -m
// 添加更新說明
appcenter codepush release-react -a <ownerName>/App-iOS --description "修改bug"
Android中配置環(huán)境
設(shè)置 Android GitHub地址
配置Android環(huán)境GitHub地址
- 在
android/settings.gradle文件中添加下列代碼
include ':app', ':react-native-code-push'
project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')
- 在
android/app/build.gradle文件中添加下列代碼
- 添加
codepush.gradle
...
apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
...
- 在
android { buildTypes {} }中,給配置環(huán)境添加CodePush的秘鑰
android {
...
buildTypes {
debug {
...
// 注意:不應(yīng)該在Debug模式下測試CodePush更新功能,因?yàn)檫@會被RN的程序所覆蓋
resValue "string", "CodePushDeploymentKey", '""'
...
}
releaseStaging {
...
// StagingKey是CodePush處申請的Staging狀態(tài)的下的秘鑰
resValue "string", "CodePushDeploymentKey", '"StagingKey"'
// Note: It is a good idea to provide matchingFallbacks for the new buildType you create to prevent build issues
// Add the following line if not already there
matchingFallbacks = ['release']
...
}
release {
...
// ProductionKey是CodePush處申請的Production狀態(tài)的下的秘鑰
resValue "string", "CodePushDeploymentKey", '"ProductionKey"'
...
}
}
...
}
補(bǔ)充:獲取Android應(yīng)用配置環(huán)境的key命令:code-push deployment ls <appName> -k
- 更新
MainApplication.java文件
...
// 1. 導(dǎo)入插件
import com.microsoft.codepush.react.CodePush;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
...
// 2. 重寫getJSBundleFile方法,讓CodePush確定從App哪里獲取JS包
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
};
}
- 打包應(yīng)用,測試
CodePush更新功能(同iOS大同小異)。




