Integración con aplicaciones existentes
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
React Native es excelente cuando comienzas una nueva aplicación móvil desde cero. Sin embargo, también funciona muy bien para agregar una vista única o flujo de usuario a aplicaciones nativas existentes. Con unos pocos pasos, puedes añadir nuevas características, pantallas, vistas, etc. basadas en React Native.
Los pasos específicos varían según la plataforma para la que estés desarrollando.
- Android (Java & Kotlin)
- iOS (Objective-C and Swift)
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Conceptos clave
Los aspectos fundamentales para integrar componentes de React Native en tu aplicación Android son:
-
Configurar la estructura de directorios correcta.
-
Instalar las dependencias de NPM necesarias.
-
Agregar React Native a tu configuración de Gradle.
-
Escribir el código TypeScript para tu primera pantalla de React Native.
-
Integrar React Native con tu código Android usando ReactActivity.
-
Probar la integración ejecutando el bundler y viendo tu aplicación en funcionamiento.
Usando la plantilla comunitaria
Mientras sigues esta guía, te sugerimos usar la Plantilla Comunitaria de React Native como referencia. La plantilla contiene una aplicación Android mínima y te ayudará a comprender cómo integrar React Native en una aplicación Android existente.
Prerrequisitos
Sigue la guía para configurar tu entorno de desarrollo y usar React Native sin un framework para preparar tu entorno y desarrollar aplicaciones React Native para Android.
Esta guía también asume que estás familiarizado con los conceptos básicos de desarrollo Android como crear Activities y editar el archivo AndroidManifest.xml.
1. Configurar la estructura de directorios
Para garantizar una experiencia fluida, crea una nueva carpeta para tu proyecto integrado de React Native y luego mueve tu proyecto Android existente al subdirectorio /android.
2. Instalar dependencias de NPM
Ve al directorio raíz y ejecuta el siguiente comando:
curl -O https://raw.githubusercontent.com/react-native-community/template/refs/heads/Siguiente-stable/template/package.json
This will copy the package.json file from the Community template to your project.
Luego, instala los paquetes de NPM ejecutando:
- npm
- Yarn
npm install
yarn install
El proceso de instalación creará una nueva carpeta node_modules. Esta carpeta almacena todas las dependencias JavaScript necesarias para construir tu proyecto.
Add node_modules/ to your .gitignore file (here the Community default one).
3. Agregar React Native a tu aplicación
Configurar Gradle
React Native utiliza el React Native Gradle Plugin para configurar tus dependencias y la estructura del proyecto.
First, let's edit your settings.gradle file by adding those lines (as suggested from the Community template):
// Configures the React Native Gradle Settings plugin used for autolinking
pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") }
plugins { id("com.facebook.react.settings") }
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
// If using .gradle.kts files:
// extensions.configure<com.facebook.react.ReactSettingsExtension> { autolinkLibrariesFromCommand() }
includeBuild("../node_modules/@react-native/gradle-plugin")
// Include your existing Gradle modules here.
// include(":app")
Then you need to open your top level build.gradle and include this line (as suggested from the Community template):
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle:7.3.1")
+ classpath("com.facebook.react:react-native-gradle-plugin")
}
}
This makes sure the React Native Gradle Plugin (RNGP) is available inside your project.
Finally, add those lines inside your Applications's build.gradle file (it's a different build.gradle file usually inside your app folder - you can use the Community template file as reference):
apply plugin: "com.android.application"
+apply plugin: "com.facebook.react"
repositories {
mavenCentral()
}
dependencies {
// Other dependencies here
+ // Note: we intentionally don't specify the version number here as RNGP will take care of it.
+ // If you don't use the RNGP, you'll have to specify version manually.
+ implementation("com.facebook.react:react-android")
+ implementation("com.facebook.react:hermes-android")
}
+react {
+ // Needed to enable Autolinking - https://github.com/react-native-community/cli/blob/master/docs/autolinking.md
+ autolinkLibrariesWithApp()
+}
Finally, open your application gradle.properties files and add the following line (here the Community template file as reference):
+reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
+newArchEnabled=true
+hermesEnabled=true
Configurar tu manifiesto
Primero, asegúrate de tener el permiso de Internet en tu AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+ <uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".MainApplication">
</application>
</manifest>
Luego necesitas habilitar el tráfico de texto claro en tu AndroidManifest.xml de debug:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
+ android:usesCleartextTraffic="true"
+ tools:targetApi="28"
/>
</manifest>
As usual, here the AndroidManifest.xml file from the Community template to use as a reference: main and debug.
Esto es necesario porque tu aplicación se comunicará con tu servidor de paquetes local, Metro, mediante HTTP.
Asegúrate de agregar esto solo en tu manifiesto de debug.
4. Escribiendo el código TypeScript
Ahora modificaremos la aplicación nativa de Android para integrar React Native.
El primer código que escribiremos será el componente React Native para la nueva pantalla que se integrará en nuestra aplicación.
Crear un archivo index.js
Primero, crea un archivo index.js vacío en la raíz de tu proyecto React Native.
index.js es el punto de entrada para aplicaciones React Native y siempre es requerido. Puede ser un archivo pequeño que importe otros archivos de tu componente o aplicación, o puede contener todo el código necesario.
Our index.js should look as follows (here the Community template file as reference):
import {AppRegistry} from 'react-native';
import App from './App';
AppRegistry.registerComponent('HelloWorld', () => App);
Crear un archivo App.tsx
Let's create an App.tsx file. This is a TypeScript file that can have JSX expressions. It contains the root React Native component that we will integrate into our Android application (link):
import React from 'react';
import {
SafeAreaView,
ScrollView,
StatusBar,
StyleSheet,
Text,
useColorScheme,
View,
} from 'react-native';
import {
Colors,
DebugInstructions,
Header,
ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';
function App(): React.JSX.Element {
const isDarkMode = useColorScheme() === 'dark';
const backgroundStyle = {
backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
};
return (
<SafeAreaView style={backgroundStyle}>
<StatusBar
barStyle={isDarkMode ? 'light-content' : 'dark-content'}
backgroundColor={backgroundStyle.backgroundColor}
/>
<ScrollView
contentInsetAdjustmentBehavior="automatic"
style={backgroundStyle}>
<Header />
<View
style={{
backgroundColor: isDarkMode
? Colors.black
: Colors.white,
padding: 24,
}}>
<Text style={styles.title}>Step One</Text>
<Text>
Edit <Text style={styles.bold}>App.tsx</Text> to
change this screen and see your edits.
</Text>
<Text style={styles.title}>See your changes</Text>
<ReloadInstructions />
<Text style={styles.title}>Debug</Text>
<DebugInstructions />
</View>
</ScrollView>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
title: {
fontSize: 24,
fontWeight: '600',
},
bold: {
fontWeight: '700',
},
});
export default App;
Here is the Community template file as reference.
5. Integración con tu código Android
Ahora necesitamos agregar código nativo para iniciar el entorno de ejecución de React Native y renderizar nuestros componentes React.
Actualizar tu clase Application
Primero, actualizaremos tu clase Application para inicializar React Native correctamente:
- Java
- Kotlin
package <your-package-here>;
import android.app.Application;
+import com.facebook.react.PackageList;
+import com.facebook.react.ReactApplication;
+import com.facebook.react.ReactHost;
+import com.facebook.react.ReactNativeHost;
+import com.facebook.react.ReactPackage;
+import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
+import com.facebook.react.defaults.DefaultReactHost;
+import com.facebook.react.defaults.DefaultReactNativeHost;
+import com.facebook.soloader.SoLoader;
+import com.facebook.react.soloader.OpenSourceMergedSoMapping
+import java.util.List;
-class MainApplication extends Application {
+class MainApplication extends Application implements ReactApplication {
+ @Override
+ public ReactNativeHost getReactNativeHost() {
+ return new DefaultReactNativeHost(this) {
+ @Override
+ protected List<ReactPackage> getPackages() { return new PackageList(this).getPackages(); }
+ @Override
+ protected String getJSMainModuleName() { return "index"; }
+ @Override
+ public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; }
+ @Override
+ protected boolean isNewArchEnabled() { return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; }
+ @Override
+ protected Boolean isHermesEnabled() { return BuildConfig.IS_HERMES_ENABLED; }
+ };
+ }
+ @Override
+ public ReactHost getReactHost() {
+ return DefaultReactHost.getDefaultReactHost(getApplicationContext(), getReactNativeHost());
+ }
@Override
public void onCreate() {
super.onCreate();
+ SoLoader.init(this, OpenSourceMergedSoMapping);
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
+ DefaultNewArchitectureEntryPoint.load();
+ }
}
}
// package <your-package-here>
import android.app.Application
+import com.facebook.react.PackageList
+import com.facebook.react.ReactApplication
+import com.facebook.react.ReactHost
+import com.facebook.react.ReactNativeHost
+import com.facebook.react.ReactPackage
+import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
+import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
+import com.facebook.react.defaults.DefaultReactNativeHost
+import com.facebook.soloader.SoLoader
+import com.facebook.react.soloader.OpenSourceMergedSoMapping
-class MainApplication : Application() {
+class MainApplication : Application(), ReactApplication {
+ override val reactNativeHost: ReactNativeHost =
+ object : DefaultReactNativeHost(this) {
+ override fun getPackages(): List<ReactPackage> = PackageList(this).packages
+ override fun getJSMainModuleName(): String = "index"
+ override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
+ override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
+ override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
+ }
+ override val reactHost: ReactHost
+ get() = getDefaultReactHost(applicationContext, reactNativeHost)
override fun onCreate() {
super.onCreate()
+ SoLoader.init(this, OpenSourceMergedSoMapping)
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
+ load()
+ }
}
}
As usual, here the MainApplication.kt Community template file as reference.
Crear una ReactActivity
Finalmente, crearemos una nueva Activity que extenderá ReactActivity y alojará el código React Native. Esta actividad será responsable de iniciar el entorno de ejecución y renderizar el componente React.
- Java
- Kotlin
// package <your-package-here>;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactActivityDelegate;
public class MyReactActivity extends ReactActivity {
@Override
protected String getMainComponentName() {
return "HelloWorld";
}
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new DefaultReactActivityDelegate(this, getMainComponentName(), DefaultNewArchitectureEntryPoint.getFabricEnabled());
}
}
// package <your-package-here>
import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
import com.facebook.react.defaults.DefaultReactActivityDelegate
class MyReactActivity : ReactActivity() {
override fun getMainComponentName(): String = "HelloWorld"
override fun createReactActivityDelegate(): ReactActivityDelegate =
DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)
}
As usual, here the MainActivity.kt Community template file as reference.
Cuando crees una nueva Activity, debes agregarla a tu archivo AndroidManifest.xml. También debes establecer el tema de MyReactActivity como Theme.AppCompat.Light.NoActionBar (o cualquier tema sin ActionBar), de lo contrario tu aplicación mostrará una barra de acción sobre tu pantalla React Native:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".MainApplication">
+ <activity
+ android:name=".MyReactActivity"
+ android:label="@string/app_name"
+ android:theme="@style/Theme.AppCompat.Light.NoActionBar">
+ </activity>
</application>
</manifest>
Ahora tu actividad está lista para ejecutar código JavaScript.
6. Prueba tu integración
Has completado todos los pasos básicos para integrar React Native con tu aplicación. Ahora iniciaremos el bundler Metro para compilar tu código de aplicación TypeScript en un bundle. El servidor HTTP de Metro comparte el bundle desde localhost en tu entorno de desarrollo hacia un simulador o dispositivo. Esto permite el hot reloading.
Primero, necesitas crear un archivo metro.config.js en la raíz de tu proyecto con el siguiente contenido:
const {getDefaultConfig} = require('@react-native/metro-config');
module.exports = getDefaultConfig(__dirname);
You can checkout the metro.config.js file from the Community template file as reference.
Una vez que tengas el archivo de configuración listo, puedes ejecutar el bundler. Ejecuta el siguiente comando en el directorio raíz de tu proyecto:
- npm
- Yarn
npm start
yarn start
Ahora compila y ejecuta tu aplicación de Android como lo harías normalmente.
Cuando accedas a tu Activity impulsada por React dentro de la aplicación, debería cargar el código JavaScript desde el servidor de desarrollo y mostrar:

