React Native支持你們用React Native技術開發APP,並打包生成一個APP。在動態更新方面React Native只是提供了動態更新的基礎,對將應用部署到哪裏,如何進行動態更新並無支持的那麼完善。好在微軟開發了CodePush,填補React Native 應用在動態更新方面的空白。CodePush 是微軟提供的一套用於熱更新 React Native 和 Cordova 應用的服務。下面將向你們分享如何使用CodePush實時更新你的應用。java
CodePush 是微軟提供的一套用於熱更新 React Native 和 Cordova 應用的服務。
CodePush 是提供給 React Native 和 Cordova 開發者直接部署移動應用更新給用戶設備的雲服務。CodePush 做爲一箇中央倉庫,開發者能夠推送更新 (JS, HTML, CSS and images),應用能夠從客戶端 SDK 裏面查詢更新。CodePush 可讓應用有更多的可肯定性,也可讓你直接接觸用戶羣。在修復一些小問題和添加新特性的時候,不須要通過二進制打包,能夠直接推送代碼進行實時更新。node
CodePush 能夠進行實時的推送代碼更新:react
CodePush開源了react-native版本,react-native-code-push託管在GitHub上。android
在終端輸入以下:ios
1 npm install -g code-push-cli
1 code-push -v //查看版本
1 code-push register
在終端輸入code-push register
,會打開註冊頁面讓你選擇受權帳號。受權經過以後,CodePush會告訴你「access key」,複製此key到終端便可完成註冊。 https://appcenter.ms/git
第一步:在項目中安裝 react-native-code-push插件,終端進入你的項目根目錄而後運行github
1 npm install --save react-native-code-push
第二步: 運行 npm link react-native-code-push
。這條命令將會自動幫咱們在anroid文件中添加好設置npm
第三步: 在 android/app/build.gradle文件裏面添以下代碼:react-native
1 apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
若是第二步沒有成功,則手動配置app
1 ... 2 dependencies { 3 ... 4 implementation project(':react-native-code-push') 5 ... 6 } 7 ...
在/android/settings.gradle中添加以下代碼:
1 include ':react-native-code-push' 2 project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')
在/android/app/src/com/.../.../MainApplication.java中添加以下代碼:
1 ... 2 import com.microsoft.codepush.react.CodePush; 3 4 ... 5 6 @Override 7 protected String getJSBundleFile() { 8 return CodePush.getJSBundleFile(); 9 } 10 11 ... 12 13 @Override 14 protected List<ReactPackage> getPackages() { 15 return Arrays.<ReactPackage>asList( 16 ... 17 new CodePush(CODEPUSH_KEY_STAGING, getApplicationContext(), BuildConfig.DEBUG) 18 ); 19 } 20 ...
第四步: 運行 code-push deployment -k ls <appName>
獲取 部署祕鑰。默認的部署名是 staging,因此 部署祕鑰(deployment key ) 就是 staging。
第五步: 添加配置。當APP啓動時咱們須要讓app向CodePush諮詢JS bundle的所在位置,這樣CodePush就能夠控制版本。更新 MainApplication.java文件:
1 public class MainApplication extends MultiDexApplication implements ReactApplication { 2 3 private final String CODEPUSH_KEY_PRODUCTIO = "ZaHJQhSDR7XVGMMjzbQnc686dbac"; 4 private final String CODEPUSH_KEY_STAGING = "wiIxKA1Hp7g3Tb5Phytc686dbac-"; 5 private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 6 7 8 9 @Override 10 protected String getJSBundleFile() { 11 return CodePush.getJSBundleFile(); 12 } 13 14 @Override 15 public boolean getUseDeveloperSupport() { 16 return BuildConfig.DEBUG; 17 } 18 19 @Override 20 protected List<ReactPackage> getPackages() { 21 return Arrays.<ReactPackage>asList( 22 new CodePush(CODEPUSH_KEY_STAGING, getApplicationContext(), BuildConfig.DEBUG) 23 ); 24 } 25 26 @Override 27 protected String getJSMainModuleName() { 28 return "index"; 29 } 30 }; 31 32 @Override 33 public ReactNativeHost getReactNativeHost() { 34 return mReactNativeHost; 35 } 36 37 }
第六步:修改versionName。
在 android/app/build.gradle中有個 android.defaultConfig.versionName屬性,咱們須要把 應用版本改爲 0.0.1(默認是1.0,可是codepush須要三位數)。
1 android{ 2 defaultConfig{ 3 versionName "0.0.1" 4 }
第二步: 運行 rnpm link react-native-code-push
。這條命令將會自動幫咱們在ios中添加好設置
在終端運行此命令以後,終端會提示讓你輸入deployment key,這是你只需將你的deployment Staging key輸入進去便可,若是不輸入則直接單擊enter跳過便可。
若是第二部沒有成功則手動link 。
1,首先在node_modules 中找到這個codepush 文件,而後拖進去以下圖
2,特別注意一點因爲這個庫須要一個link 一個靜態庫(libz)以下圖所示
3,添加codepush的頭文件路徑,在 header Search Paths 中添加這句
1 $(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush
第三步: 在build Settings頁籤中單擊 + 按鈕而後選擇添加User-Defined Setting,而後輸入CODEPUSH_KEY(名稱隨意),而後填入deployment key:
第四步:打開 Info.plist文件,在CodePushDeploymentKey中輸入$(CODEPUSH_KEY),並修改Bundle versions爲三位
一、首先最簡單的一種就是 這種無聲的熱更新,也就是說熱更新不會給用戶任何提示,都在默默的進行更新,用戶徹底體會不到整個過程
classMyAppextendsComponent<{}> {}
MyApp= codePush(MyApp);
exportdefaultMyApp;
二、第二種 也是無聲更新,比第一種狀況多了一種就是熱更新每次會在後臺返回前臺的時候進行熱更新。這裏能夠看到幾個參數,
checkFrequency有三種狀態以下
ON_APP_START: //在組件初始化的時候進行熱更新
ON_APP_RESUME://在每次app從後臺回到前臺的時候進行熱更新
MANUAL://不進行熱更新,須要本身手動配置
InstallMode 有以下幾種狀態
IMMEDIATE :// 安裝熱更新,而且重啓app
ON_NEXT_RESTART: //下次啓動的時候啓動熱更新
ON_NEXT_RESUME //從後臺回到前臺的時候啓動
ON_NEXT_SUSPEND: 在後臺的時候進行熱更新
classMyAppextendsComponent<{}> {}
MyApp= codePush({ checkFrequency: codePush.CheckFrequency.ON_APP_RESUME, installMode: codePush.InstallMode.ON_NEXT_RESUME})(MyApp);
exportdefaultMyApp;
updateDialog 當爲true 是,能夠在更新的時候提示用戶須要更新
1,登錄成功後,使用code-push app add <appName> <os> <platform>建立一個app,以下:
1 code-push app add Test-ios ios react-native
建立成功後會返回對應的deployment key,將其拷貝到對應的配置文件便可
iOS:
Android:
... import java.util.Arrays; import java.util.List; public class MainApplication extends MultiDexApplication implements ReactApplication { private final String CODEPUSH_KEY_PRODUCTIO = "CuEhrwd_ZaHJ"; private final String CODEPUSH_KEY_STAGING = "XoFT5uAm_wiI"; private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { ...
2,配置js
1 CodePush.sync({ 2 updateDialog: { 3 //是否顯示更新描述 4 appendReleaseDescription : true , 5 //更新描述的前綴。 默認爲"Description" 6 descriptionPrefix : '' , 7 mandatoryUpdateMessage: '', 8 //強制更新按鈕文字,默認爲continue 9 mandatoryContinueButtonLabel : '當即更新' , 10 //非強制更新時,按鈕文字,默認爲"ignore" 11 optionalIgnoreButtonLabel : '稍後', 12 //非強制更新時,確認按鈕文字. 默認爲"Install" 13 optionalInstallButtonLabel : '後臺更新', 14 //非強制更新時,檢查到更新的消息文本 15 optionalUpdateMessage : ' ' , 16 //Alert窗口的標題 17 title : '更新提示' 18 }, 19 mandatoryInstallMode: CodePush.InstallMode.IMMEDIATE, 20 deploymentKey: CODE_PUSH_STAGING, 21 },(status) => { 22 switch (status) { 23 case CodePush.SyncStatus.CHECKING_FOR_UPDATE: 24 //alert(CodePush.SyncStatus.CHECKING_FOR_UPDATE); 25 break; 26 // case CodePush.SyncStatus.AWAITING_USER_ACTION: 27 // alert('codePush.SyncStatus.AWAITING_USER_ACTION'); 28 // break; 29 case CodePush.SyncStatus.DOWNLOADING_PACKAGE: 30 //應用更新中,請稍後... 31 break; 32 case CodePush.SyncStatus.INSTALLING_UPDATE: 33 CodePush.allowRestart(); 34 break; 35 case CodePush.SyncStatus.UP_TO_DATE: 36 //當前已經是最新版本 37 break; 38 // case CodePush.SyncStatus.UPDATE_IGNORED: 39 // alert('codePush.SyncStatus.UPDATE_IGNORED'); 40 // break; 41 // case CodePush.SyncStatus.UPDATE_INSTALLED: 42 // alert('codePush.SyncStatus.UPDATE_INSTALLED'); 43 // break; 44 // case CodePush.SyncStatus.SYNC_IN_PROGRESS: 45 // alert('codePush.SyncStatus.SYNC_IN_PROGRESS'); 46 // break; 47 // case CodePush.SyncStatus.UNKNOWN_ERROR: 48 // alert('codePush.SyncStatus.UNKNOWN_ERROR'); 49 //break; 50 } 51 },
code-push release-react <appName> <os> --description "1.描述"
1 code-push release-react Test-ios ios --description "1.測試熱更新"
1 code-push release-react Test-android android --description "1.測試熱更新"
如下發布更新需手動打包:
code-push release <應用名稱> <Bundles所在目錄> <對應的應用版本> --deploymentName: 更新環境 --description: 更新描述 --mandatory: 是否強制更新
1 react-native bundle --platform ios --entry-file index.js --bundle-output ./bundles/index.ios.bundle --dev false 2 3 code-push release Test-ios ./bundles/index.ios.bundle 1.0.0 --description "1.測試熱更新" --mandatory false