react native iOS 熱更新(真機(jī)運(yùn)行,打包文件工闺,上傳 )

熱更新環(huán)境以及插件的安裝

這份文檔建立在已經(jīng)能在iOS模擬器上正常運(yùn)行項(xiàng)目的基礎(chǔ)上

參考文章1-code-push

參考文章2-code-push-server

運(yùn)行環(huán)境

macOS Sierra 10.12.1
iOS10
xcode Version 8.1 (8B62)

使用codepush做熱更新

CodePush簡介

CodePush 是微軟提供的一套用于熱更新 React Native 和 Cordova 應(yīng)用的服務(wù)桥氏。
CodePush 是提供給 React Native 和 Cordova 開發(fā)者直接部署移動(dòng)應(yīng)用更新給用戶設(shè)備的云服務(wù)温峭。CodePush 作為一個(gè)中央倉庫,開發(fā)者可以推送更新 (JS, HTML, CSS and images)字支,應(yīng)用可以從客戶端 SDK 里面查詢更新凤藏。CodePush 可以讓應(yīng)用有更多的可確定性,也可以讓你直接接觸用戶群堕伪。在修復(fù)一些小問題和添加新特性的時(shí)候揖庄,不需要經(jīng)過二進(jìn)制打包,可以直接推送代碼進(jìn)行實(shí)時(shí)更新欠雌。

安裝與注冊(cè)CodePush

使用CodePush之前首先要安裝CodePush客戶端蹄梢,我的機(jī)器是OS Sierra 10.12.1

涉及到的指令:

npm install -g code-push-cli //安裝codepush客戶端

code-push register  //注冊(cè)codepush賬號(hào)

code-push login //登錄

code-push loout //注銷

code-push access-key ls     //列出登陸的token

code-push access-key rm <accessKye> //刪除某個(gè) access-key

管理 CodePush 賬號(hào)需要通過 NodeJS-based CLI,如果未安裝則可以輸入

npm install -g code-push-cli    //-g表示全局安裝

我的版本是

codepus.jpeg

創(chuàng)建一個(gè)CodePush 賬號(hào)

code-push register

瀏覽器會(huì)自動(dòng)打開注冊(cè)頁面富俄,我這里用的是git賬號(hào)授權(quán)的禁炒。

reg.png

授權(quán)通過之后,CodePush會(huì)展示“access key”霍比,復(fù)制此key到終端即可完成注冊(cè)齐苛。

登錄,登陸成功后桂塞,session文件將會(huì)寫在 /Users/你的用戶名/.code-push.config 中

code-push login

至此 codepush客戶端相關(guān)工作完成

在CodePush服務(wù)器注冊(cè)app(項(xiàng)目)

涉及相關(guān)命令

code-push app add <appName> //在賬號(hào)里面添加一個(gè)新的app

code-push app rm <appName>  在賬號(hào)里移除一個(gè)app

code-push app rename <appName> //重命名一個(gè)存在app

code-push app ls //列出賬號(hào)下面的所有app

code-push app transfer //把a(bǔ)pp的所有權(quán)轉(zhuǎn)移到另外一個(gè)賬號(hào)

為了讓codepush關(guān)聯(lián)上我們需要熱更的app 則需要向codepush注冊(cè)目標(biāo) app凹蜂,我的app名字是Trip,請(qǐng)自行對(duì)應(yīng)自己的app名稱

code-push app add Trip

集成CodePush SDK 到 iOS項(xiàng)目中(目前我只做了iOS版)

安裝CodePush插件到項(xiàng)目中

我的項(xiàng)目目錄結(jié)構(gòu)是

mulu.jpg

在項(xiàng)目根目錄下執(zhí)行指令阁危,此時(shí)會(huì)在node_modules文件夾中生成react-native-code-push文件夾

npm install --save react-native-code-push
使用cocoapods導(dǎo)入code-push到iOS項(xiàng)目中 參考文檔

cocoapods:簡單理解一個(gè)iOS的依賴管理工具玛痊,有點(diǎn)類似前端的 bower

首先安裝cocoapods
sudo gem install cocoapods

如果報(bào)錯(cuò)

ERROR:  While executing gem ... (Gem::DependencyError)
Unable to resolve dependencies: cocoapods requires cocoapods-core (= 1.1.1), cocoapods-downloader (< 2.0, >= 1.1.2), cocoapods-trunk (< 2.0, >= 1.1.1), xcodeproj (< 2.0, >= 1.3.3)

嘗試運(yùn)行

sudo gem install cocoapods --pre 

在項(xiàng)目ios文件夾中新建Podfile文件內(nèi)容如下,參考文檔

platform :ios, '8.0'

target 'Trip' do    //app名字自行修改
    pod 'CodePush', :path => '../node_modules/react-native-code-push'//路徑根據(jù)自己的文件目錄修改
