搞了兩天,查了很多資料,發(fā)現(xiàn)網(wǎng)上很多資料太老了,把我配置的方法分享給大家,同時(shí)也記錄下
? ? ? ?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查看安裝的版本號(hào)
1.2 code-push register 注冊(cè)賬號(hào),會(huì)在google瀏覽器打開注冊(cè)界面,然后注冊(cè)成功會(huì)拿到一個(gè)key 如下圖所示,如果已經(jīng)注冊(cè)過(guò)的話,code-push login 直接登錄

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


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

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

(5) 在項(xiàng)目配置的“"Build Settings"”選項(xiàng)卡下,找到“Header Search Paths”。 添加路徑$(SRCROOT)/../node_modules/react-native-code-push/ios并在下拉菜單中選擇“recursive”。
(6) 插件配置
注意:如果你使用RNPM 或者 react-native link自動(dòng)配置了組件,這一步已經(jīng)完成,你可以跳過(guò)這一步了?。?!
打開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 里打開項(xiàng)目 ,選擇工程根目錄,選擇info

2.點(diǎn)擊?按鈕,選擇Duplicate "Release" Configuration

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

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

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