Creando una build de release en Android Studio
¡También puedes usar Android Studio para crear tus builds de release! Es tan rápido como crear builds de release de tu aplicación nativa de Android existente.
El React Native Gradle Plugin se encargará de empaquetar el código JS dentro de tu APK/App Bundle.
Si no estás usando Android Studio, puedes crear una build de release con:
cd android
# For a Release APK
./gradlew :app:assembleRelease
# For a Release AAB
./gradlew :app:bundleRelease
./gradlew :app:assembleRelease
En este punto puedes continuar desarrollando tu aplicación normalmente. Consulta nuestra documentación sobre depuración y despliegue para aprender más sobre cómo trabajar con React Native.
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Conceptos clave
Los aspectos fundamentales para integrar componentes de React Native en tu aplicación iOS son:
-
Configurar la estructura de directorios correcta.
-
Instalar las dependencias de NPM necesarias.
-
Añadir React Native a la configuración de tu Podfile.
-
Escribir el código TypeScript para tu primera pantalla de React Native.
-
Integrar React Native con tu código iOS usando un
RCTRootView. -
Probar la integración ejecutando el bundler y viendo tu aplicación en funcionamiento.
Usando la plantilla comunitaria
Mientras sigues esta guía, te sugerimos usar como referencia la Plantilla Comunitaria de React Native. Esta plantilla contiene una aplicación iOS mínima y te ayudará a comprender cómo integrar React Native en una aplicación iOS existente.
Prerrequisitos
Sigue la guía para configurar tu entorno de desarrollo y usar React Native sin un framework para preparar tu entorno de desarrollo y crear aplicaciones React Native para iOS.
Esta guía también asume que estás familiarizado con los conceptos básicos de desarrollo iOS como crear un UIViewController y editar archivos Podfile.
1. Configurar la estructura de directorios
Para garantizar una experiencia fluida, crea una nueva carpeta para tu proyecto integrado de React Native y luego mueve tu proyecto iOS existente al subdirectorio /ios.
2. Instalar dependencias de NPM
Ve al directorio raíz y ejecuta el siguiente comando:
curl -O https://raw.githubusercontent.com/react-native-community/template/refs/heads/Siguiente-stable/template/package.json
This will copy the package.json file from the Community template to your project.
Luego, instala los paquetes de NPM ejecutando:
- npm
- Yarn
npm install
yarn install
El proceso de instalación creará una nueva carpeta node_modules. Esta carpeta almacena todas las dependencias JavaScript necesarias para construir tu proyecto.
Add node_modules/ to your .gitignore file (here the Community default one).
3. Instalar herramientas de desarrollo
Command Line Tools para Xcode
Instala las Command Line Tools. Selecciona Settings... (o Preferences...) en el menú de Xcode. Ve al panel Locations e instala las herramientas seleccionando la versión más reciente en el desplegable Command Line Tools.

