React Native嵌入原生應(yīng)用

核心概念

如果你正準(zhǔn)備從頭開始制作一個新的應(yīng)用,那么React Native會是個非常好的選擇譬涡。但如果你只想給現(xiàn)有的原生應(yīng)用中添加一兩個視圖或是業(yè)務(wù)流程闪幽,React Native也同樣不在話下。只需簡單幾步昂儒,你就可以給原有應(yīng)用加上新的基于React Native的特性沟使、畫面和視圖等。

把React Native組件植入到iOS應(yīng)用中有如下幾個主要步驟:

1.首先當(dāng)然要了解你要植入的React Native組件渊跋。

2.創(chuàng)建一個Podfile腊嗡,在其中以subspec的形式填寫所有你要植入的React Native的組件。

3.創(chuàng)建js文件拾酝,編寫React Native組件的js代碼燕少。

4.添加一個事件處理函數(shù),用于創(chuàng)建一個RCTRootView蒿囤。這個RCTRootView正是用來承載你的React Native組件的客们,而且它必須對應(yīng)你在index.ios.js中使用AppRegistry注冊的模塊名字。

5.啟動React Native的Packager服務(wù)材诽,運行應(yīng)用底挫。

6.根據(jù)需要添加更多React Native的組件。

7.調(diào)試脸侥。

8.準(zhǔn)備部署發(fā)布 (比如可以利用react-native-xcode.sh腳本)建邓。

9.發(fā)布應(yīng)用。

開發(fā)環(huán)境準(zhǔn)備

基礎(chǔ)環(huán)境

首先按照開發(fā)環(huán)境搭建教程來安裝React Native在iOS平臺上所需的一切依賴軟件(比如npm)睁枕。

CocoaPods

CocoaPods是針對iOS和Mac開發(fā)的包管理工具官边。我們用它來把React Native框架的代碼下載下來并添加到你當(dāng)前的項目中

依賴包

React Native的植入過程同時需要React和React Native兩個node依賴包沸手。


我們把具體的依賴包記錄在package.json(Sublime Textc創(chuàng)建)文件中。如果項目根目錄中沒有這個文件注簿,那就自己創(chuàng)建一個契吉。

對于一個典型的React Native項目來說,一般package.json和index.ios.js等文件會放在項目的根目錄下诡渴。而iOS相關(guān)的原生代碼會放在一個名為ios/的子目錄中,這里也同時放著你的Xcode項目文件(.xcodeproj)捐晶。

下面是一個最簡單的package.json的內(nèi)容示例。

示例中的version字段沒有太大意義(除非你要把你的項目發(fā)布到npm倉庫)玩徊。scripts中是用于啟動packager服務(wù)的命令租悄。dependencies中的react和react-native的版本取決于你的具體需求。一般來說我們推薦使用最新版本恩袱。你可以使用npm info react和npm info react-native來查看當(dāng)前的最新版本泣棋。另外,react-native對react的版本有嚴(yán)格要求畔塔,高于或低于某個范圍都不可以潭辈。本文無法在這里列出所有react native和對應(yīng)的react版本要求,只能提醒讀者先嘗試執(zhí)行npm install澈吨,然后注意觀察安裝過程中的報錯信息把敢,例如require react@某.某.某版本, but none was installed,然后根據(jù)這樣的提示谅辣,執(zhí)行npm i -S react@某.某.某版本修赞。

{

"name": "ExerciseOne",

"version": "0.0.1",

"private": true,

"scripts": {

"start": "node node_modules/react-native/local-cli/cli.js start"

},

"dependencies": {

"react": "16.0.0-alpha.6",

"react-native": "0.44.0"

}

}

安裝依賴包

使用npm(node包管理器,Node package manager)來安裝React和React Native模塊桑阶。這些模塊會被安裝到項目根目錄下的node_modules/目錄中柏副。 在包含有package.json文件的目錄(一般也就是項目根目錄)中運行下列命令來安裝:

$ npm install

React Native框架

React Native框架整體是作為node模塊安裝到項目中的。下一步我們需要在CocoaPods的Podfile中指定我們所需要使用的組件蚣录。

在你開始把React Native植入到你的應(yīng)用中之前割择,首先要決定具體整合的是React Native框架中的哪些部分。而這就是subspec要做的工作萎河。在創(chuàng)建Podfile文件的時候荔泳,需要指定具體安裝哪些React Native的依賴庫。所指定的每一個庫就稱為一個subspec虐杯。

可用的subspec都列在node_modules/react-native/React.podspec中玛歌,基本都是按其功能命名的。一般來說你首先需要添加Core擎椰,這一subspec包含了必須的AppRegistry沾鳄、StyleSheet、View以及其他的一些React Native核心庫确憨。如果你想使用React Native的Text庫(即組件)译荞,那就需要添加RCTText的subspec。同理休弃,Image需要加入RCTImage吞歼,等等。

在React和React Native模塊成功安裝到node_modules目錄之后塔猾,你就可以開始創(chuàng)建Podfile以便選擇所需的組件安裝到應(yīng)用中篙骡。

創(chuàng)建Podfile的最簡單的方式就是在iOS原生代碼所在的目錄中使用CocoaPods的init命令:

## 在iOS原生代碼所在的目錄中(也就是`.xcodeproj`文件所在的目錄)執(zhí)行:$ pod init