end

項(xiàng)目Podfile同級(jí)目錄下運(yùn)行指令狂打,即可將codepush插件集成到項(xiàng)目

pod install

在xcode中打開項(xiàng)目

項(xiàng)目目錄下有 iOS 文件夾擂煞,里面有一個(gè)叫 xxxx.xcodeproj 的文件 點(diǎn)擊就可用xcode打開,打開后我的目錄結(jié)構(gòu)是這樣的

xcode1.jpg

在文件夾中打開項(xiàng)目文件夾趴乡,找到/node_modules/react-native-code-push/ios/CodePush.xcodeproj 這個(gè)文件

將他拖到xcode項(xiàng)目中的Libraries文件夾中

目的是為了將codepush集成到iOS項(xiàng)目中使用相關(guān)功能

xcode2.jpeg

在xcode中 點(diǎn)擊藍(lán)色的項(xiàng)目名稱呼出中間的操作欄对省,點(diǎn)擊操作欄上面的 build phases 欄 打開Link Binary With Libraries

Libraries/CodePush.xcodeproj/Products 中的 libCodePush.a文件拖入Link Binary With Libraries

xcode3.jpeg

點(diǎn)擊Link Binary With Libraries的加號(hào),選擇 libz.tbd 添加進(jìn)去晾捏,添加上了蒿涎,iOS編譯出來的包中就會(huì)包含這些庫。

xcode4.jpeg

選擇操作欄上部 Build Settings 欄目 在Header Search Paths那一項(xiàng)中加入

$(SRCROOT)/../node_modules/react-native-code-push

并且這一項(xiàng)的后面必須選擇 recursive (用力敲黑板)惦辛,這是讓iOS知道去遞歸查找此依賴 否則有可能找不到

xcode5.jpeg

代碼中配置CodePush插件

打開xcode 在項(xiàng)目中找到 AppDelegate.m文件劳秋,并單擊左鍵打開 ,一般在項(xiàng)目名文件夾中 找不到就仔細(xì)點(diǎn)找

在代碼頭部加入代碼并cmd + s保存,如果加入后報(bào)錯(cuò)玻淑,則對(duì)照上面的步驟仔細(xì)檢查是否疏漏了嗽冒,找不到此文件表明前面的依賴引入沒有成功

#import "CodePush.h"

繼續(xù)在此文件中找到 jsCodeLocation 關(guān)鍵詞,將源碼替換成以下代碼

PS:讓iOS判斷是否是debug 和 release模式 對(duì)應(yīng)加載不同的入口文件补履。我們熱更時(shí)需要以 release方式運(yùn)行

#ifdef DEBUG
    jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle? platform=ios&dev=true"];
#else
    jsCodeLocation = [CodePush bundleURL];
#endif

啟動(dòng)命令窗口輸入命令獲取 Staging key添坊,復(fù)制 Staging 的值(因?yàn)槭窃谏a(chǎn)環(huán)境 所以使用 Staging

code-push deployment ls  <AppName> --displayKeys
codepush1.jpeg

打開xcode 將此值填入 info.plist文件中

添加 CodePushDeploymentKey

Bundle versions string, short 值改成 1.0.0 因?yàn)閕OS中codepush只支持這樣的格式

xcode6.jpeg

xcode中點(diǎn)擊項(xiàng)目名 調(diào)出中間的操作欄 點(diǎn)擊 general 如果下面的 build 值為空 則改為1 (我這里是1 自己對(duì)應(yīng)自己的項(xiàng)目)

xcode7.jpeg

react native 中使用插件

打開iOS的入口文件 我這里是 index.ios.js

在代碼中引入插件

import codePush from "react-native-code-push";

在 父組件的 componentDidMount 方法中調(diào)用熱更新方法

componentDidMount(){
    codePush.sync();
}

以上就完成了基本的配置

react native 打包

相關(guān)命令

react-native bundle

常用參數(shù)解釋

--entry-file //ios或android入口的文件名稱,一般叫 index.ios.js或 index.android.js

--platform //平臺(tái)名稱(ios/android)

--dev //設(shè)置為false的時(shí)候會(huì)對(duì)JavaScript代碼進(jìn)行優(yōu)化處理箫锤。

--bundle-output //生成的jsbundle文件的名稱(包含路徑)贬蛙,比如./ios/bundle/index.ios.jsbundle

--assets-dest //圖片以及其他資源存放的目錄,比如./ios/assets

我的打包命令如下,我的靜態(tài)資源放到 ios/Trip/assets 中的(依照個(gè)人的路徑為準(zhǔn))

特別注意:bundle 文件夾 需要事先手動(dòng)建好

react-native bundle --entry-file index.ios.js --platform ios --dev false --bundle-output ./ios/bundle/index.ios.jsbundle --assets-dest ./ios/Trip/assets