CocoaPods
CocoaPods es una herramienta de gestión de paquetes para desarrollo iOS y macOS. La usamos para añadir localmente el código del framework React Native a tu proyecto actual.
Recomendamos instalar CocoaPods usando Homebrew:
brew install cocoapods
4. Añadir React Native a tu aplicación
Configurar CocoaPods
Para configurar CocoaPods necesitamos dos archivos:
-
Un Gemfile que defina las dependencias Ruby necesarias.
-
Un Podfile que defina cómo instalar correctamente nuestras dependencias.
Para el Gemfile, ve al directorio raíz de tu proyecto y ejecuta este comando:
curl -O https://raw.githubusercontent.com/react-native-community/template/refs/heads/Siguiente-stable/template/Gemfile
Esto descargará el Gemfile desde la plantilla.
Si creaste tu proyecto con Xcode 16, debes actualizar el Gemfile de la siguiente manera:
-gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1'
+gem 'cocoapods', '1.16.2'
gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
-gem 'xcodeproj', '< 1.26.0'
+gem 'xcodeproj', '1.27.0'
Xcode 16 genera proyectos de forma ligeramente diferente a versiones anteriores, y necesitas las últimas versiones de las gemas CocoaPods y Xcodeproj para que funcione correctamente.
De manera similar, para el Podfile, ve a la carpeta ios de tu proyecto y ejecuta:
curl -O https://raw.githubusercontent.com/react-native-community/template/refs/heads/Siguiente-stable/template/ios/Podfile
Please use the Community Template as a reference point for the Gemfile and for the Podfile.
Recuerda cambiar this line.
Ahora necesitamos ejecutar algunos comandos adicionales para instalar las gemas de Ruby y los Pods.
Navega a la carpeta ios y ejecuta los siguientes comandos:
bundle install
bundle exec pod install
El primer comando instalará las dependencias de Ruby, y el segundo comando integrará el código de React Native en tu aplicación para que tus archivos iOS puedan importar los encabezados de React Native.
5. Escribiendo el código TypeScript
Ahora modificaremos la aplicación nativa de iOS para integrar React Native.
El primer código que escribiremos será el componente React Native para la nueva pantalla que se integrará en nuestra aplicación.
Crear un archivo index.js
Primero, crea un archivo index.js vacío en la raíz de tu proyecto React Native.
index.js es el punto de entrada para aplicaciones React Native y siempre es requerido. Puede ser un archivo pequeño que importe otros archivos de tu componente o aplicación, o puede contener todo el código necesario.
Our index.js should look as follows (here the Community template file as reference):
import {AppRegistry} from 'react-native';
import App from './App';
AppRegistry.registerComponent('HelloWorld', () => App);
Crear un archivo App.tsx
Let's create an App.tsx file. This is a TypeScript file that can have JSX expressions. It contains the root React Native component that we will integrate into our iOS application (link):
import React from 'react';
import {
SafeAreaView,
ScrollView,
StatusBar,
StyleSheet,
Text,
useColorScheme,
View,
} from 'react-native';
import {
Colors,
DebugInstructions,
Header,
ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';
function App(): React.JSX.Element {
const isDarkMode = useColorScheme() === 'dark';
const backgroundStyle = {
backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
};
return (
<SafeAreaView style={backgroundStyle}>
<StatusBar
barStyle={isDarkMode ? 'light-content' : 'dark-content'}
backgroundColor={backgroundStyle.backgroundColor}
/>
<ScrollView
contentInsetAdjustmentBehavior="automatic"
style={backgroundStyle}>
<Header />
<View
style={{
backgroundColor: isDarkMode
? Colors.black
: Colors.white,
padding: 24,
}}>
<Text style={styles.title}>Step One</Text>
<Text>
Edit <Text style={styles.bold}>App.tsx</Text> to
change this screen and see your edits.
</Text>
<Text style={styles.title}>See your changes</Text>
<ReloadInstructions />
<Text style={styles.title}>Debug</Text>
<DebugInstructions />
</View>
</ScrollView>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
title: {
fontSize: 24,
fontWeight: '600',
},
bold: {
fontWeight: '700',
},
});
export default App;
Here is the Community template file as reference.
5. Integración con tu código iOS
Ahora necesitamos agregar código nativo para iniciar el entorno de ejecución de React Native y renderizar nuestros componentes React.
Requisitos
La inicialización de React Native ya no está vinculada a ninguna parte específica de una aplicación iOS.
React Native puede inicializarse usando una clase llamada RCTReactNativeFactory, que se encarga de gestionar el ciclo de vida de React Native.
Una vez inicializada la clase, puedes iniciar una vista de React Native proporcionando un objeto UIWindow, o pedir a la fábrica que genere un UIView que puedas cargar en cualquier UIViewController.
En el siguiente ejemplo, crearemos un ViewController que pueda cargar una vista de React Native como su view.
Crear el ReactViewController
Create a new file from template (⌘+N) and choose the Cocoa Touch Class template.
Asegúrate de seleccionar UIViewController en el campo "Subclass of".
- ObjectiveC
- Swift
Now open the ReactViewController.m file and apply the following changes
#import "ReactViewController.h"
+#import <React/RCTBundleURLProvider.h>
+#import <RCTReactNativeFactory.h>
+#import <RCTDefaultReactNativeFactoryDelegate.h>
+#import <RCTAppDependencyProvider.h>
@interface ReactViewController ()
@end
+@interface ReactNativeFactoryDelegate: RCTDefaultReactNativeFactoryDelegate
+@end
-@implementation ReactViewController
+@implementation ReactViewController {
+ RCTReactNativeFactory *_factory;
+ id<RCTReactNativeFactoryDelegate> _factoryDelegate;
+}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
+ _factoryDelegate = [ReactNativeFactoryDelegate new];
+ _factoryDelegate.dependencyProvider = [RCTAppDependencyProvider new];
+ _factory = [[RCTReactNativeFactory alloc] initWithDelegate:_factoryDelegate];
+ self.view = [_factory.rootViewFactory viewWithModuleName:@"HelloWorld"];
}
@end
+@implementation ReactNativeFactoryDelegate
+
+- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
+{
+ return [self bundleURL];
+}
+
+- (NSURL *)bundleURL
+{
+#if DEBUG
+ return [RCTBundleURLProvider.sharedSettings jsBundleURLForBundleRoot:@"index"];
+#else
+ return [NSBundle.mainBundle URLForResource:@"main" withExtension:@"jsbundle"];
+#endif
+}
@end
Now open the ReactViewController.swift file and apply the following changes
import UIKit
+import React
+import React_RCTAppDelegate
+import ReactAppDependencyProvider
class ReactViewController: UIViewController {
+ var reactNativeFactory: RCTReactNativeFactory?
+ var reactNativeFactoryDelegate: RCTReactNativeFactoryDelegate?
override func viewDidLoad() {
super.viewDidLoad()
+ reactNativeFactoryDelegate = ReactNativeDelegate()
+ reactNativeFactoryDelegate!.dependencyProvider = RCTAppDependencyProvider()
+ reactNativeFactory = RCTReactNativeFactory(delegate: reactNativeFactoryDelegate!)
+ view = reactNativeFactory!.rootViewFactory.view(withModuleName: "HelloWorld")
}
}
+class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate {
+ override func sourceURL(for bridge: RCTBridge) -> URL? {
+ self.bundleURL()
+ }
+
+ override func bundleURL() -> URL? {
+ #if DEBUG
+ RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")
+ #else
+ Bundle.main.url(forResource: "main", withExtension: "jsbundle")
+ #endif
+ }
+
+}
Presentar una vista de React Native en un rootViewController
Finalmente, podemos presentar nuestra vista de React Native. Para ello, necesitamos un nuevo View Controller que pueda alojar una vista donde cargar el contenido JS. Ya tenemos el ViewController inicial y podemos hacer que presente el ReactViewController. Hay varias formas de hacerlo, dependiendo de tu aplicación. Para este ejemplo, asumimos que tienes un botón que presenta React Native de forma modal.
- ObjectiveC
- Swift
#import "ViewController.h"
+#import "ReactViewController.h"
@interface ViewController ()
@end
- @implementation ViewController
+@implementation ViewController {
+ ReactViewController *reactViewController;
+}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = UIColor.systemBackgroundColor;
+ UIButton *button = [UIButton new];
+ [button setTitle:@"Open React Native" forState:UIControlStateNormal];
+ [button setTitleColor:UIColor.systemBlueColor forState:UIControlStateNormal];
+ [button setTitleColor:UIColor.blueColor forState:UIControlStateHighlighted];
+ [button addTarget:self action:@selector(presentReactNative) forControlEvents:UIControlEventTouchUpInside];
+ [self.view addSubview:button];
+ button.translatesAutoresizingMaskIntoConstraints = NO;
+ [NSLayoutConstraint activateConstraints:@[
+ [button.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
+ [button.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
+ [button.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor],
+ [button.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],
+ ]];
}
+- (void)presentReactNative
+{
+ if (reactViewController == NULL) {
+ reactViewController = [ReactViewController new];
+ }
+ [self presentViewController:reactViewController animated:YES];
+}
@end
import UIKit
class ViewController: UIViewController {
+ var reactViewController: ReactViewController?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.view.backgroundColor = .systemBackground
+ let button = UIButton()
+ button.setTitle("Open React Native", for: .normal)
+ button.setTitleColor(.systemBlue, for: .normal)
+ button.setTitleColor(.blue, for: .highlighted)
+ button.addAction(UIAction { [weak self] _ in
+ guard let self else { return }
+ if reactViewController == nil {
+ reactViewController = ReactViewController()
+ }
+ present(reactViewController!, animated: true)
+ }, for: .touchUpInside)
+ self.view.addSubview(button)
+
+ button.translatesAutoresizingMaskIntoConstraints = false
+ NSLayoutConstraint.activate([
+ button.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
+ button.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
+ button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
+ button.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
+ ])
}
}
Asegúrate de desactivar el sandbox de scripting. Para lograrlo, en Xcode haz clic en tu app, luego en Build Settings. Filtra por "script" y establece User Script Sandboxing en NO. Este paso es necesario para cambiar correctamente entre las versiones Debug y Release del motor Hermes que incluimos con React Native.

