[ReactNative] 打離線包 和CodePush發(fā)布更新

首先瀑焦,講React Native的發(fā)布更新,這就涉及到React Native的熱更新主要是怎么工作的浪耘,關(guān)鍵在于bundle的更新竿报。我們先來(lái)看看ReactNative是怎么處理bundle文件(bundle文件用于資源管理)的「任可以有如下兩種方式:1鹃唯、app發(fā)版時(shí),將bundle文件內(nèi)置到app中瓣喊,同時(shí)將圖片和js文件內(nèi)置到app中(Android和iOS處理的不同)2坡慌、app在合適的時(shí)機(jī),加載服務(wù)端最新的bundle文件
下面一張流程圖簡(jiǎn)單介紹ReactNative的熱更新機(jī)制:(參考自:http://blog.csdn.net/codetomylaw/article/details/52115704)

ReactNative的熱更新.png

一藻三、打離線包(打包bundle文件內(nèi)置到app中)
離線包即本地存著一個(gè)離線包洪橘,保證沒(méi)有網(wǎng)絡(luò)的時(shí)候程序不會(huì)報(bào)錯(cuò)。1棵帽、將js代碼打包到j(luò)sbundle文件中熄求。在index.ios.js所在目錄下,執(zhí)行以下命令(文件名自定義逗概,使用codepush的時(shí)候最好命名為默認(rèn)的main.jsbundle):
// 無(wú)圖片資源等react-native bundle --entry-file index.ios.js --platform ios --bundle-output main.jsbundle// 有圖片資源react-native bundle --entry-file index.ios.js --platform ios --bundle-output index.ios.bundle --platform ios --dev false --assets-dest ./ // 或者放bundle文件夾里(注意要先保證bundle文件夾存在5芡怼!!) react-native bundle –entry-file index.ios.js –bundle-output ./bundle/iosBundle/index.ios.jsbundle –platform ios –assets-dest ./bundle/iosBundle –dev false /entry-file: RN的入口文件bundle-out: 輸出bundle文件的輸出路徑(bundle文件名和oc里面的代碼要對(duì)應(yīng))asset-dest:輸出的asset資源目錄/

2卿城、添加到項(xiàng)目中枚钓。在xcode中添加assets【必須用Create folder references的方式,添加完是藍(lán)色文件夾圖標(biāo)】和index.ios.jsbundle(或者main.jsbundle瑟押、命名不同)
網(wǎng)上參考的放bundle文件夾的目錄結(jié)構(gòu)和項(xiàng)目結(jié)構(gòu)如下:

bundle文件夾的目錄結(jié)構(gòu)和項(xiàng)目結(jié)構(gòu)(自網(wǎng)上).png

參考自:https://segmentfault.com/a/1190000004189538

個(gè)人利用第一句命令創(chuàng)建的包搀捷,目錄如下:


離線包目錄結(jié)構(gòu).png

3、修改AppDelegate.m文件(只使用離線包不使用熱更新的情況)
// URLForResource根據(jù)第一步對(duì)應(yīng)的名字對(duì)應(yīng)修改jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"index.ios" withExtension:@"jsbundle"];

4多望、模擬器或者真機(jī)調(diào)試都沒(méi)有問(wèn)題嫩舟。
順帶列舉下ios打包可能遇到的問(wèn)題(雖然我都沒(méi)遇到哈):1)離線包如果開(kāi)啟了chrome調(diào)試,會(huì)訪問(wèn)調(diào)試服務(wù)器怀偷,而且會(huì)一直loading出不來(lái)家厌。2)如果bundle的名字是main.jsbundle,app會(huì)一直讀取舊的,改名就好了。枢纠。像街。非常奇葩的問(wèn)題,我重新刪了app晋渺,clean工程都沒(méi)用镰绎,就是不能用main.jsbundle這個(gè)名字。3)必須用Create folder references【藍(lán)色文件夾圖標(biāo)】的方式引入圖片的assets木西,否則引用不到圖片4)執(zhí)行bundle命令之前畴栖,要保證相關(guān)的文件夾都存在

二、使用CodePush實(shí)現(xiàn)熱更新

  1. 環(huán)境準(zhǔn)備(Mac)
    1)安裝Code-push cli
    $ npm install -g code-push-cli

2) 注冊(cè)CodePush賬戶
$ code-push register

執(zhí)行以上命令將會(huì)自動(dòng)打開(kāi)如下圖所示的注冊(cè)頁(yè)面:


注冊(cè)頁(yè)面.png

