搞了兩天,查了很多資料,發(fā)現(xiàn)網(wǎng)上很多資料太老了,把我配置的方法分享給大家,同時也記錄下
? ? ? ?codepush是微軟的一套用于熱更新的服務(wù),微軟的github地址:https://github.com/Microsoft/react-native-code-push,里面講述了詳細(xì)的使用方法。這里我就自己的操作做了一下調(diào)整。
一、全局配置
1.1 全局安裝 code-push 環(huán)境 npm install -g code-push-cli ,安裝成功則可以 code-push -v查看安裝的版本號
1.2 code-push register 注冊賬號,會在google瀏覽器打開注冊界面,然后注冊成功會拿到一個key 如下圖所示,如果已經(jīng)注冊過的話,code-push login 直接登錄

code-push login登陸
code-push logout注銷
code-push access-key ls列出登陸的token
code-push access-key rm 刪除某個 access-key
1.3 注冊應(yīng)用
code-push app add appName-ios ios react-native
code-push app add appName-android android react-native
其他命令如下:
code-push app add在賬號里面添加一個新的app
code-push app remove或者 rm 在賬號里移除一個app
code-push app rename重命名一個存在app
code-push app list或則 ls 列出賬號下面的所有app
code-push app transfer把app的所有權(quán)轉(zhuǎn)移到另外一個賬號
1.4 app里配置code-push SDK
- 進(jìn)入到你的項目目錄下,在終端里運行
- npm install --save react-native-code-push@latest 安裝code-push組件
- 與所有其他React Native第三方組件一樣,iOS和Android的集成方式不同,因此根據(jù)您平臺執(zhí)行以下設(shè)置步驟。 請注意,如果您要同時配置這兩個平臺,建議為每個平臺創(chuàng)建單獨的CodePush應(yīng)用程序
ios配置
一旦你獲得了CodePush插件,你需要將它集成到React Native應(yīng)用程序的Xcode項目并正確配置。 為此,請執(zhí)行以下步驟:
為了迎合盡可能多的開發(fā)人員的偏好,CodePush支持三種安裝方式:
1、 RNPM安裝 - React Native包管理器 (RNPM)是一個非常棒的工具,它為React Native插件提供了最簡單的安裝體驗。 我們推薦這種方法
(1)從React Native v0.27開始,rnpm鏈接已經(jīng)合并到React Native CLI中。運行以下命令:
react-native link react-native-code-push
如果您的應(yīng)用程序使用的版本低于v0.27的React Native,請運行以下命令:
rnpm link react-native-code-push
注意:如果您尚未安裝RNPM,可以通過簡單地運行npm i -g rnpm安裝rnpm然后再執(zhí)行上述命令
(2) 系統(tǒng)將提示您輸入要使用的部署密鑰。 如果你還沒有它,你可以通過運行code-push deployment ls <appName> -k來檢索這個值,或者你可以選擇忽略它(直接按<ENTER>),并在以后添加它。 開始吧,我們建議您先使用您的Staging部署密鑰進(jìn)行測試。
2、CocoaPods安裝 如果你在iOS應(yīng)用里嵌入使用React Native,或者就是任性,喜歡使用CocoaPods,那么建議使用我們插件中提供的Podspec文件.
(1)把CodePush依賴添加到Podfile里,并指向NPM的安裝路徑
pod 'CodePush', :path => '../node_modules/react-native-code-push'
(2)運行
pod install
3. "手動安裝" -如果你不想依賴任何額外的工具,你可以使用這個方法.
(1)打開你的APP的Xcode工程
(2)點擊Libraries文件夾右鍵‘Add Files to ....’,在node_modules里找到‘CodePush.xcodeproj’


(3) 把.a文件從Libraries/CodePush.xcodeproj/Products拖拽到Link Binary With Libraries選項

(4) 選擇“Link Binary With Libraries”列表下方的加號,添加libz.tbd

(5) 在項目配置的“"Build Settings"”選項卡下,找到“Header Search Paths”。 添加路徑$(SRCROOT)/../node_modules/react-native-code-push/ios并在下拉菜單中選擇“recursive”。
(6) 插件配置
注意:如果你使用RNPM 或者 react-native link自動配置了組件,這一步已經(jīng)完成,你可以跳過這一步了?。。?/p>
打開AppDelegate.m文件,導(dǎo)入CodePush頭文件:
#import "CodePush.h"在
Info.plist里添加CodePushDeploymentKey字段,填入Deployment Key

- 在Info.plist中將Bundle versions string, short的值修改為1.0.0
ios部署
1.在Xcode 里打開項目 ,選擇工程根目錄,選擇info

2.點擊?按鈕,選擇Duplicate "Release" Configuration

