1. 程式人生 > >Code Push 熱更新使用詳細說明和教程

Code Push 熱更新使用詳細說明和教程

CodePush

CodePush是一個微軟開發的雲伺服器。通過它,開發者可以直接在使用者的裝置上部署手機應用更新。CodePush相當於一箇中心倉庫,開發者可以推送當前的更新(包括JS/HTML/CSS/IMAGE等)到CoduPush,然後應用將會查詢是否有更新。(歡迎關注我的gitHub

流程

  1. 安裝 CodePush CLI
  2. 建立一個CodePush 賬號
  3. 在CodePush伺服器註冊app
  4. 在app上新增CodePush SDK,配置升級相關程式碼。ReactNative可以參考這裡
  5. 更新程式碼後,釋出一個應用更新到伺服器
  6. app收到升級推送

一、安裝CodePush CLI

管理 CodePush 賬號需要通過 NodeJS-based CLI.
只需要在控制檯輸入 npm install -g code-push-cli

,就可以安裝了。
安裝完畢後,輸入 code-push -v檢視版本代表成功。
目前我的版本是 1.1.1-beta

二、建立CodePush賬號

在控制檯輸入 code-push register 後,將會開啟一個網頁進行註冊
CodePush賬號支援 github和 Microsofe,選其中一個就可以了。
我選擇的是 github,授權完畢後,網頁將會顯示一個token,複製它到控制檯的中就成功了。

成功登陸後,你的session檔案將會寫在 /Users/guanMac/.code-push.config。

相關命令
  • code-push login 登陸
  • code-push loout 登出
  • code-push access-key ls
     列出登陸的token
  • code-push access-key rm <accessKye> 刪除某個 access-key

三、在CodePush伺服器上註冊app

為了讓codePush伺服器知道你的app,我們需要向它註冊app: code-push app add <appName>,就可以了。

CODE-PUSH APP相關命令
  • add 在賬號裡面新增一個新的app
  • remove 或者 rm 在賬號裡移除一個app
  • rename 重新命名一個存在app
  • list 或則 ls 列出賬號下面的所有app
  • transfer 把app的所有權轉移到另外一個賬號

四、在app中新增SDK,配置相關程式碼

由於我目前只開發了android,以下就以android為例。

第一步。在應用中安裝react-native外掛,npm install --save react-native-code-push

第二步。在Anroid project中安裝外掛。
CodePush提供了兩種方式:RNPM 和 Manual
如果你不想依賴其他工具或者願意走多幾步額外的步驟,可以使用 Manual。不過像我這麼懶的程式碼從業者,毫不猶豫地選擇了 RNPM 這個實用工具。

第三步 執行 npm i rnpm 安裝 RNPM。

第四步 執行 rnpm link react-native-code-push。這條命令將會自動幫我們在anroid檔案中新增好設定(其實就是通過Manual的安裝步驟)

第五步 在 android/app/build.gradle檔案裡面新增額為的建立任務:

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

第六步 執行 code-push deployment ls <appName>獲取 部署祕鑰。預設的部署名是 staging,所以 部署祕鑰(deployment key ) 就是 staging的可以。

第七步 新增配置。我們需要讓app向CodePush諮詢JS bundle的所在位置,這樣CodePush就可以控制版本。更新 MainActivity.java檔案:

 //1.引用包
 import com.microsoft.codepush.react.CodePush;
 public class MainActivity extends ReactActivity {
 //2.覆蓋 getJSBundleFile 方法,讓CodePush決定當app啟動時,去哪裡載入 JS bundle
    @Override
    protected String getJSBundleFile(){
        return CodePush.getBundleUrl():
    }
    
    @Override 
    protected List<ReactPackage> getPackages(){
        //例項化 CodePush執行時,把它新增到 packages,填寫正確的 部署祕鑰( deployment key)
        return Arrays.<ReactPackage> as List(
            new MainReactPackage(),
            new CodePush("deployment-key-here" , this , BuildCofig.DEBUG)
        )
    }
    
 }
 

第八步 在 android/app/build.gradle中有個 android.defaultConfig.versionName屬性,我們需要把 應用版本改成 1.0.0(預設是1.0,但是codepush需要三位數)。

    android{
        defaultConfig{
            versionName "1.0.0"
        }
    }

第九步 CodePush 外掛下載和關聯完畢後,就剩下在應用中部署更新控制策略:

  • 在 js中載入 CodePush模組: import codePush from 'react-native-code-push'
  • 在 componentDidMount中呼叫 sync方法,後臺請求更新 codePush.sync()

以上就是在app中新增sdk和配置了。具體的還可以參考官方文件

部署APP相關命令
  • code-push deployment add <appName> 部署
  • code-push deployment rename <appName> 重新命名
  • code-push deployment rm <appName> 刪除部署
  • code-push deployment ls <appName> 列出應用的部署情況
  • code-push deployment ls <appName> -k 檢視部署的key
  • code-push deployment history <appName> <deploymentNmae> 檢視歷史版本(Production 或者 Staging)

釋出更新

釋出更新之前,需要先把 js打包成 bundle,以下是anroid的做法:

第一步 在 工程目錄裡面新增 bundles檔案:mkdir bundles

第二步 執行命令打包 react-native bundle --platform 平臺 --entry-file 啟動檔案 --bundle-output 打包js輸出檔案 --assets-dest 資源輸出目錄 --dev 是否除錯
這是我的打包命名: react-native bundle --platform android --entry-file index.android.js --bundle-output ./bundles/index.android.bundle --dev false
需要注意的是:

  • 忽略了資源輸出是因為 輸出資原始檔後,會把bundle檔案覆蓋了
  • 輸出的bundle檔名不叫其他,而是 index.android.bundle,是因為 在debug模式下,工程讀取的bundle就是叫做 index.android.buundle
  • 平臺可以選擇 android 或者 ios。
  • 具體的命令可以參考這裡

打包bundle結束後,就可以通過CodePush釋出更新了。在控制檯輸入

code-push release <應用名稱> <Bundles所在目錄> <對應的應用版本>
    --deploymentName 更新環境
    --description 更新描述
    --mandatory 是否強制更新

注意:

  • CodePush預設是更新 staging 環境的,如果是staging,則不需要填寫 deploymentName。
  • 如果有 mandatory 則會讓客戶端強制更新
  • 對應的應用版本(targetBinaryVersion)是指當前app的版本,而不是你填寫的更新版本。譬如客戶端版本是 1.0.0,如果我們需要更新客戶端,那麼targetBinaryVersion填的就是 1.0.0。(踩了坑,半夜除錯到哭了- -)
  • 在控制檯輸入 code-push deployment history <appName> Staging 可以看到版本更新的時間、描述等等屬性。

這是我的輸入

code-push release Equipment ./bundles 1.0.1

CodePush還可以進行很多種更新控制

# Release a mandatory update with a changelog
code-push release-react MyApp ios -m --description "Modified the header color"

# Release an update for an app that uses a non-standard entry file name, and also capture
# the sourcemap file generated by react-native bundle
code-push release-react MyApp ios --entryFile MyApp.js --sourcemapOutput ../maps/MyApp.map

# Release a dev Android build to just 1/4 of your end users
code-push release-react MyApp-Android android --rollout 25% --dev true

# Release an update that targets users running any 1.1.* binary, as opposed to
# limiting the update to exact version name in the build.gradle file
code-push release-react MyApp-Android android --targetBinaryVersion "~1.1.0"

JS API

CHECKFORUPDATE

詢問伺服器是否有新版本。譬如:

    codePush.checkForUpdate()
    .then( (update) =>{
        if( !update ){
            console.log("app是最新版了");
        }else {
            console.log("有更新哦");
        }
    });
GETCURRENTPACKAGE

獲取當前已安裝更新的元資料(描述、安裝時間、大小等)。譬如:

    codePush.getCurrenPackage()
    .then( (info) =>{
        console.log(info);
    })
NOTIFYAPPLICATIONREADY

通知CodePush程序,一個更新安裝好了,當檢測並安裝更新,這個方法必須被呼叫。
否則在app重啟時,Codepush會認為update失敗,並回滾版本。
當使用 sync方法時,不需要呼叫此方法,因為它會預設呼叫

RESTARTAPP

立即重啟App

SYNC

允許檢測更新,下載並安裝。除非我們需要自定義UI表現,不然直接用這個方法就可以了。

注意

  • CodePush只能更新 js或圖片,原生程式碼的改變(二進位制打包)是不能通過它更新的。
  • 服務端還木有開源,不能使用自己的伺服器
  • 服務端在美國,國內可能會不穩定