Finalmente, asegúrate de agregar la clave UIViewControllerBasedStatusBarAppearance en tu archivo Info.plist con el valor NO.

6. Prueba tu integración
Has completado todos los pasos básicos para integrar React Native con tu aplicación. Ahora iniciaremos el bundler Metro para compilar tu código de aplicación TypeScript en un bundle. El servidor HTTP de Metro comparte el bundle desde localhost en tu entorno de desarrollo hacia un simulador o dispositivo. Esto permite el hot reloading.
Primero, necesitas crear un archivo metro.config.js en la raíz de tu proyecto con el siguiente contenido:
const {getDefaultConfig} = require('@react-native/metro-config');
module.exports = getDefaultConfig(__dirname);
You can checkout the metro.config.js file from the Community template file as reference.
Luego, debes crear un archivo .watchmanconfig en la raíz de tu proyecto. El archivo debe contener un objeto JSON vacío:
echo {} > .watchmanconfig
Una vez que tengas el archivo de configuración listo, puedes ejecutar el bundler. Ejecuta el siguiente comando en el directorio raíz de tu proyecto:
- npm
- Yarn
npm start
yarn start
Ahora compila y ejecuta tu aplicación iOS normalmente.
Cuando accedas a tu Activity impulsada por React dentro de la aplicación, debería cargar el código JavaScript desde el servidor de desarrollo y mostrar:

