--- id: embedded-app title: Integration with Existing App layout: docs category: Guides permalink: docs/embeded-app.html next: activityindicatorios --- Since React makes no assumptions about the rest of your technology stack – it’s commonly noted as simply the `V` in `MVC` – it’s easily embeddable within an existing non-React Native app. In fact, it integrates with other best practice community tools like [Cocoapods](http://cocoapods.org/). ## Requirements - [Cocoapods](http://cocoapods.org/) – `gem install cocoapods` - [Node.js](http://nodejs.org) – `brew install node` ## Install React Native Using Cocoapods [CocoaPods](http://cocoapods.org/) is a package management tool for iOS/Mac development. We need to use it to download React Native. If you haven't install CocoaPods yet, checkout [this tutorial](http://guides.cocoapods.org/using/getting-started.html). When you are ready to work with CocoaPods, add the following line to `Podfile`. If you don't have one, then create it under the root directory of your project. ``` pod 'React' pod 'React/RCTText' # Add any subspecs you want to use in your project ``` Remember to install all subspecs you need. The `` element cannot be used without `pod 'React/RCTText'`. Then install your pods: ``` $ pod install ``` ## Create Your React Native App There are two pieces you’ll need to set up: 1. The root JavaScript file that will contain your actual React Native app and other components - Wrapper Objective-C code that will load up your script and create a `RCTRootView` to display and manage your React Native components First, create a directory for your app’s React code and create a simple `index.ios.js` file: ``` $ mkdir ReactComponent $ touch index.ios.js ``` Copy & paste following starter code for `index.ios.js` – it’s a barebones React Native app: ``` 'use strict'; var React = require('react-native'); var { Text, View } = React; var styles = React.StyleSheet.create({ container: { flex: 1, backgroundColor: 'red' } }); class SimpleApp extends React.Component { render() { return ( This is a simple application. ) } } React.AppRegistry.registerComponent('SimpleApp', () => SimpleApp); ``` `SimpleApp` will be your **module name**, which will be used later on. ## Add Container View To Your App You should now add container view for React Native component. It can be any `UIView` in your app. ![Container view example](/react-native/img/EmbeddedAppContainerViewExample.png) However, let's subclass `UIView` for the sake of clean code. Let's name it `ReactView`. Open up `Yourproject.xcworkspace` and create a new class `ReactView` (You can name it whatever you like :)). ``` // ReactView.h #import @interface ReactView : UIView @end ``` In a view controller that wants to manage this view, go ahead and add an outlet and wire it up: ``` // ViewController.m @interface ViewController () @property (weak, nonatomic) IBOutlet ReactView *reactView; @end ``` Here I disabled **AutoLayout** for simplicity. In real production world, you should turn on AutoLayout and setup constraints by yourself. ## Add RCTRootView To Container View Ready for the most interesting part? Now we shall create the `RCTRootView`, where your React Native app lives in. In `ReactView.m`, we need to first initiate `RCTRootView` with the URI of your `index.ios.bundle`. `index.ios.bundle` will be created by packager and served by React Native server, which will be discussed later on. ``` NSString *urlString = @"http://localhost:8081/index.ios.bundle"; NSURL *jsCodeLocation = [NSURL URLWithString:urlString]; RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName: @"SimpleApp" launchOptions:nil]; ``` Then add it as a subview of the `ReactView`. ``` [self addSubview:rootView]; rootView.frame = self.bounds; ``` ## Start Development Server In root directory, we need to start React Native development server. ``` (JS_DIR=`pwd`/ReactComponent; cd Pods/React; npm run start -- --root $JS_DIR) ``` This command will start up a React Native development server within our CocoaPods dependency to build our bundled script. The `--root` option indicates the root of your React Native apps – this will be our `ReactComponents` directory containing the single `index.ios.js` file. This running server will package up the `index.ios.bundle` file accessible via `http://localhost:8081/index.ios.bundle`. ## Compile And Run Now compile and run your app. You shall now see your React Native app running inside of the `ReactView`. ![Example](/react-native/img/EmbeddedAppExample.png) Live reload works from the simulator, too! You’ve got a simple React component totally encapsulated behind an Objective-C `UIView` subclass. ## Conclusion So under the hood, when `RCTRootView` is initialized, it will try to download, parse and run the bundle file from React Native development server. All you need to do is to implement your own container view, add `RCTRootView` as its subclass. And then serve the bundle using React Native development server. Then, bravo! You can checkout full source code of sample application [here](https://github.com/tjwudi/EmbededReactNativeExample).