7) React Native 集成到原生項目(iOS)

想了很久拇舀,要先介紹各種組件的實際應(yīng)用好变抽,還是先介紹怎么把React Native集成到原生項目好。
因為想起掠抬,一旦開始寫各種組件的應(yīng)用吼野,就會花很長很長的篇幅,會把這個挺重要的內(nèi)容拋到好遠(yuǎn)两波,而集成到原生項目又是很多人所需要學(xué)習(xí)的(像我一樣哈瞳步,直接替代現(xiàn)有的項目是不科學(xué)的,作為一個模塊集合進(jìn)去才比較現(xiàn)實)腰奋,所以決定了单起,還是先花兩個篇章寫寫怎么將React Native集成到原生項目以及JS與原生之間簡單的交互。


由于React并沒有假設(shè)你其余部分的技術(shù)椃斩椋——它通常只作為MVC模型中的V存在——它也很容易嵌入到一個并非由React Native開發(fā)的應(yīng)用當(dāng)中馏臭。實際上,它可以和常見的許多工具結(jié)合讼稚,譬如CocoaPods括儒。

一、準(zhǔn)備工作

1. React Native 開發(fā)基礎(chǔ)環(huán)境

這個可以直接參考我寫的第二篇文章React Native 環(huán)境搭建和創(chuàng)建項目(Mac)锐想。如果已經(jīng)按上篇文章操作過帮寻,或者說已經(jīng)在Mac平臺已經(jīng)成功運行過React Native應(yīng)用,那肯定是已經(jīng)有了開發(fā)基礎(chǔ)環(huán)境赠摇,可以直接忽略這一步固逗。

1) 安裝Node.js
方式一:
安裝 nvm(安裝向?qū)г?a target="_blank" rel="nofollow">這里)。然后運行命令行如下:

nvm install node && nvm alias default node

這將會默認(rèn)安裝最新版本的Node.js并且設(shè)置好命令行的環(huán)境變量藕帜,這樣你可以輸入node命令來啟動Node.js環(huán)境烫罩。nvm使你可以可以同時安裝多個版本的Node.js,并且在這些版本之間輕松切換洽故。
方式二:
先安裝Homebrew贝攒,再利用Homebrew安裝Node.js,運行命令行如下:

//安裝Home-brew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
//安裝Node.js
brew install node

2) 安裝React Native的命令行工具(react-native-cli)

npm install -g react-native-cli

2. 安裝CocoaPods

本文只寫使用CocoaPods安裝React Native的方式时甚,比較支持使用隘弊,也比較簡單直接哈踱。
若依舊不想使用CocoaPods,想直接集成的朋友可以參考下面兩篇文章:
1)【iOS&Android】RN學(xué)習(xí)3——集成進(jìn)現(xiàn)有原生項目

  1. reactnative集成到原生ios項目 文中的手動集成react-native

如果之前已經(jīng)安裝并使用過CocoaPods梨熙,請忽略這一步(相信只要是iOS開發(fā)开镣,一定大多數(shù)都接觸過了哈)。
若沒有安裝咽扇,則運行命令如下:

gem install  cocoa pods
//權(quán)限不夠則運行下面一句
sudo gem install cocoapods

二邪财、集成React Native

1. 安裝React Native

1)創(chuàng)建ReactComponent文件夾和配置文件

在項目中建一個名為ReactComponent的文件夾, 用于存放我們react-native的相關(guān)文件, 再創(chuàng)建一個package.json文件, 用于初始化react-native.(文件夾名字自定義哈)
文件目錄結(jié)構(gòu)如下:


文件目錄結(jié)構(gòu)1.png

創(chuàng)建package.json文件,文件內(nèi)容如下:

{
  "name": "NativeRNApp",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },
  "dependencies": {
    "react": "15.2.1",
    "react-native": "0.29.2"
  }
}

