Code Push 熱更新使用詳細說明和教程
CodePush
CodePush是一個微軟開發的雲伺服器。通過它,開發者可以直接在使用者的裝置上部署手機應用更新。CodePush相當於一箇中心倉庫,開發者可以推送當前的更新(包括JS/HTML/CSS/IMAGE等)到CoduPush,然後應用將會查詢是否有更新。(歡迎關注我的gitHub)
流程
- 安裝 CodePush CLI。
- 建立一個CodePush 賬號
- 在CodePush伺服器註冊app
- 在app上新增CodePush SDK,配置升級相關程式碼。ReactNative可以參考這裡
- 更新程式碼後,釋出一個應用更新到伺服器
- 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
code-push access-key rm <accessKye>
刪除某個 access-key
三、在CodePush伺服器上註冊app
為了讓codePush伺服器知道你的app,我們需要向它註冊app: code-push app add <appName>
,就可以了。
CODE-PUSH APP相關命令
add
在賬號裡面新增一個新的appremove
或者rm
在賬號裡移除一個apprename
重新命名一個存在applist
或則ls
列出賬號下面的所有apptransfer
把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
檢視部署的keycode-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或圖片,原生程式碼的改變(二進位制打包)是不能通過它更新的。
- 服務端還木有開源,不能使用自己的伺服器
- 服務端在美國,國內可能會不穩定