此時(shí)成功會(huì)在ios目錄下看到一個(gè)bundle目錄麻汰,里面是我們的打包文件

打開xcode 速客,選中項(xiàng)目中和項(xiàng)目名一樣的黃色文件夾戚篙,右鍵選擇Add Files to "RNIos"

找到我們的bundle五鲫,注意是文件夾,不是文件岔擂,然后不要猴急猴急的點(diǎn)add按鈕位喂,請(qǐng)看下一步

option中選擇Create folder references 然后點(diǎn)擊 add

xcode11.jpeg

完成后即可進(jìn)行下一步的真機(jī)安裝了

iOS真機(jī)測試熱更新

首先需要在apple開發(fā)者網(wǎng)站去注冊(cè)開發(fā)者賬號(hào)(個(gè)人測試可以不交99的保護(hù)費(fèi))

xcode 中打開項(xiàng)目(參考上文如何打開項(xiàng)目)

點(diǎn)擊項(xiàng)目,在操作欄中選擇*** general*** 在team中選擇自己的開發(fā)者賬戶

xcode8.jpeg

按下 cmd+shift+,鍵打開配置窗口乱灵,在build configration 中可以選擇項(xiàng)目運(yùn)行方式(debug/release)

debug:真機(jī)調(diào)試用塑崖,當(dāng)修改代碼后可以在真機(jī)上時(shí)時(shí)看到效果

releae:使用上文指定的bundle文件運(yùn)行,等于與本地代碼時(shí)時(shí)修改沒有關(guān)系了(熱更新需要使用這個(gè)模式調(diào)試)

將手機(jī)插上 usb 鏈接 mac痛倚,點(diǎn)擊左上角手機(jī)圖標(biāo)规婆,即可看到我們的真機(jī)機(jī)器名,選擇它蝉稳,然后點(diǎn)擊左邊的三角形按鈕運(yùn)行項(xiàng)目抒蚜。

坐等幾分鐘,不出意外的話即可在手機(jī)上安裝app 耘戚,成功或失敗 xcode會(huì)彈出提示嗡髓。

xcode10.jpeg

假設(shè)上述操作成功在手機(jī)上安裝app,就可以繼續(xù)下面的打包發(fā)布了收津。

向codepush發(fā)布打包代碼

隨意修改代碼饿这,使其表現(xiàn)和手機(jī)上顯示不一致即可

然后重新執(zhí)行打包命令,生成一個(gè)新的bundle文件

執(zhí)行codepush的發(fā)布命令撞秋,將新文件發(fā)布到staging 環(huán)境中

相關(guān)命令

code-push release <appName> <updateContents> <targetBinaryVersion> --mandatory //發(fā)布

code-push deployment history Trip Staging  //查詢發(fā)布?xì)v史

參數(shù)解釋

<appName> //app名稱

<updateContents> //Bundle文件所在目錄(完整)

<targetBinaryVersion>   // 需要熱更的app 版本

--mandatory //此參數(shù)非必須  如果有則表示app強(qiáng)制更新

我的發(fā)布命令如下

code-push release Trip ./ios/bundle/index.ios.jsbundle 1.0.0 

查看發(fā)布?xì)v史

code-push deployment history <appName> <deploymentName>

成功后重啟app 則會(huì)看到更新(是重啟app 需要結(jié)束程序后再打開)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末长捧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吻贿,更是在濱河造成了極大的恐慌唆姐,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奉芦,居然都是意外死亡赵抢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門声功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烦却,“玉大人,你說我怎么就攤上這事先巴∑渚簦” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵伸蚯,是天一觀的道長摩渺。 經(jīng)常有香客問我,道長剂邮,這世上最難降的妖魔是什么摇幻? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮挥萌,結(jié)果婚禮上绰姻,老公的妹妹穿的比我還像新娘。我一直安慰自己引瀑,他們只是感情好狂芋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著憨栽,像睡著了一般帜矾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屑柔,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天屡萤,我揣著相機(jī)與錄音,去河邊找鬼锯蛀。 笑死灭衷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旁涤。 我是一名探鬼主播翔曲,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼劈愚!你這毒婦竟也來了瞳遍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤菌羽,失蹤者是張志新(化名)和其女友劉穎掠械,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猾蒂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年均唉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肚菠。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舔箭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚊逢,到底是詐尸還是另有隱情层扶,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布烙荷,位于F島的核電站镜会,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏终抽。R本人自食惡果不足惜戳表,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拿诸。 院中可真熱鬧扒袖,春花似錦塞茅、人聲如沸亩码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽描沟。三九已至,卻和暖如春鞭光,著一層夾襖步出監(jiān)牢的瞬間吏廉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工惰许, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留席覆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓汹买,卻偏偏與公主長得像佩伤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晦毙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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