React Native學(xué)習(xí):使用Cocoapods嵌入到現(xiàn)有iOS項(xiàng)目

【2017.5.2更新】使用Cocoapods集成的確方便,但在引用一些不支持Cocoapods的第三方RN庫時(shí)會有依賴問題畸冲。而且貌似Cocoapods上的更新也稍顯滯后,所以還是推薦使用npm集成款熬,這里推薦另一篇文章iOS現(xiàn)有項(xiàng)目集成React Native

最近在學(xué)習(xí)React Native, 相當(dāng)一部分學(xué)習(xí)文檔在React Native中文網(wǎng)上都有相應(yīng)的中文翻譯吱瘩,而且比官網(wǎng)更為詳盡起來在某些描述下更為詳盡杖爽。但因?yàn)橹形木W(wǎng)的翻譯工作尚未完全結(jié)束帚豪,部分文檔還需從閱讀官網(wǎng)的英文原文〕锨罚現(xiàn)對針對嵌入到現(xiàn)有iOS項(xiàng)目部分Integration With Existing Apps進(jìn)行一下總結(jié)嘁锯,方便日后查閱。

要嵌入React Native到iOS項(xiàng)目中基本包含以下幾步:

  • 1.通過npm在工程中下載React及React Native的node模組
  • 2.通過CocoaPods下載組件framework
  • 3.代碼實(shí)現(xiàn)
  • 4.運(yùn)行測試

1.通過npm在工程中下載React及React Native的node模組

  • 在項(xiàng)目根目錄下創(chuàng)建包依賴文件(package dependencies)package.json聂薪,內(nèi)容如下
{
  "name": "NumberTileGame",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },
  "dependencies": {
    "react": "15.3.2",
    "react-native": "0.37.0"
  }
}

react和react-native盡量使用最新的版本,舊的版本項(xiàng)目編譯時(shí)可能報(bào)錯(cuò)(官網(wǎng)教程中用到的"react": "15.0.2", "react-native": "0.26.1"我就不能編譯通過)蝗羊。查詢當(dāng)前版本可以使用以下命令:

npm info react
npm info react-native

  • 包安裝
    package.json文件所在目錄執(zhí)行命令安裝組件,模組最后會裝node_modules/目錄下

npm install

2.通過CocoaPods下載組件framework

  • 創(chuàng)建Podfile文件藏澳,在.xcodeproj文件所在目錄下執(zhí)行

pod init

Podfile文件下指定具體安裝哪些React Native的依賴庫。所指定的每一個(gè)庫就都稱為一個(gè)subspect耀找,具體支持的subspect可以在node_modules/react-native/React.podspec中查看翔悠。以下是一個(gè)事例:

target 'YourProject' do
  # Uncomment this line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!
  pod 'React', :path => 'node_modules/react-native', :subspecs => [
    'Core',
    'RCTText',
    'RCTNetwork',
    'RCTWebSocket', # needed for debugging
    # Add any other subspecs you want to use in your project
  ]
  # Pods for YourProject

end
  • 開始安裝

pod install

3.代碼實(shí)現(xiàn)

React Native 部分

創(chuàng)建React Native 的頁面入口文件index.ios.js,以官方提供的2048分?jǐn)?shù)頁面為例子野芒。

'use strict';
import React from 'react';
import { AppRegistry, StyleSheet, Text, View} from 'react-native';

class RNHighScores extends React.Component { 
  render() { 
    var contents = this.props["scores"].map( 
      score => <Text key={score.name}>{score.name}:{score.value}{"\n"}</Text> ); 
      return ( 
        <View style={styles.container}> 
          <Text style={styles.highScoresTitle}> 
            2048 High Scores! 
          </Text> 
          <Text style={styles.scores}> 
            {contents} 
          </Text> 
        </View> 
      ); 
  }
}

const styles = StyleSheet.create({ 
    container: { 
      flex: 1,
      justifyContent: 'center', 
      alignItems: 'center', 
      backgroundColor: '#FFFFFF', 
    }, 
    highScoresTitle: { 
      fontSize: 20, 
      textAlign: 'center', 
      margin: 10, 
    }, 
    scores: { 
      textAlign: 'center', 
      color: '#333333', 
      marginBottom: 5, 
    },
});

// Module name
AppRegistry.registerComponent('RNHighScores', () => RNHighScores);

原生部分

UIViewController中引入RCTRootView

#import "RCTRootView.h"

創(chuàng)建頁面

NSURL *jsUrl = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios"];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL : jsUrl
                                             moduleName        : @"RNHighScores"
                                             initialProperties :
                                             @{
                                               @"scores" : @[
                                                       @{
                                                           @"name" : @"Alex",
                                                           @"value": @"42"
                                                           },
                                                       @{
                                                           @"name" : @"Joel",
                                                           @"value": @"10"
                                                           }
                                                       ]
                                               }
                                              launchOptions    : nil];
