ReactNative嵌入iOS原生App

就現(xiàn)階段而言 , 完全用ReactNative 構(gòu)建App 還是不太現(xiàn)實 .
但其替代Web與原生App 進行交互, 還是很令我期待的 .
在網(wǎng)上查到了很多集成的方法 , 在此分享一下集成時遇到的一些坑 .

框架集成

集成方法大致分為以下幾種

** 運用CocoaPod 集成 **
** 手動集成框架 **

1. CocoaPod 集成

參考文獻: http://blog.csdn.net/l863784757/article/details/50592341

1.1 文件中創(chuàng)建 Podfile 文件

platform :ios, '7.0'

target 'ReactNativeProject' do
pod 'React', '~> 0.13.0-rc'
pod "React/RCTText"  
pod "React/RCTActionSheet"  
pod "React/RCTGeolocation"  
pod "React/RCTImage"  
pod "React/RCTLinkingIOS"  
pod "React/RCTNetwork"  
pod "React/RCTSettings"  
pod "React/RCTVibration"  
pod "React/RCTWebSocket"

end

在終端執(zhí)行 pod install

幾點注意的是

  • 目前使用Pod 只能集成React-Native 0.13版本 .
    (版本偏低 , 目前版本都到0.37 , 期待Pod更新新版本)
  • 下載架包的時候還是需要翻墻, 否則下載不下來. 而且下載時間也比較長.

1.2 添加頭文件搜索路徑


添加頭文件搜索路徑

頭文件搜索路徑 : $(PODS_ROOT)/React/React

1.3 在工程中 創(chuàng)建index.iOS.js文件

'use strict';  
  
var React = require('react-native');  
var {  
  AppRegistry,  
  StyleSheet,  
  Text,  
  View,  
} = React; 

var ReactNativeProject = React.createClass({  
  render: function() {  
    return (  
      <View style={styles.container}>  
        <Text style={styles.welcome}>  
          Welcome to React Native!  
        </Text>  
        <Text style={styles.instructions}>  
          To get started, edit index.android.js  
        </Text>  
        <Text style={styles.instructions}>  
          Shake or press menu button for dev menu  
        </Text>  
      </View>  
    );  
  }  
});

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

AppRegistry.registerComponent('ReactNativeProject', () => ReactNativeProject);

因為導入的是0.13 版本框架 , 所以只支持ES5 的寫法 , 不支持ES6 .

1.4 在原生代碼中添加RCTRootView 頁面

- (void)createReactNativeView{

    NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
    
    RCTRootView *rnView = [[RCTRootView alloc]
                             initWithBundleURL:jsCodeLocation
                             moduleName:@"ReactNativeProject"
                             initialProperties:nil
                             launchOptions:nil];
    
    rnView.frame = CGRectMake(0, 150 , SCREEN_WIDTH , SCREEN_HEIGHT-150);

    [self.view addSubview:rnView];
}

并打開網(wǎng)絡請求

打開網(wǎng)絡請求

1.5 啟動服務器
創(chuàng)建 run.sh 文件

#! /bin/bash
(cd Pods/React; npm run start)

然后給run.sh添加可執(zhí)行權(quán)限:

chmod +x run.sh

啟動服務器:

./run.sh
效果圖

2. 手動集成框架

參考文獻 : https://segmentfault.com/a/1190000004253916

手動集成框架的好處

2.1 將架包導入項目.
node_modules文件夾放到工程文件夾中
創(chuàng)建Libraries文件夾

項目文件夾

2.2 將.xcodeproj文件 拖拽到工程


.xcodeproj文件

.xcodeproj文件清單
node_modules/react-native/React/React.xcodeproj
node_modules/react-native/Libraries/Image/RCTImage.xcodeproj
node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj
node_modules/react-native/Libraries/Text/RCTText.xcodeproj
node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj
node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj
node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj
node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj
node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj
node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj

2.3 添加 .a 文件


添加 .a 文件

2.4 修改 Build Settings 配置文件


添加頭文件搜索路徑

頭文件搜索路徑 : $(SRCROOT)/node_modules/react-native/React

修改Other Linker Flags 配置

添加為 -ObjC

2.5 在工程中 創(chuàng)建index.iOS.js文件

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

export default class ReactNativeProject2 extends React.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.android.js  
        </Text>  
        <Text style={styles.instructions}>  
          Shake or press menu button for dev menu  
        </Text>  
      </View>  
    );  
  }  
};

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

AppRegistry.registerComponent('ReactNativeProject2', () => ReactNativeProject2);

因為集成的框架是0.37版本 , 所以只支持ES6 的寫法 , 不支持ES5 (很坑)

2.6 在原生代碼中添加RCTRootView 頁面

- (void)createReactNativeView{
    //RCTBundleURLProvider 是0.29版本新添加的類
    NSURL *jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];;
    
    RCTRootView *rnView = [[RCTRootView alloc]
                             initWithBundleURL:jsCodeLocation
                             moduleName:@"ReactNativeProject2"
                             initialProperties:nil
                             launchOptions:nil];
    
    rnView.frame = CGRectMake(0, 150 , SCREEN_WIDTH , SCREEN_HEIGHT-150);

    [self.view addSubview:rnView];

}

關(guān)于RCTBundleURLProvider

并打開網(wǎng)絡請求

打開網(wǎng)絡請求

至此手動加載框架也大功告成


下一篇準備分享 原生App 與 ReactNative的 數(shù)據(jù)交互
如果感覺還不錯 , 點擊喜歡鼓勵一下哦 ????????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末签杈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌并炮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赁濒,死亡現(xiàn)場離奇詭異为鳄,居然都是意外死亡,警方通過查閱死者的電腦和手機溉箕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門晦墙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肴茄,你說我怎么就攤上這事晌畅。” “怎么了寡痰?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵抗楔,是天一觀的道長。 經(jīng)常有香客問我拦坠,道長连躏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任贞滨,我火速辦了婚禮入热,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晓铆。我一直安慰自己勺良,他們只是感情好,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布骄噪。 她就那樣靜靜地躺著尚困,像睡著了一般。 火紅的嫁衣襯著肌膚如雪链蕊。 梳的紋絲不亂的頭發(fā)上事甜,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音滔韵,去河邊找鬼逻谦。 笑死,一個胖子當著我的面吹牛奏属,可吹牛的內(nèi)容都是我干的跨跨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勇婴!你這毒婦竟也來了忱嘹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤耕渴,失蹤者是張志新(化名)和其女友劉穎拘悦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橱脸,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡础米,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了添诉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屁桑。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖栏赴,靈堂內(nèi)的尸體忽然破棺而出蘑斧,到底是詐尸還是另有隱情,我是刑警寧澤须眷,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布竖瘾,位于F島的核電站,受9級特大地震影響花颗,放射性物質(zhì)發(fā)生泄漏捕传。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一扩劝、第九天 我趴在偏房一處隱蔽的房頂上張望庸论。 院中可真熱鬧,春花似錦今野、人聲如沸葡公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涵亏,卻和暖如春宰睡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背气筋。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工拆内, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宠默。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓麸恍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抹沪,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

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