Podfile會創(chuàng)建在執(zhí)行命令的目錄中。你需要調(diào)整其內(nèi)容以滿足你的植入需求丈甸。調(diào)整后的Podfile的內(nèi)容看起來類似下面這樣:

platform :ios,'8.0'

target'ExerciseOne'do

pod'AFNetworking','3.1.0'

pod'YTKNetwork','2.0.3'

pod'MJExtension'

pod'Reachability'

pod'MBProgressHUD'

pod'BabyBluetooth','~> 0.7.0'

# 'node_modules'目錄一般位于根目錄中

#但是如果你的結(jié)構(gòu)不同糯俗,那你就要根據(jù)實際路徑修改下面的`:path`

pod'React',:path =>'../node_modules/react-native', :subspecs => [

'Core',

'RCTText',

'RCTActionSheet',

'RCTImage',

'RCTNetwork',

'RCTWebSocket',#這個模塊是用于調(diào)試功能的

#在這里繼續(xù)添加你所需要的模塊

]

#如果你的RN版本>= 0.42.0,請加入下面這行

pod"Yoga", :path =>"../node_modules/react-native/ReactCommon/yoga"

end

Pod安裝

創(chuàng)建好了Podfile后睦擂,就可以開始安裝React Native的pod包了得湘。

$ pod install

ps:在按照官網(wǎng)的書寫模式后 我執(zhí)行pod install 后出現(xiàn)報錯: (格式和路徑都沒有問題 .......)

后來才看出來自己是直接在iOS工程里集成的根目錄的問題 ?之后將path路徑兩位小數(shù)點改成一位就沒問題 執(zhí)行pod install成功.

代碼集成

現(xiàn)在我們已經(jīng)準(zhǔn)備好了所有依賴,可以開始著手修改原生代碼來把React Native真正植入到應(yīng)用中了顿仇。在我們的2048示例中淘正,首先嘗試添加一個顯示有"High Score"(得分排行榜)的React Native頁面。

React Native組件:創(chuàng)建一個index.ios.js文件

首先創(chuàng)建一個空的index.ios.js文件臼闻。一般來說我們把它放置在項目根目錄下鸿吆。

index.ios.js是React Native應(yīng)用在iOS上的入口文件。而且它是不可或缺的述呐!它可以是個很簡單的文件惩淳,簡單到可以只包含一行require/import導(dǎo)入語句。本教程中為了簡單示范乓搬,把全部的代碼都寫到了index.ios.js里(當(dāng)然實際開發(fā)中我們并不推薦這樣做)思犁。

# 在項目根目錄執(zhí)行以下命令創(chuàng)建文件:$ touch index.ios.js

添加你自己的React Native代碼:

RCTRootView集成:?

新建一個UIViewController中執(zhí)行:?

NSURL*jsCodeLocation = [NSURLURLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=ture"];

NSDictionary*dic =@{@"scores":@[@{@"name":@"Alex",@"value":@"42"},@{@"name":@"Joel",@"value":@"10"}]};

RCTRootView*rootView = [[RCTRootViewalloc]initWithBundleURL:jsCodeLocationmoduleName:@"ExerciseOne"initialProperties:diclaunchOptions:nil];

self.view= rootView;

測試運行: ??由于請求是http的 修改info.plist:

運行Packager ? ?$ npm start ?執(zhí)行成功如圖:

運行應(yīng)用

如果你使用的是Xcode,那么照常編譯和運行應(yīng)用即可缤谎。如果你沒有使用Xcode(但是你仍然必須安裝Xcode)抒倚,則可以在命令行中使用以下命令來運行應(yīng)用:

在項目的根目錄中執(zhí)行: $ react-native run-ios ?

運行成功如下圖:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坷澡,隨后出現(xiàn)的幾起案子托呕,更是在濱河造成了極大的恐慌,老刑警劉巖频敛,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件项郊,死亡現(xiàn)場離奇詭異,居然都是意外死亡斟赚,警方通過查閱死者的電腦和手機着降,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拗军,“玉大人任洞,你說我怎么就攤上這事蓄喇。” “怎么了交掏?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵妆偏,是天一觀的道長。 經(jīng)常有香客問我盅弛,道長钱骂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任挪鹏,我火速辦了婚禮见秽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讨盒。我一直安慰自己解取,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布催植。 她就那樣靜靜地躺著肮蛹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪创南。 梳的紋絲不亂的頭發(fā)上伦忠,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音稿辙,去河邊找鬼昆码。 笑死,一個胖子當(dāng)著我的面吹牛邻储,可吹牛的內(nèi)容都是我干的赋咽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吨娜,長吁一口氣:“原來是場噩夢啊……” “哼脓匿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宦赠,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤陪毡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勾扭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毡琉,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年妙色,在試婚紗的時候發(fā)現(xiàn)自己被綠了桅滋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡身辨,死狀恐怖丐谋,靈堂內(nèi)的尸體忽然破棺而出芍碧,到底是詐尸還是另有隱情,我是刑警寧澤号俐,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布师枣,位于F島的核電站,受9級特大地震影響萧落,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洗贰,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一找岖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敛滋,春花似錦许布、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庶艾,卻和暖如春袁余,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咱揍。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工颖榜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人煤裙。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓掩完,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硼砰。 傳聞我的和親對象是個殘疾皇子且蓬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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