UIViewController *vc = [[UIViewController alloc] init];
vc.view = rootView;
[self presentViewController:vc animated:YES completion:nil];

index.ios.js是官方的默認(rèn)文件名稱蓄愁,但經(jīng)過試驗(yàn),用其他名字也是可以的狞悲,只要加載的時(shí)候根據(jù)具體的名稱加載就可以了撮抓,感覺可以通過這個(gè)特點(diǎn)創(chuàng)建多個(gè)模塊入口供原生使用。

4.運(yùn)行測試

App Transport Security

一個(gè)小坑摇锋,在iOS9之后默認(rèn)只支持Https協(xié)議的網(wǎng)絡(luò)訪問丹拯,閱讀文檔時(shí)也看到了,但來回配幾次就忘了荸恕,導(dǎo)致后續(xù)頁面總是加載失敗乖酬。Info.plist需要配置如下:

<key>NSAppTransportSecurity</key>
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
        <key>localhost</key> 
        <dict> 
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
            <true/> 
        </dict> 
    </dict>
</dict>

運(yùn)行Packager

在工程根目錄(node_modules所在目錄)運(yùn)行如下語句

npm start

運(yùn)行App

在Xcode中運(yùn)行工程或在根目錄執(zhí)行react-native run-ios命令。

雖然在官方文檔中提到可以用react-native run-ios命令運(yùn)行融求,但在試驗(yàn)過程中一直未能成功咬像,報(bào)ENOENT: no such file or directory, uv_chdir錯(cuò)誤,原因未明。

大功告成县昂,以上肮柜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市七芭,隨后出現(xiàn)的幾起案子素挽,更是在濱河造成了極大的恐慌,老刑警劉巖狸驳,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件预明,死亡現(xiàn)場離奇詭異,居然都是意外死亡耙箍,警方通過查閱死者的電腦和手機(jī)撰糠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辩昆,“玉大人阅酪,你說我怎么就攤上這事≈耄” “怎么了术辐?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長施无。 經(jīng)常有香客問我辉词,道長,這世上最難降的妖魔是什么猾骡? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任瑞躺,我火速辦了婚禮,結(jié)果婚禮上兴想,老公的妹妹穿的比我還像新娘幢哨。我一直安慰自己,他們只是感情好嫂便,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布捞镰。 她就那樣靜靜地躺著,像睡著了一般毙替。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔚龙,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天冰评,我揣著相機(jī)與錄音,去河邊找鬼木羹。 笑死甲雅,一個(gè)胖子當(dāng)著我的面吹牛解孙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抛人,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼弛姜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妖枚?” 一聲冷哼從身側(cè)響起廷臼,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绝页,沒想到半個(gè)月后荠商,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡续誉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年莱没,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酷鸦。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饰躲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臼隔,到底是詐尸還是另有隱情嘹裂,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布摔握,位于F島的核電站寄狼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盒发。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一狡逢、第九天 我趴在偏房一處隱蔽的房頂上張望宁舰。 院中可真熱鬧,春花似錦奢浑、人聲如沸蛮艰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壤蚜。三九已至,卻和暖如春徊哑,著一層夾襖步出監(jiān)牢的瞬間袜刷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工莺丑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留著蟹,地道東北人墩蔓。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像萧豆,于是被迫代替她去往敵國和親奸披。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • 如果你正準(zhǔn)備從頭開始制作一個(gè)新的應(yīng)用涮雷,那么React Native會是個(gè)非常好的選擇阵面。但如果你只想給現(xiàn)有的原生應(yīng)用...
    So_365閱讀 2,118評論 16 7
  • 核心概念 如果你正準(zhǔn)備從頭開始制作一個(gè)新的應(yīng)用,那么React Native會是個(gè)非常好的選擇洪鸭。但如果你只想給現(xiàn)有...
    made_China閱讀 1,381評論 1 2
  • 想了很久样刷,要先介紹各種組件的實(shí)際應(yīng)用好,還是先介紹怎么把React Native集成到原生項(xiàng)目好卿嘲。因?yàn)橄肫鹚绦保坏╅_...
    朱_源浩閱讀 22,757評論 84 129
  • 要說React Native最大的優(yōu)勢,那就是跨平臺拾枣。通過JavaScript來開發(fā)iOS及Android端的應(yīng)用...
    莮亾閱讀 1,291評論 0 2
  • 有時(shí)候沃疮,傾聽是一瞬間的鈴音 她帶你走進(jìn)夏天的心境 有時(shí)候,吶喊是一種釋放的效應(yīng) 她帶你感召萬物的回應(yīng) 有時(shí)候梅肤,交流...
    愛吃魚的空心菜閱讀 237評論 0 0