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/0.75-stable/template/package.json
Esto copiará el archivo package.json de la plantilla comunitaria a tu proyecto.
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.
Agrega node_modules/ a tu archivo .gitignore (aquí el predeterminado de la comunidad).
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.
Primero, edita tu archivo settings.gradle agregando estas líneas (como sugiere la plantilla comunitaria):
// 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")
Luego abre tu archivo build.gradle de nivel superior e incluye esta línea (como sugiere la plantilla comunitaria):
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle:7.3.1")
+ classpath("com.facebook.react:react-native-gradle-plugin")
}
}
Esto garantiza que el React Native Gradle Plugin (RNGP) esté disponible en tu proyecto.
Finalmente, agrega estas líneas dentro del archivo build.gradle de tu aplicación (es un archivo build.gradle diferente que normalmente está en tu carpeta app - puedes usar el archivo de la plantilla comunitaria como referencia):
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()
+}
Por último, abre tus archivos gradle.properties de la aplicación y agrega la siguiente línea (aquí el archivo de la plantilla comunitaria como referencia):
+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>
Como es habitual, aquí tienes el archivo AndroidManifest.xml de la plantilla de la comunidad para usar como referencia: main y 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.
Nuestro index.js debería verse así (aquí el archivo de la plantilla de la comunidad como referencia):
import {AppRegistry} from 'react-native';
import App from './App';
AppRegistry.registerComponent('HelloWorld', () => App);
Crear un archivo App.tsx
Creemos un archivo App.tsx. Este es un archivo TypeScript que puede contener expresiones JSX. Contiene el componente raíz de React Native que integraremos en nuestra aplicación Android (enlace):
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;
Aquí el archivo de la plantilla de la comunidad como referencia
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()
+ }
}
}
Como siempre, aquí el archivo MainApplication.kt de la plantilla de la comunidad como referencia
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)
}
Como es habitual, aquí tienes el archivo MainActivity.kt de la plantilla comunitaria para usar como referencia
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);
Puedes consultar el archivo metro.config.js de la plantilla comunitaria como referencia.
Una vez que tengas el archivo de configuración en su lugar, 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/0.78-stable/template/package.json
Esto copiará el archivo package.json desde la plantilla comunitaria a tu proyecto.
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.
Añade node_modules/ a tu archivo .gitignore (aquí el archivo predeterminado de la comunidad).
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/0.78-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/0.78-stable/template/ios/Podfile
Te recomendamos usar la Plantilla Comunitaria como referencia para el Gemfile y el Podfile.
Recuerda modificar esta línea.
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.
Nuestro index.js debe verse así (aquí el archivo de la plantilla comunitaria como referencia):
import {AppRegistry} from 'react-native';
import App from './App';
AppRegistry.registerComponent('HelloWorld', () => App);
Crear un archivo App.tsx
Creemos un archivo App.tsx. Este es un archivo TypeScript que puede contener expresiones JSX. Contiene el componente raíz de React Native que integraremos en nuestra aplicación iOS (enlace):
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;
Aquí el archivo de la plantilla comunitaria como referencia
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
class ReactViewController: UIViewController {
+ var reactNativeFactory: RCTReactNativeFactory?
+ var reactNativeFactoryDelegate: RCTReactNativeFactoryDelegate?
override func viewDidLoad() {
super.viewDidLoad()
+ reactNativeFactoryDelegate = ReactNativeDelegate()
+ 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);
Puedes consultar el archivo metro.config.js de la plantilla comunitaria como referencia.
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 los archivos de configuración en su lugar, 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.
./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.