其中肌割,name為項目名稱卧蜓。dependencies里為react和react-native的版本信息。
建議利用react-native init AwesomeProject新建新項目時會自動創(chuàng)建package.json把敞,直接把文件復(fù)制過來弥奸,更改name為自己的原生項目名,以確保react奋早、和react-native的版本最新哈盛霎。

2)安裝React Native依賴包

在ReactComponent目錄下運行命令行:

npm install

運行效果如下:

npm install.png

這里很需要耐心,曾經(jīng)的我看著毫無反應(yīng)的控制臺就放棄了n次耽装。
可能靜下心去看部動漫回來就會發(fā)現(xiàn)它只想成功了愤炸。
實在install不回來的話,如果之前有創(chuàng)建過React Native項目掉奄,把里面的node_modules直接拷貝過來规个,也是沒有問題(個人嘗試過)。

2. 創(chuàng)建 index.ios.js(js文件入口)

在ReactComponent文件夾里創(chuàng)建index.ios.js文件姓建,作為js文件入口诞仓。


目錄結(jié)構(gòu)2.png

index.ios.js文件內(nèi)容如下:

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

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

class NativeRNApp extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
        <Text style={styles.instructions}>
          To get started, edit index.ios.js
        </Text>
        <Text style={styles.instructions}>
          Press Cmd+R to reload,{'\n'}
          Cmd+D or shake for dev menu
        </Text>
      </View>
    );
  }
}

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

//  項目名要有所對應(yīng)
AppRegistry.registerComponent('NativeRNApp', () => NativeRNApp);

3. Cocoapods集成React Native

若原項目無使用Cocoapods,則在根目錄下創(chuàng)建Podfile速兔。(有則直接添加pod相關(guān)代碼)
目錄結(jié)構(gòu)如下:


目錄結(jié)構(gòu)3.png

Podfile文件內(nèi)容為(需確保路徑對):

platform :ios, “7.0”

# 取決于你的工程如何組織墅拭,你的node_modules文件夾可能會在別的地方。
# 請將:path后面的內(nèi)容修改為正確的路徑(一定要確保正確~~)涣狗。
pod 'React', :path => ‘./ReactComponent/node_modules/react-native', :subspecs => [
 'Core',
  'ART',
  'RCTActionSheet',
  'RCTAdSupport',
  'RCTGeolocation',
  'RCTImage',
  'RCTNetwork',
  'RCTPushNotification',
  'RCTSettings',
  'RCTText',
  'RCTVibration',
  'RCTWebSocket',
  'RCTLinkingIOS',
]
#需要的模塊依賴進(jìn)來便可谍婉,這里是為了舉例子,列舉所有的模塊

然后在根目錄執(zhí)行pod更新命令:

pod install

/*
以下是失敗情況的處理
*/
//  pod命令過慢則可嘗試下面命令
pod install --verbose --no-repo-update

//  其中無法正常下載pod install的解決方法:
(or更新最新的CocoaPods version: 0.39.0  查看方法 pod --version)
gem sources --remove https://rubygems.org/
gem sources -a 
gem sources -l 

# 注意 taobao 是 https; 
# gem如果版本太老可以更新:sudo gem update --system; 
# 更新pod repo:pod repo update

運行效果:


pod install.png

三镀钓、原生項目處理

1. 向?qū)?yīng)ViewController 添加RCTRootView

下面的ReactViewController是我創(chuàng)建的專門放React Native模塊的ViewController穗熬,有必要的話也可對RCTRootView進(jìn)行進(jìn)一步封裝(就不用每次都重新配置一次)。
ReactViewController代碼如下:

#import "ReactViewController.h"
#import <RCTRootView.h>

@interface ReactViewController ()

@end

