1. 程式人生 > >react-native熱更新

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 環境其實已經滿足了你的需求,然後你不需要做任何事情。不過,如果你需要 alphadev等部署環境,那你可以簡單的使用如下命令建立:

$ code-push deployment add <appName> <deploymentName>

8.2、部署環境key配置

安卓

  1. 開啟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>"'
            ...
        }
    }
    ...
}
  1. 提醒一句,你可以在命令列通過 code-push deployment ls <APP_NAME> -k 獲取他們的 keys
  2. releaseStaging 的命名是由於這一行

  3. 通過剛剛定義的構建配置將部署金鑰傳遞給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、參考

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: 列出登陸的token
  • code-push access-key rm <accessKye>: 刪除某個 access-key
  • code-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: 檢視新增的app
  • code-push app rm <appName>: 在賬號裡移除一個app
  • code-push app rename <appName> <newAppName>: 重新命名一個存在的app
  • code-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