Crear una build de release en Xcode
¡También puedes usar Xcode para crear tus builds de release! El único paso adicional es agregar un script que se ejecute cuando se construye la aplicación para empaquetar tu JS e imágenes dentro de la aplicación iOS.
-
En Xcode, selecciona tu aplicación
-
Haz clic en
Build Phases -
Haz clic en
+en la esquina superior izquierda y seleccionaNew Run Script Phase -
Haz clic en la línea
Run Scripty renombra el Script aBundle React Native code and images -
Pega en el cuadro de texto el siguiente script
set -e
WITH_ENVIRONMENT="$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh"
REACT_NATIVE_XCODE="$REACT_NATIVE_PATH/scripts/react-native-xcode.sh"
/bin/sh -c "$WITH_ENVIRONMENT $REACT_NATIVE_XCODE"
- Arrastra y suelta el script antes del llamado
[CP] Embed Pods Frameworks.
Ahora, si construyes tu aplicación para Release, funcionará como se espera.
7. Pasar props iniciales a la vista de React Native
En algunos casos, querrás pasar información desde la aplicación nativa a JavaScript. Por ejemplo, podrías querer pasar el ID de usuario del usuario actualmente conectado a React Native, junto con un token que pueda usarse para recuperar información de una base de datos.
Esto es posible utilizando el parámetro initialProperties de la sobrecarga view(withModuleName:initialProperty) de la clase RCTReactNativeFactory. Los siguientes pasos te mostrarán cómo hacerlo.
Actualiza el archivo App.tsx para leer las propiedades iniciales
Abre el archivo App.tsx y agrega el siguiente código:
import {
Colors,
DebugInstructions,
Header,
ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';
-function App(): React.JSX.Element {
+function App(props): React.JSX.Element {
const isDarkMode = useColorScheme() === 'dark';
const backgroundStyle = {
backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
};
return (
<SafeAreaView style={backgroundStyle}>
<StatusBar
barStyle={isDarkMode ? 'light-content' : 'dark-content'}
backgroundColor={backgroundStyle.backgroundColor}
/>
<ScrollView
contentInsetAdjustmentBehavior="automatic"
style={backgroundStyle}>
<Header />
- <View
- style={{
- backgroundColor: isDarkMode
- ? Colors.black
- : Colors.white,
- padding: 24,
- }}>
- <Text style={styles.title}>Step One</Text>
- <Text>
- Edit <Text style={styles.bold}>App.tsx</Text> to
- change this screen and see your edits.
- </Text>
- <Text style={styles.title}>See your changes</Text>
- <ReloadInstructions />
- <Text style={styles.title}>Debug</Text>
- <DebugInstructions />
+ <Text style={styles.title}>UserID: {props.userID}</Text>
+ <Text style={styles.title}>Token: {props.token}</Text>
</View>
</ScrollView>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
title: {
fontSize: 24,
fontWeight: '600',
+ marginLeft: 20,
},
bold: {
fontWeight: '700',
},
});
export default App;
Estos cambios indicarán a React Native que tu componente App ahora acepta ciertas propiedades. La RCTreactNativeFactory se encargará de pasarlas al componente durante su renderizado.
Actualiza el código nativo para pasar las propiedades iniciales a JavaScript
- ObjectiveC
- Swift
Modify the ReactViewController.mm to pass the initial properties to JavaScript.
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_factoryDelegate = [ReactNativeFactoryDelegate new];
_factoryDelegate.dependencyProvider = [RCTAppDependencyProvider new];
_factory = [[RCTReactNativeFactory alloc] initWithDelegate:_factoryDelegate];
- self.view = [_factory.rootViewFactory viewWithModuleName:@"HelloWorld"];
+ self.view = [_factory.rootViewFactory viewWithModuleName:@"HelloWorld" initialProperties:@{
+ @"userID": @"12345678",
+ @"token": @"secretToken"
+ }];
}
Modify the ReactViewController.swift to pass the initial properties to the React Native view.
override func viewDidLoad() {
super.viewDidLoad()
reactNativeFactoryDelegate = ReactNativeDelegate()
reactNativeFactoryDelegate!.dependencyProvider = RCTAppDependencyProvider()
reactNativeFactory = RCTReactNativeFactory(delegate: reactNativeFactoryDelegate!)
- view = reactNativeFactory!.rootViewFactory.view(withModuleName: "HelloWorld")
+ view = reactNativeFactory!.rootViewFactory.view(withModuleName: "HelloWorld" initialProperties: [
+ "userID": "12345678",
+ "token": "secretToken"
+])
}
}
- Ejecuta tu aplicación nuevamente. Deberías ver la siguiente pantalla después de presentar el
ReactViewController:

¿Qué sigue?
En este punto puedes continuar desarrollando tu aplicación normalmente. Consulta nuestra documentación sobre depuración y despliegue para aprender más sobre cómo trabajar con React Native.