在iOS项目中导入React Native

React Native的势头越来越猛,但凡提及Native,皆是一片666,大有替代原生APP的趋势,也许Native有着大好形势,但目前看来,尚有太多不足。


开始

在iOS原生项目中动态使用React Native定制界面

如果你已经是一个iOS开发者,继续原生项目开发可能是更好的选择,而React Native,也许更加适合原生项目中部分动态页(例如广告、咨询详情)的编写,方便页面的多端重用和即时修改。
完整项目Github地址

1.安装环境

如果你之前只接触过iOS开发,使用终端也仅限于CocoaPods、Git,那么环境配置一定会费一番劲。

2.iOS原生项目

我们需要准备一个简单的原生项目SimpleNative,选用的语言是Swift
Main.storyboard中初始化项目框架:导航控制器内有两层视图控制器,在第一层Controller中居中设置一个button用来push,第二层Controller空白待用

3.初始化React Native的node依赖

1.初始化node

在终端中,定位到iOS项目的根目录,运行
npm init
然后一路回车即可

注意:node项目的命名不能使用大写字母,所以指定name时输入simple-native 后回车

执行完毕之后,在项目根目录下生成了一个package.json文件,类似于CocoaPods的Podfile文件,用来管理项目依赖

2.安装React Native

再项目根目录下运行
npm install --save react-native

由于国内的网络问题,npm安装比较缓慢,可以使用淘宝npm镜像替代

安装完毕之后,根目录下会生成node_modules文件夹,里面保存了reactreact-native的依赖
--save参数会在package.json文件中保存reactreact-native的依赖声明

4.初始化CocoaPods

在项目根目录下,运行
pod init
在项目根目录下生成了Podfile,用任何编辑器打开,编写React Native的依赖

platform :ios, '7.0'

target 'SimpleNative' do
  pod 'React', :path => './node_modules/react-native', :subspecs => [
    'Core',
    'RCTImage',
    'RCTNetwork',
    'RCTText',
    'RCTWebSocket',
    # Add any other subspecs you want to use in your project
  ]
end

target 'SimpleNativeTests' do

end

target 'SimpleNativeUITests' do

end

在项目的target下,pod导入React,路径指向了当前目录下'./node_modules/react-native',然后还有一堆乱七八糟的子依赖(一个都不能少!)
运行pod install安装依赖,本地安装速度很快

5.绑定Native的视图

1.导入Native View

由于使用的是Swift项目,我们需要一个OC-Swift桥接文件导入Native的类,在桥接文件夹导入
#import <RCTRootView.h>

2.设置Native View

点击SimpleNative.xcworkspace打开iOS项目,新建一个ReactView继承于UIView,并为这个view添加RCTRootView的子视图

import UIKit

class ReactView: UIView {
    
    weak var rootView: RCTRootView!
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        
        let jsCodeLocation = NSURL(string: "http://localhost:8081/index.ios.bundle?platform=ios")
        let rootView = RCTRootView(bundleURL: jsCodeLocation, moduleName: "SimpleNative", initialProperties: nil, launchOptions: nil)
        self.rootView = rootView
        self.addSubview(rootView)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        rootView.frame = self.bounds
    }
}

然后在第二层控制器中居中显示一个View,并绑定为ReactView

再次运行项目,点击push按钮后,就会见到第一个红彤彤的Native错误了,但是这表示已经成功绑定了Native


6.启动Native服务

在ReactView的初始化中,我们为rootView指定了bundleURL和moduleName,其中moduleName既是当前项目名,而bundleURL,就要一步一步实现了,步步都是坑😓

1.新建index.ios.js

在项目根目标下,新建ReactComponents文件夹,并在文件夹中新建index.ios.js文件,在js文件中
写入react代码
官方推荐的简单代码为

'use strict';

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

var styles = React.StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: 'red'
  }
});

class SimpleNative extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>This is a simple application.</Text>
      </View>
    )
  }
}

React.AppRegistry.registerComponent('SimpleNative', () => SimpleNative);

如果你希望显示一个更帅气的Native界面,可以拷贝链接代码:Github搜索页

2.启动node服务

建好了js文件,需要启动一个端口为8081的服务将index.ios.js打包成index.ios.bundle
在项目根目录下运行

(JS_DIR=`pwd`/ReactComponents; cd node_modules/react-native; npm run start -- --root $JS_DIR)

分解一下命令:
1.将新建的ReactComponents文件夹目录赋值到JS_DIR上,注意需要是全路径!!!
2.进入node_modules/react-native
3.绑定JS_DIR会监听ReactComponents文件夹下的文件,然后npm run start启动native的node服务
4.三行命令最好用()包装起来,可以避免运行后定位到node_modules/react-native文件夹下

再次运行iOS项目,当然也可以直接在模拟器上 Commend + R刷新,就会获得另一个错误。。。

##### 3.开启Http支持
苹果在iOS9之后默认关闭了对HTTP的支持,需要打开以访问localhost的服务
在iOS项目的`Info.plist`文件中,加入
``` xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>
```
加入后,plist看起来是这样的
![Alt text](http://upload-images.jianshu.io/upload_images/1599608-4a0cefe3e6836158?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
更多关于[App Transport Security](http://stackoverflow.com/questions/31254725/transport-security-has-blocked-a-cleartext-http)

#### 7.最后
重新运行iOS项目,点击push按钮后,在绿色加载条之后(第一次打包编译比较慢),就能看到native的界面了,在搜索栏输入内容后回车,能够简单搜索Github内容(需要在index.ios.js添加[Github搜索页](http://7xq01t.com1.z0.glb.clouddn.com/index.ios.js)代码)
![](http://upload-images.jianshu.io/upload_images/1599608-53a3063b5a4b4a62?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

如果将ReactView放置全屏显示,就更像一个原生的应用了 😉

---
**如果你也喜爱游戏,欢迎支持我的APP**  [Up 游戏专辑](https://itunes.apple.com/app/id986716705)
![](http://upload-images.jianshu.io/upload_images/1599608-fd6974fd45ee440b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358

推荐阅读更多精彩内容