react native codepush 熱更新配置

搞了兩天,查了很多資料,發(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 直接登錄

1.png

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

  1. 進(jìn)入到你的項(xiàng)目目錄下,在終端里運(yùn)行
  2. npm install --save react-native-code-push@latest 安裝code-push組件
  3. 與所有其他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’

2.png
3.png

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

4.png

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

5.png

(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ò)這一步了?。?!

  1. 打開AppDelegate.m文件,導(dǎo)入CodePush頭文件:#import "CodePush.h"

  2. Info.plist里添加CodePushDeploymentKey字段,填入Deployment Key

6.png
  1. 在Info.plist中將Bundle versions string, short的值修改為1.0.0

ios部署

1.在Xcode 里打開項(xiàng)目 ,選擇工程根目錄,選擇info

7.png

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

8.png

3. 命名為 Staging或者你喜歡的

4. 選擇 Build Setting

5. 點(diǎn)擊工具欄上的+號(hào)按鈕,選擇`Add User-Defined Setting

9.png

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

10.png

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

需要注意的是:

  1. 忽略了資源輸出是因?yàn)?輸出資源文件后,會(huì)把bundle文件覆蓋了。
  2. 輸出的bundle文件名不叫其他,而是 index.android.bundle,是因?yàn)?在debug模式下,工程讀取的bundle就是叫做 index.android.bundle。
  3. 平臺(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

注意:

  1. CodePush默認(rèn)是更新 staging 環(huán)境的,如果是staging,則不需要填寫 deploymentName。
  2. 如果有 mandatory 則Code Push會(huì)根據(jù)mandatory 是true或false來(lái)控制應(yīng)用是否強(qiáng)制更新。默認(rèn)情況下mandatory為false即不強(qiáng)制更新。
  3. 對(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。
  4. 對(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
  5. 在終端輸入 code-push deployment history <appName> Staging 可以看到Staging版本更新的時(shí)間、描述等等屬性。
    eg:
    code-push release Equipment ./bundles 1.0.1

總結(jié):

CodePush也存在著一些缺點(diǎn):

  1. 服務(wù)器在國(guó)外,在國(guó)內(nèi)訪問(wèn),網(wǎng)速不是很理想。
  2. 其升級(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)用的一種選擇。
  3. 最好自己搭建動(dòng)態(tài)更新服務(wù)器
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容