react-native集成code-push(熱更新)

安裝與注冊(cè)CodePush

安裝CodePush CLI

在終端輸入

npm install -g code-push-cli

安裝完成后輸入code-push -v 查看版本號(hào)

code-push -v
image.png

創(chuàng)建一個(gè)CodePush 賬號(hào)

在終端輸入code-push register 瀏覽器會(huì)打開注冊(cè)頁面 選擇一個(gè)品臺(tái)注冊(cè)成功后code-push 會(huì)給一個(gè)access key,復(fù)制,然后登錄

code-push register
image.png

在CodePush服務(wù)器注冊(cè)app

為了讓CodePush服務(wù)器知道你的app,我們需要向它注冊(cè)app: 在終端輸入code-push app add <appName> <os> <platform> 即可完成注冊(cè)。

image.png

注冊(cè)完成之后會(huì)返回一套deployment key,該key在后面步驟中會(huì)用到。

集成CodePush SDK

android

下面我們通過如下步驟在Android項(xiàng)目中集成CodePush。
第一步:在項(xiàng)目中安裝 react-native-code-push插件,終端進(jìn)入你的項(xiàng)目根目錄然后運(yùn)行

npm install --save  react-native-code-push

第二步: 運(yùn)行 react-native link react-native-code-push。這條命令將會(huì)自動(dòng)幫我們?cè)赼nroid文件中添加好設(shè)置。

第三步: 在 android/app/build.gradle文件里面添代碼(如果存在就不用添加):

apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"

然后在/android/settings.gradle中添加如下代碼(如果存在就不用添加):

include ':react-native-code-push'
project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')

第四步: 在終端運(yùn)行 code-push deployment ls <appName> -k獲取 部署秘鑰。


image.png

第五步:添加配置
①打開android/app/build.gradle文件,找到android { buildTypes {} }然后添加如下代碼即可:

release {
//省略其他代碼
          buildConfigField "String", "CODE_PUSH_KEY", CODE_PUSH_KEY_PRODUCTION
        }
debug {
            buildConfigField "String", "CODE_PUSH_KEY", CODE_PUSH_KEY_STAGING
        }

②android項(xiàng)目下gradle.properties添加


image.png
CODE_PUSH_KEY_PRODUCTION="你的production_key XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
CODE_PUSH_KEY_STAGING="你的staging_key XXXXXXXXXXXXXXXXXXXXXXXX"

③更新 MainApplication.java文件

 @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
            new CodePush(BuildConfig.CODE_PUSH_KEY, getApplicationContext(), BuildConfig.DEBUG),
      );
    }
// 如果已經(jīng)自動(dòng)生成就不用添加
 @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }

④修改versionName
在 android/app/build.gradle中有個(gè) android.defaultConfig.versionName屬性,我們需要把 應(yīng)用版本改成 1.0.0(默認(rèn)是1.0,但是codepush需要三位數(shù))。

android{
    defaultConfig{
        versionName "1.0.0"
    }
}

android 集成完畢。

使用CodePush進(jìn)行熱更新

最好在項(xiàng)目根。component中進(jìn)行上述策略控制
引入

import codePush from 'react-native-code-push' 

.在 componentDidMount中調(diào)用 sync方法,后臺(tái)請(qǐng)求更新

componentDidMount(){
  codePush.sync({
            updateDialog:{
                appendReleaseDescription:true,
                descriptionPrefix:'更新內(nèi)容',
                title:'更新',
                mandatoryUpdateMessage:'',
                mandatoryContinueButtonLabel:'更新',
            }
        })
}

sync方法,提供了如下屬性以允許你定制sync方法的默認(rèn)行為

deploymentKey (String): 部署key,指定你要查詢更新的部署秘鑰,默認(rèn)情況下該值來自于Info.plist(Ios)和MianActivity.java(Android)文件,你可以通過設(shè)置該屬性來動(dòng)態(tài)查詢不同部署key下的更新。
installMode (codePush.InstallMode): 安裝模式,用在向CodePush推送更新時(shí)沒有設(shè)置強(qiáng)制更新(mandatory為true)的情況下,默認(rèn)codePush.InstallMode.ON_NEXT_RESTART即下一次啟動(dòng)的時(shí)候安裝。
mandatoryInstallMode (codePush.InstallMode):強(qiáng)制更新,默認(rèn)codePush.InstallMode.IMMEDIATE。
minimumBackgroundDuration (Number):該屬性用于指定app處于后臺(tái)多少秒才進(jìn)行重啟已完成更新。默認(rèn)為0。該屬性只在installMode為InstallMode.ON_NEXT_RESUME情況下有效。
updateDialog (UpdateDialogOptions) :可選的,更新的對(duì)話框,默認(rèn)是null,包含以下屬性
appendReleaseDescription (Boolean) - 是否顯示更新description,默認(rèn)false
descriptionPrefix (String) - 更新說明的前綴。 默認(rèn)是” Description: “
mandatoryContinueButtonLabel (String) - 強(qiáng)制更新的按鈕文字. 默認(rèn) to “Continue”.
mandatoryUpdateMessage (String) - 強(qiáng)制更新時(shí),更新通知. Defaults to “An update is available that must be installed.”.
optionalIgnoreButtonLabel (String) - 非強(qiáng)制更新時(shí),取消按鈕文字. Defaults to “Ignore”.
optionalInstallButtonLabel (String) - 非強(qiáng)制更新時(shí),確認(rèn)文字. Defaults to “Install”.
optionalUpdateMessage (String) - 非強(qiáng)制更新時(shí),更新通知. Defaults to “An update is available. Would you like to install it?”.
title (String) - 要顯示的更新通知的標(biāo)題. Defaults to “Update available”.

=======================================================
如果可以進(jìn)行更新,CodePush會(huì)在后臺(tái)靜默地將更新下載到本地,等待APP下一次啟動(dòng)的時(shí)候應(yīng)用更新,以確保用戶看到的是最新版本。
如果更新是強(qiáng)制性的,更新文件下載好之后會(huì)立即進(jìn)行更新。
如果你期望更及時(shí)的獲得更新,可以在每次APP從后臺(tái)進(jìn)入前臺(tái)的時(shí)候去主動(dòng)的檢查更新:
在應(yīng)用的根component的componentDidMount中添加如下代碼:

AppState.addEventListener("change", (newState) => {
    newState === "active" && codePush.sync();
});

發(fā)布更新

CodePush支持兩種發(fā)布更新的方式,一種是通過code-push release-react簡(jiǎn)化方式,另外一種是通過code-push release的復(fù)雜方式。
①code-push release-react <appName> <platform>

code-push release-react aaa android
or
code-push release-react aaa android  --t 1.0.0 --dev false --d Production --des "更新內(nèi)容" --m true
// 其中參數(shù)–t為二進(jìn)制(.ipa與apk)安裝包的的版本;–dev為是否啟用開發(fā)者模式(默認(rèn)為false);–d是要發(fā)布更新的環(huán)境分Production與Staging(默認(rèn)為Staging);–des為更新說明;–m 是強(qiáng)制更新。

這種方式將打包與發(fā)布兩個(gè)命令合二為一,可以說大大簡(jiǎn)化了我們的操作流程,建議大家多使用這種方式來發(fā)布更新。
②code-push release 方式(沒有使用不說了_).

圖片


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容