@implementation ReactViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    NSString * strUrl = @"http://localhost:8081/index.ios.bundle?platform=ios&dev=true";
    NSURL * jsCodeLocation = [NSURL URLWithString:strUrl];
    
    RCTRootView * rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                         moduleName:@"NativeRNApp"
                                                  initialProperties:nil
                                                      launchOptions:nil];
    self.view = rootView;
    //  也可addSubview丁溅,自定義大小位置
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

項目結(jié)構(gòu)如下:


項目結(jié)構(gòu).png

2. iOS項目更新App Transport Security

在iOS 9以上的系統(tǒng)中死陆,除非明確指明,否則應(yīng)用無法通過http協(xié)議連接到localhost主機唧瘾。 我們建議你在Info.plist文件中將localhost列為App Transport Security的例外措译。 如果不這樣做,在嘗試通過http連接到服務(wù)器時饰序,會遭遇這個錯誤 - Could not connect to development server.

打開工程中的 Info.list 文件领虹,添加下面配置即可:

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

配置效果如下:


App Transport Security配置.png

3. 啟動開發(fā)服務(wù)器

在運行我們的項目之前,我們需要先啟動我們的開發(fā)服務(wù)器求豫。進(jìn)入 reactnative目錄 ,然后命令行啟動服務(wù):

react-native start

4. 運行iOS項目

運行成功效果如下:


運行效果.png

可以成功看到上面的界面塌衰,那就恭喜集成成功了。之前弄這個弄了一兩天蝠嘉,主要卡在npm install不回來那一步最疆,然后pod是不可能的。蚤告。寫個更加詳細(xì)的教程希望大家能更輕松的把React Native集成到原生項目中哈努酸,有問題歡迎留言哈。

目前暫時把demo打包到自己的百度云(以后再想辦法放到github):
https://pan.baidu.com/s/1hrKnlvm


因為沒繼續(xù)這方面的工作所以好久沒更新了杜恰,可能代碼因為rn的更新會有些問題获诈,最好更新下pod的版本卵皂,看看官方文檔皂林,看到評論里有相應(yīng)的討論,出現(xiàn)問題的朋友最好也看看評論哈哈获列,可能有解決綁法?───O(≧?≦)O────?

已有的成果如下:
1) React Native 簡介與入門
2) React Native 環(huán)境搭建和創(chuàng)建項目(Mac)
3) React Native 開發(fā)之IDE
4) React Native 入門項目與解析
5) React Native 相關(guān)JS和React基礎(chǔ)
6) React Native 組件生命周期(ES6)
7) React Native 集成到原生項目(iOS)
8) React Native 與原生之間的通信(iOS)
9) React Native 封裝原生UI組件(iOS)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗爹,一起剝皮案震驚了整個濱河市亡嫌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掘而,老刑警劉巖挟冠,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異镣屹,居然都是意外死亡圃郊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門女蜈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來持舆,“玉大人,你說我怎么就攤上這事伪窖∫菰ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵覆山,是天一觀的道長竹伸。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么勋篓? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任吧享,我火速辦了婚禮,結(jié)果婚禮上譬嚣,老公的妹妹穿的比我還像新娘钢颂。我一直安慰自己,他們只是感情好拜银,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布殊鞭。 她就那樣靜靜地躺著,像睡著了一般尼桶。 火紅的嫁衣襯著肌膚如雪操灿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天泵督,我揣著相機與錄音趾盐,去河邊找鬼。 笑死幌蚊,一個胖子當(dāng)著我的面吹牛谤碳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溢豆,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蜒简,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漩仙?” 一聲冷哼從身側(cè)響起搓茬,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎队他,沒想到半個月后卷仑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡麸折,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年锡凝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垢啼。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡窜锯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芭析,到底是詐尸還是另有隱情锚扎,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布馁启,位于F島的核電站驾孔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翠勉,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一妖啥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眉菱,春花似錦迹栓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酥郭。三九已至华坦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間不从,已是汗流浹背惜姐。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椿息,地道東北人歹袁。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像寝优,于是被迫代替她去往敵國和親条舔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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