RN嵌入到現(xiàn)有iOS原生應(yīng)用

第一步 環(huán)境配置

注意:

  1. xcode可以正常編寫(xiě)程序并運(yùn)行;
  2. 會(huì)使用終端硬猫。
  3. 讀者需要根據(jù)上下文理解本文運(yùn)行的終端命令所在的目錄
  4. iOS工程根目錄:.xcodeproj文件所在的目錄呛哟;根目錄:將要整合成的整個(gè)工程的目錄(本文的根目錄是指ios/目錄的父目錄)
  5. 此文中的demo來(lái)子官方網(wǎng)站

1.安裝cocoapods

打開(kāi)終端,執(zhí)行以下命令

sudo gem install cocoapods

此步需要安裝一些其他程序滴某,比如我的需要安裝2.2.2版本以上的ruby brew install ruby 。讀者可以根據(jù)實(shí)際情況安裝所需程序。

2.添加package.json文件

cd 到iOS工程根目錄食店,執(zhí)行以下命令,然后編輯package.json赏寇,最后保存

vim package.json

一般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.0.2",
    "react-native": "0.26.1"
  }
}

此處的"name": "NumberTileGame",NumberTileGame替換成自己的iOS工程名

創(chuàng)建完package.json文件后吉嫩,建議將原生的iOS工程文件放到新建的ios/目錄下

3.安裝node_modules/

cd到根目錄,執(zhí)行以下命令

npm install

此步會(huì)根據(jù)上面的package.json文件安裝node_modules

第二步 React Native Framework

Subspecs介紹

使用rn開(kāi)發(fā)App并不是所有的rn框架都必須使用嗅定,而Subspecs為我們提供了選擇自娩,通過(guò)Subspecs列表我們可以進(jìn)行框架選擇。說(shuō)白了露戒,就是Subspecs就是菜單椒功,吃哪些菜點(diǎn)哪些菜捶箱。

例如想要用到AppRegistry, StyleSheet, View和其他的rn核心包,需要導(dǎo)入Core subspec;Text組件需要導(dǎo)入RCTText subspec; Image組件需要導(dǎo)入RCTImage subspec动漾。這些配置需要在下面的Podfile中設(shè)置

node_modules/react-native/React.podspec丁屎。此文件中聲明了react-native框架的各種包。

創(chuàng)建Podfile文件

cd到iOS工程的根目錄(ios/)

pod init

命令執(zhí)行完后會(huì)在(ios/)目錄下創(chuàng)建Podfile文件旱眯,所需要的react-native依賴(lài)庫(kù)在這里配置晨川,初始內(nèi)容如下:

# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'

target 'NumberTileGame' do
  # Uncomment this line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for NumberTileGame

  target 'NumberTileGameTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'NumberTileGameUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

Pod安裝

對(duì)Podfile進(jìn)行修改,根據(jù)需要的組件進(jìn)行配置删豺。如下:

# The target name is most likely the name of your project.
target 'NumberTileGame' do

  # Your 'node_modules' directory is probably in the root of your project,
  # but if not, adjust the `:path` accordingly
  pod 'React', :path => '../node_modules/react-native', :subspecs => [
    'Core',
    'RCTText',
    'RCTWebSocket', # needed for debugging
    # Add any other subspecs you want to use in your project
  ]

end

ios/目錄下共虑,執(zhí)行以下命令

pod install

這一步會(huì)等待很長(zhǎng)時(shí)間,要有耐心。(主要是網(wǎng)絡(luò)問(wèn)題呀页,可以從網(wǎng)上搜索解決辦法)

創(chuàng)建index.ios.js (rn的入口函數(shù))

cd到根目錄妈拌,執(zhí)行以下命令

touch index.ios.js

編寫(xiě)index.ios.js 如下

'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);

此處最后一行代碼中的RNHighScores是自定義的rn組件的名字,iOS原聲代碼調(diào)用時(shí)需要用到

第三步 編寫(xiě)iOS代碼調(diào)用rn

此步可能還有其它方法蓬蝶,請(qǐng)自行查詢(xún)資料
使用xcode打開(kāi)源代碼時(shí)一定要打開(kāi) .xcworkspace 文件尘分,若果直接打開(kāi) .xcodeproj 會(huì)出現(xiàn)鏈接錯(cuò)誤

打開(kāi)工程后,左側(cè)導(dǎo)航欄如下圖所示

1.png

iOS源碼

ViewController.m

#import "ViewController.h"
#import "RCTRootView.h"

@interface ViewController ()

@end

