####前提 已经配置好React Native命令行环境
####通过CocoaPods集成React Native 参考官方文档: http://reactnative.cn/docs/0.27/embedded-app-ios.html#content
使用CocoaPods集成会出现很多问题,下面重点讲一下如何在原有项目中手工快速集成React Native。
在我们要集成的项目中,进入到*.xcodeproj
文件的上级目录,运行React Native初始化命令react-native init [Project Name]
会出现prompt
, 输入yes
,这样会在ios
目录下生成一个同名工程。init
过程会需要一点时间,耐心等待。
完成后项目文件目录会变成这样:
node_modules
:react native依赖包ios
:iOS项目相关代码,Xcode工程文件android
:Android项目相关代码index.ios.js
:iOS平台加载的JS脚本index.android.js
:Android平台加载的JS脚本package.json
:当前项目的npm package的配置文件,内容如下:
{
"private": true,
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start"
},
"name": "Project",
"dependencies": {
"react": "^15.1.0",
"react-native": "^0.27.2"
},
"version": "0.0.1"
}
接下来,我们可以先把Android相关的文件给干掉:
android
index.android.js
node_modules/react-native/android
node_modules/react-native/ReactAndroid
打开ios
目录下的那个同名工程,可以看到这个工程引用的React Native库如下:
打开我们原有的项目,右键工程目录,选择New Group
,新建一个名为Libraries
的目录
然后把前面项目Libraries
下的*.xcodeproj
文件全部拖到这个项目的Libraries
下,效果跟上图一样。
React Native的iOS项目在编译时会先运行一个shell脚本,其作用有两个:
- 从Terminal启动了一个Node.js的server用于React Native调试
- 将React Native的资源文件打包放在编译目录下
具体添加方式:
- 选择
TARGETS
的Build Phases
界面,点击左上角的+
号 - 选择
New Run Script Phase
添加一个脚本,并命名为Bundle React Native code and images
- 把
ios
下工程中的脚本引用代码复制过来,如下图。注意路径,因为我们的原有的*.xcodeproj
文件跟node_modules
是在同一个目录下的,所以我们要去掉两个点中的一个点。
到这一步,我们就可以干掉ios
目录了,然后关闭原有的工程,再重新打开。
在工程的Build Phases
界面的 Link Binary With Libraries
,点击
最下面的+
号,可以看到在Workspace
下多了很多.a
文件,如下图,把它们全部添加进去。
- 接下来还需要添加
React
的搜索头文件,在TARGETS->Build Settings->Header Search Paths
中添加一条$(SRCROOT)/node_modules/react-native/React
,选择recursive
,如下图所示。
我们先编译一下,会发现编译不通过,一堆报错。
原因是我们还没有导入JavaScriptCore
库。因为React Native与原生的交互需要依赖于JavaScriptCore.framework
。
再次编译,发现可以编译成功了。
在AppDelegate.m
中的didFinishLaunchingWithOptions:
方法中添加如下代码:
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"Project"
initialProperties:nil
launchOptions:launchOptions];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
CMD+R
运行,会看到如下界面:
至此,原有项目集成React Native大功告成。祝在React Native的世界中玩得开心!