3. 命名為 Staging或者你喜歡的
4. 選擇 Build Setting
5. 點擊工具欄上的+號按鈕,選擇`Add User-Defined Setting

6. 命名為CONDPUSH_KEY,添加Staging和Production環(huán)境的deployment key

7. 打開你工程的Info.plist文件,修改CodePushDeploymentKey的值為:$(CODEPUSH_KEY)
到此,你的iOS動態(tài)部署配置已完成,當(dāng)你運行項目時,根據(jù)你運行的版本(Debug,Release)會去自動匹配Staging和 Production環(huán)境
發(fā)布更新
CodePush支持兩種發(fā)布更新的方式,一種是通過code-push release-react簡化方式,另外一種是通過code-push release的復(fù)雜方式
第一種方式:通過code-push release-react發(fā)布更新
這種方式將打包與發(fā)布兩個命令合二為一,可以說大大簡化了我們的操作流程,建議大家多使用這種方式來發(fā)布更新。
命令格式:
code-push release-react <appName> <platform>
eg:
code-push release-react MyApp-iOS ios
code-push release-react MyApp-Android android
再來個更高級的:
code-push release-react MyApp-iOS ios --t 1.0.0 --dev false --d Production --des "1.優(yōu)化操作流程" --m true
其中參數(shù)--t為二進(jìn)制(.ipa與apk)安裝包的的版本;--dev為是否啟用開發(fā)者模式(默認(rèn)為false);--d是要發(fā)布更新的環(huán)境分Production與Staging(默認(rèn)為Staging);--des為更新說明;--m 是強制更新。
關(guān)于code-push release-react更多可選的參數(shù),可以在終端輸入code-push release-react進(jìn)行查看。
另外,我們可以通過code-push deployment ls <appName>來查看發(fā)布詳情與此次更新的安裝情況。
第二中方式:通過code-push release發(fā)布更新
code-push release發(fā)布更新呢我們首先需要將js與圖片資源進(jìn)行打包成 bundle
生成bundle
發(fā)布更新之前,需要先把 js打包成 bundle,如:
第一步: 在 工程目錄里面新增 bundles文件:mkdir bundles
第二步: 運行命令打包
react-native bundle --platform 平臺 --entry-file 啟動文件 --bundle-output 打包js輸出文件 --assets-dest 資源輸出目錄 --dev 是否調(diào)試。
eg:
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.bundle。
- 平臺可以選擇 android 或者 ios
發(fā)布更新
打包bundle結(jié)束后,就可以通過CodePush發(fā)布更新了。在終端輸入
code-push release <應(yīng)用名稱> <Bundles所在目錄> <對應(yīng)的應(yīng)用版本> --deploymentName: 更新環(huán)境 --description: 更新描述 --mandatory: 是否強制更新
eg:
code-push release GitHubPopular ./bundles/index.android.bundle 1.0.6 --deploymentName Production --description "1.支持文章緩存。" --mandatory true
注意:
- CodePush默認(rèn)是更新 staging 環(huán)境的,如果是staging,則不需要填寫 deploymentName。
- 如果有 mandatory 則Code Push會根據(jù)mandatory 是true或false來控制應(yīng)用是否強制更新。默認(rèn)情況下mandatory為false即不強制更新。
- 對應(yīng)的應(yīng)用版本(targetBinaryVersion)是指當(dāng)前app的版本(對應(yīng)build.gradle中設(shè)置的versionName "1.0.6"),也就是說此次更新的js/images對應(yīng)的是app的那個版本。不要將其理解為這次js更新的版本。
如客戶端版本是 1.0.6,那么我們對1.0.6的客戶端更新js/images,targetBinaryVersion填的就是1.0.6。 - 對于對某個應(yīng)用版本進(jìn)行多次更新的情況,CodePush會檢查每次上傳的 bundle,如果在該版本下如1.0.6已經(jīng)存在與這次上傳完全一樣的bundle(對應(yīng)一個版本有兩個bundle的md5完全一樣),那么CodePush會拒絕此次更新。
所以如果我們要對某一個應(yīng)用版本進(jìn)行多次更新,只需要上傳與上次不同的bundle/images即可。如:
eg:
對1.0.6的版本進(jìn)行第一次更新:
code-push release GitHubPopular ./bundles/index.android.bundle 1.0.6 --deploymentName Production --description "1.支持文章緩存。" --mandatory true
對1.0.6的版本進(jìn)行第二次更新:
code-push release GitHubPopular ./bundles/index.android.bundle 1.0.6 --deploymentName Production --description "1.新添加收藏功能。" --mandatory true - 在終端輸入 code-push deployment history <appName> Staging 可以看到Staging版本更新的時間、描述等等屬性。
eg:
code-push release Equipment ./bundles 1.0.1
總結(jié):
CodePush也存在著一些缺點:
- 服務(wù)器在國外,在國內(nèi)訪問,網(wǎng)速不是很理想。
- 其升級服務(wù)器端程序并不開源的,后期微軟會不會對其收費還是個未知數(shù)。
如果在沒有更好的動態(tài)更新React Native應(yīng)用的方案的情況下,并且這些問題還在你的接受范圍之內(nèi)的話,那么CodePush可以作為動態(tài)更新React Native應(yīng)用的一種選擇。 - 最好自己搭建動態(tài)更新服務(wù)器