可以使用github或者M(jìn)icrosoft帳戶注冊(cè)(本文使用GitHub賬戶進(jìn)行注冊(cè))八千,注冊(cè)成功后將會(huì)生成如下圖所示相應(yīng)的access token:


access token.png

按照提示在終端輸入剛生成的access token(會(huì)自動(dòng)登錄):
[圖片上傳中吗讶。。恋捆。(6)]輸入access token.png

3)添加CodePush應(yīng)用
$ code-push app add XXX      //xxx 為你要熱部署的app name

結(jié)果如下:
[圖片上傳中照皆。。沸停。(7)]添加CodePush應(yīng)用.png

  1. 安裝CodePush
    在項(xiàng)目更目錄(或者說(shuō)package.json所在目錄)執(zhí)行以下語(yǔ)句安裝CodePush膜毁,會(huì)自動(dòng)對(duì)應(yīng)修改package.json內(nèi)容。
    npm install --save react-native-code-push

效果如下:


安裝CodePush.png

  1. 集成code-push 到工程文件
    CodePush集成到項(xiàng)目中愤钾,一般有三種方法:RNPM瘟滨、CocoaPods 、"Manual"
    詳細(xì)可參考CodePush的Github:https://github.com/Microsoft/react-native-code-push

下文分別對(duì)其接入方法進(jìn)行簡(jiǎn)單介紹:個(gè)人感覺(jué)按情況分能颁,如果是將React Native集成到原生項(xiàng)目中的項(xiàng)目杂瘸,因?yàn)楸旧響?yīng)該有用到cocoaPods,所以推薦使用cocoaPods接入伙菊,比較方便簡(jiǎn)單败玉。如果是純React Native項(xiàng)目敌土,則可以考慮手動(dòng)接入。(因?yàn)槲覝y(cè)試用的是原生集成項(xiàng)目绒怨,所以就使用了cocoaPods)
方式一:cocoaPods接入
1)修改Podfile文件:(自己注意路徑哈)
pod 'CodePush', :path => './node_modules/react-native-code-push'

2)執(zhí)行命令行更新pod:
pod install // 或者 pod install --verbose --no-repo-update

方式二:手動(dòng)接入
1)將react-native-code-push文件夾中 CodePush.xcodeproj 直接拉入項(xiàng)目中Libraries中


CodePush.xcodeproj 拉入項(xiàng)目.png

2)在Link Binary With Libraries中添加Libraries/CodePush.xcodeproj /Products中的libCodePush.a以及l(fā)ibz.tbd纯赎。
[圖片上傳中谦疾。南蹂。。(10)]Link Binary With Libraries.png

3)在Build Settings的Header Search Paths那一項(xiàng)中加入(路徑要注意)
$(SRCROOT)/../node_modules/react-native-code-push

[圖片上傳中念恍。六剥。。(11)]Header Search Paths.png

方式三:RNPM接入
好像是官方推薦使用最簡(jiǎn)單的方式峰伙,不過(guò)沒(méi)有試過(guò)哈1)安裝rnpm
$ npm -g install rnpm xcode

2)使用
$ rpm link

  1. 修改項(xiàng)目配置
    1)在命令行下使用code-push deployment ls <AppName> --displayKeys 查出Staging的值疗疟,在info.plist文件中添加CodePushDeploymentKey并且把Staging的值填入。2)在Info.plist中將Bundle versions string, short的值修改為1.0.0(或者其它瞳氓,結(jié)構(gòu)一樣為x.x.x策彤,且和之后code push更新的版本要對(duì)應(yīng))
    [圖片上傳中。匣摘。店诗。(12)]info.plist配置.png

  2. 修改OC代碼和JS代碼
    1)在加載 js bundle的類(lèi)中 修改代碼
    a)首先,引入頭文件:

import "CodePush.h"

b)然后修改jsCodeLocation值:
//該文章是討論在Release下進(jìn)行相關(guān)的操作音榜,如果是debug版本加上如下代碼庞瘸,系統(tǒng)在運(yùn)行時(shí)候會(huì)自動(dòng)切換。NSURL *jsCodeLocation;#ifdef DEBUG jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];#else jsCodeLocation = [CodePush bundleURL];#endif//如果本地js離線包不是命名main.jsbundle,需要對(duì)CodePush進(jìn)行相應(yīng)設(shè)置jsCodeLocation = [CodePush bundleURLForResource:@"index"];

2)在js文件中(該項(xiàng)目文件是index.ios.js) 修改代碼
a)引入對(duì)應(yīng)頭文件
import codePush from "react-native-code-push";