@implementation ViewController

![2.png](http://upload-images.jianshu.io/upload_images/3170699-5debf45bf79aedcb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (IBAction)highScoreButtonPressed:(id)sender {
    NSLog(@"High Score Button Pressed");
    NSURL *jsCodeLocation = [NSURL
                             URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios"];
    RCTRootView *rootView =
    [[RCTRootView alloc] initWithBundleURL : jsCodeLocation
                         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];
}

@end

連線

  1. 在mainboard中創(chuàng)建兩個(gè)UIButton丸氛,如下圖所示
  2. High Scores UIButton與 - (IBAction)highScoreButtonPressed:(id)sender 方法連線培愁,連線時(shí)選擇 Touch Up Inside ,如下圖所示
2.png

測(cè)試

Apple默認(rèn)會(huì)阻止程序訪問(wèn)http缓窜,需要修改info.plis配置定续,如下圖所示

3.png

此時(shí)如果運(yùn)行,可能會(huì)報(bào)以下錯(cuò)誤

4.png

解決此問(wèn)題需要導(dǎo)入 libc++.tbd 依賴(lài)包禾锤,如下圖所示

5.png

最后私股,command + r 運(yùn)行程序

至此,rn整合iOS項(xiàng)目的環(huán)境配置已經(jīng)基本完成时肿,可以愉快的敲代碼了庇茫!可是事與愿違,在我修改代碼的時(shí)候發(fā)現(xiàn)xcode并不支持rn依賴(lài)庫(kù)的代碼補(bǔ)全螃成,后來(lái)從網(wǎng)上找到了解決方法

demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旦签,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寸宏,更是在濱河造成了極大的恐慌宁炫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氮凝,死亡現(xiàn)場(chǎng)離奇詭異羔巢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)竿秆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)启摄,“玉大人,你說(shuō)我怎么就攤上這事幽钢∏副福” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵匪燕,是天一觀的道長(zhǎng)蕾羊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帽驯,這世上最難降的妖魔是什么龟再? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮尼变,結(jié)果婚禮上利凑,老公的妹妹穿的比我還像新娘。我一直安慰自己享甸,他們只是感情好截碴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蛉威,像睡著了一般。 火紅的嫁衣襯著肌膚如雪走哺。 梳的紋絲不亂的頭發(fā)上蚯嫌,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音丙躏,去河邊找鬼择示。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晒旅,可吹牛的內(nèi)容都是我干的栅盲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼废恋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谈秫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鱼鼓,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拟烫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后迄本,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體硕淑,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了置媳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于樟。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拇囊,靈堂內(nèi)的尸體忽然破棺而出迂曲,到底是詐尸還是另有隱情,我是刑警寧澤寂拆,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布奢米,位于F島的核電站,受9級(jí)特大地震影響纠永,放射性物質(zhì)發(fā)生泄漏鬓长。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一尝江、第九天 我趴在偏房一處隱蔽的房頂上張望涉波。 院中可真熱鬧,春花似錦炭序、人聲如沸啤覆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窗声。三九已至,卻和暖如春辜纲,著一層夾襖步出監(jiān)牢的瞬間笨觅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工耕腾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留见剩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓扫俺,卻偏偏與公主長(zhǎng)得像苍苞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狼纬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 第一步 環(huán)境配置 注意:xcode可以正常編寫(xiě)程序并運(yùn)行;會(huì)使用終端羹呵。讀者需要根據(jù)上下文理解本文運(yùn)行的終端命令所在...
    金絲楠閱讀 879評(píng)論 0 7
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 今天心血來(lái)潮,就想嘗試一下將RN工程單獨(dú)嵌入到原生工程中畸颅,所以就做了嘗試担巩,本文是通過(guò)cocopods集成RN到現(xiàn)有...
    FlyOceanFish閱讀 1,915評(píng)論 4 11
  • 他們?cè)谝黄鹨惠呑犹伟蛄怂妥优惠呑臃赶罚蘖怂惠呑印T蚓故侨埃麗?ài)了她一輩子先匪。 這是日劇《〇〇妻》中男主人公久...
    未可_Win閱讀 542評(píng)論 0 5
  • 我常常問(wèn)自己,為什么我會(huì)是一棵樹(shù)弃衍?寒來(lái)暑往呀非,忙忙碌碌地長(zhǎng)葉、落葉镜盯,忙著享受陽(yáng)光雨露岸裙,閑暇的時(shí)間我就用這個(gè)問(wèn)題不...
    薄陰天氣閱讀 344評(píng)論 0 0