b)在componentDidMount調(diào)用sync方法赠叼,當(dāng)你的App啟動(dòng)的時(shí)候會(huì)在后臺(tái)更新
componentDidMount(){ codePush.sync(); }

  1. 發(fā)布更新
    1)發(fā)布更新 (JavaScript-only)
    當(dāng)你修改js文件的時(shí)候擦囊,并且想立刻發(fā)布。則僅僅需要以下的操作:
    將你修改的js文件(當(dāng)前文件是index.ios.js)打包為二進(jìn)制文件嘴办,放入指定的地方(當(dāng)前位置為根目錄)瞬场。react-native bundle --platform ios --entry-file index.ios.js --bundle-output codepush.js --dev false

將二進(jìn)制文件push到staging 環(huán)境中code-push release [--deploymentName ] [--description ] [--mandatory]eg:code-push release NativeTest codepush.js 1.0.0

2)發(fā)布更新 (JavaScript + images)
–assets-dest 就是你放圖片的位置(當(dāng)前僅僅是做測(cè)試,實(shí)際上最好建個(gè)文件夾專(zhuān)門(mén)存入相關(guān)圖片)react-native bundle --platform ios --entry-file index.ios.js --bundle-output ./main.jsbundle --assets-dest ./<img 地址>// main.jsbundle 為自定義名字的bundle名

push bundle文件code-push <release/debug> <projectName(與注冊(cè)的app同名)><bundle文件名> <版本號(hào)>eg:code-push release NativeTest main.jsbundle 1.0.0

到這一步的時(shí)候涧郊,正常來(lái)說(shuō)贯被,該配置的都配置了,試著更新一個(gè)版本push到codepush上底燎,運(yùn)行下項(xiàng)目刃榨,就會(huì)出現(xiàn)效果。注意:如果出現(xiàn)找不到main.jsbundle的報(bào)錯(cuò)双仍,很大的原因就是沒(méi)有在本地打個(gè)離線包枢希,詳細(xì)參考這篇文章的第一部分。(曾經(jīng)因?yàn)檫@個(gè)原因朱沃,我看著報(bào)錯(cuò)發(fā)呆了好久苞轿,上網(wǎng)也找不到任何說(shuō)法??)

Q&A
CodePush更新規(guī)則[圖片上傳中茅诱。。搬卒。(13)]CodePush更新規(guī)則.png

更新后都需要重啟才能看到最新的變化 再次進(jìn)入后要等一會(huì)瑟俭。TODO:還要驗(yàn)證后確定穩(wěn)定時(shí)機(jī)。
查看歷史上傳過(guò)的版本:code-push deployment history NativeTest Staging

[圖片上傳中契邀。摆寄。。(14)]查看歷史上傳過(guò)的版本.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坯门,一起剝皮案震驚了整個(gè)濱河市微饥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌古戴,老刑警劉巖欠橘,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異现恼,居然都是意外死亡肃续,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)叉袍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)始锚,“玉大人,你說(shuō)我怎么就攤上這事畦韭√鄱辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵艺配,是天一觀的道長(zhǎng)察郁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)转唉,這世上最難降的妖魔是什么皮钠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮赠法,結(jié)果婚禮上麦轰,老公的妹妹穿的比我還像新娘。我一直安慰自己砖织,他們只是感情好款侵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著侧纯,像睡著了一般新锈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眶熬,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天妹笆,我揣著相機(jī)與錄音块请,去河邊找鬼。 笑死拳缠,一個(gè)胖子當(dāng)著我的面吹牛墩新,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窟坐,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼海渊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了狸涌?” 一聲冷哼從身側(cè)響起切省,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帕胆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體般渡,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懒豹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驯用。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脸秽。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝴乔,靈堂內(nèi)的尸體忽然破棺而出记餐,到底是詐尸還是另有隱情,我是刑警寧澤薇正,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布片酝,位于F島的核電站,受9級(jí)特大地震影響挖腰,放射性物質(zhì)發(fā)生泄漏雕沿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一猴仑、第九天 我趴在偏房一處隱蔽的房頂上張望审轮。 院中可真熱鬧,春花似錦辽俗、人聲如沸疾渣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榴捡。三九已至,卻和暖如春坐漏,著一層夾襖步出監(jiān)牢的瞬間薄疚,已是汗流浹背碧信。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留街夭,地道東北人砰碴。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像板丽,于是被迫代替她去往敵國(guó)和親呈枉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容