Integracja z istniejącymi aplikacjami
Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →
React Native doskonale sprawdza się przy tworzeniu nowych aplikacji mobilnych od podstaw. Jednak równie dobrze nadaje się do dodawania pojedynczych widoków lub ścieżek użytkownika do istniejących natywnych aplikacji. W kilku krokach możesz dodać nowe funkcje, ekrany, widoki itd. oparte na React Native.
Konkretne kroki różnią się w zależności od platformy, na którą aplikacja jest przeznaczona.
- Android (Java & Kotlin)
- iOS (Objective-C and Swift)
Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →
Kluczowe koncepcje
Kluczem do integracji komponentów React Native z aplikacją na Androida jest:
-
Skonfigurowanie poprawnej struktury katalogów
-
Zainstalowanie niezbędnych zależności NPM
-
Dodanie React Native do konfiguracji Gradle
-
Napisanie kodu TypeScript dla pierwszego ekranu w React Native
-
Integracja React Native z kodem Androida przy użyciu ReactActivity
-
Testowanie integracji przez uruchomienie bundlera i sprawdzenie działania aplikacji
Korzystanie ze szablonu społecznościowego
Podczas korzystania z tego przewodnika zalecamy użycie szablonu społecznościowego React Native jako punktu odniesienia. Szablon zawiera minimalną aplikację na Androida i pomoże ci zrozumieć, jak zintegrować React Native z istniejącą aplikacją na Androida.
Wymagania wstępne
Postępuj zgodnie z przewodnikiem dotyczącym konfigurowania środowiska deweloperskiego i używania React Native bez frameworka, aby skonfigurować swoje środowisko do budowania aplikacji React Native na Androida.
Ten przewodnik zakłada również, że znasz podstawy tworzenia aplikacji na Androida, takie jak tworzenie aktywności (Activities) i edycja pliku AndroidManifest.xml.
1. Konfiguracja struktury katalogów
Aby zapewnić płynne działanie, utwórz nowy folder dla projektu zintegrowanego z React Native, a następnie przenieś istniejący projekt Androida do podfolderu /android.
2. Instalacja zależności NPM
Przejdź do katalogu głównego i uruchom następujące polecenie:
curl -O https://raw.githubusercontent.com/react-native-community/template/refs/heads/0.75-stable/template/package.json
Spowoduje to skopiowanie pliku package.json ze szablonu społecznościowego do twojego projektu.
Następnie zainstaluj pakiety NPM, uruchamiając:
- npm
- Yarn
npm install
yarn install
Proces instalacji utworzył nowy folder node_modules. Ten folder przechowuje wszystkie zależności JavaScript wymagane do zbudowania projektu.
Dodaj node_modules/ do pliku .gitignore (tutaj domyślny z szablonu).
3. Dodawanie React Native do aplikacji
Konfiguracja Gradle
React Native używa wtyczki Gradle dla React Native do konfiguracji zależności i ustawień projektu.
Najpierw edytuj plik settings.gradle, dodając te linie (jak sugeruje szablon społecznościowy):
// 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")
Następnie otwórz główny plik build.gradle i dodaj tę linię (jak sugeruje szablon społecznościowy):
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle:7.3.1")
+ classpath("com.facebook.react:react-native-gradle-plugin")
}
}
To zapewnia dostępność wtyczki Gradle dla React Native (RNGP) w twoim projekcie.
Na koniec dodaj te linie w pliku build.gradle twojej aplikacji (to inny plik build.gradle, zwykle w folderze app - możesz użyć pliku ze szablonu):
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()
+}
Na koniec otwórz plik gradle.properties aplikacji i dodaj następującą linię (tutaj plik ze szablonu):
+reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
+newArchEnabled=true
+hermesEnabled=true
Konfiguracja manifestu
Najpierw upewnij się, że masz uprawnienie do Internetu w pliku 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>
Następnie musisz włączyć ruchy w postaci czystego tekstu w debugowym pliku AndroidManifest.xml:
<?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>
Jak zwykle, tutaj pliki AndroidManifest.xml ze szablonu do wykorzystania jako odniesienie: główny i debugowy
Jest to konieczne, ponieważ twoja aplikacja będzie komunikować się z lokalnym bundlerem, Metro, poprzez HTTP.
Upewnij się, że dodajesz to tylko do manifestu w wersji debug.
4. Pisanie kodu TypeScript
Teraz faktycznie zmodyfikujemy natywną aplikację na Androida, aby zintegrować React Native.
Pierwszy fragment kodu, który napiszemy, to właściwy kod React Native dla nowego ekranu, który zostanie zintegrowany z naszą aplikacją.
Tworzenie pliku index.js
Najpierw utwórz pusty plik index.js w katalogu głównym twojego projektu React Native.
index.js to punkt startowy aplikacji React Native i jest zawsze wymagany. Może to być mały plik, który importuje inne pliki będące częścią twojego komponentu lub aplikacji React Native, lub może zawierać cały potrzebny kod.
Nasz plik index.js powinien wyglądać następująco (tutaj plik ze szablonu):
import {AppRegistry} from 'react-native';
import App from './App';
AppRegistry.registerComponent('HelloWorld', () => App);
Tworzenie pliku App.tsx
Stwórzmy plik App.tsx. To plik TypeScript zawierający wyrażenia JSX, który przechowuje główny komponent React Native do integracji z aplikacją Android (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;
Tutaj plik szablonu społecznościowego jako odniesienie
5. Integracja z kodem Androida
Teraz musimy dodać kod natywny, aby uruchomić środowisko wykonawcze React Native i nakazać renderowanie naszych komponentów React.
Aktualizacja klasy Application
Najpierw musimy zaktualizować klasę Application, aby poprawnie zainicjować React Native:
- 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()
+ }
}
}
Jak zwykle, tutaj plik MainApplication.kt ze szablonu
Tworzenie ReactActivity
Na koniec musimy utworzyć nową Activity, która rozszerza ReactActivity i będzie hostować kod React Native. Ta aktywność będzie odpowiedzialna za uruchomienie środowiska wykonawczego React Native oraz renderowanie komponentu 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)
}
Jak zwykle, tutaj plik MainActivity.kt ze szablonu
Za każdym razem gdy tworzysz nową Activity, musisz dodać ją do pliku AndroidManifest.xml. Musisz także ustawić motyw MyReactActivity na Theme.AppCompat.Light.NoActionBar (lub dowolny motyw bez ActionBar), ponieważ w przeciwnym razie aplikacja wyświetli pasek akcji na ekranie 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>
Twoja aktywność jest teraz gotowa do uruchomienia kodu JavaScript.
6. Przeprowadź test integracji
Ukończyłeś wszystkie podstawowe kroki integracji React Native z Twoją aplikacją. Teraz uruchomimy bundler Metro, który skompiluje kod TypeScript w pakiet. Serwer HTTP Metro udostępnia pakiet z localhost w twoim środowisku deweloperskim na symulator lub urządzenie. Umożliwia to hot reloading.
Najpierw utwórz plik metro.config.js w katalogu głównym projektu o następującej zawartości:
const {getDefaultConfig} = require('@react-native/metro-config');
module.exports = getDefaultConfig(__dirname);
Możesz sprawdzić plik metro.config.js z szablonu społecznościowego jako odniesienie.
Gdy plik konfiguracyjny jest gotowy, możesz uruchomić bundler. Wykonaj następujące polecenie w katalogu głównym projektu:
- npm
- Yarn
npm start
yarn start
Teraz zbuduj i uruchom aplikację Android jak zwykle.
Teraz zbuduj i uruchom swoją aplikację iOS w zwykły sposób.

Tworzenie wersji produkcyjnej w Android Studio
Możesz także użyć Android Studio do tworzenia wersji produkcyjnych! Jest to tak proste jak tworzenie wersji produkcyjnych istniejącej natywnej aplikacji Android.
Wtyczka React Native Gradle Plugin zajmie się pakowaniem kodu JS wewnątrz twojego APK/App Bundle.
Jeśli nie używasz Android Studio, możesz utworzyć wersję produkcyjną za pomocą:
cd android
# For a Release APK
./gradlew :app:assembleRelease
# For a Release AAB
./gradlew :app:bundleRelease
Co dalej?
W tym momencie możesz kontynuować rozwijanie aplikacji w zwykły sposób. Odwołaj się do dokumentacji dotyczącej debugowania i wdrażania, aby dowiedzieć się więcej o pracy z React Native.
Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →
Kluczowe koncepcje
Kluczowe kroki integracji komponentów React Native z istniejącą aplikacją iOS to:
-
Skonfigurowanie poprawnej struktury katalogów
-
Zainstalowanie niezbędnych zależności NPM
-
Dodanie React Native do konfiguracji Podfile.
-
Napisanie kodu TypeScript dla pierwszego ekranu w React Native
-
Integracja React Native z kodem iOS przy użyciu
RCTRootView. -
Testowanie integracji przez uruchomienie bundlera i sprawdzenie działania aplikacji
Korzystanie ze szablonu społecznościowego
Podczas pracy z tym przewodnikiem zalecamy użycie szablonu społeczności React Native jako punktu odniesienia. Szablon zawiera minimalną aplikację iOS i pomoże zrozumieć integrację React Native z istniejącą aplikacją iOS.
Wymagania wstępne
Przejdź przez przewodniki konfiguracji środowiska deweloperskiego i pracy z React Native bez frameworka aby przygotować środowisko do tworzenia aplikacji React Native na iOS.
Przewodnik zakłada również znajomość podstaw rozwoju na iOS, takich jak tworzenie UIViewController i edycja pliku Podfile.
1. Przygotowanie struktury katalogów
Dla płynnej pracy utwórz nowy folder dla projektu integracji React Native, następnie przenieś istniejący projekt iOS do podfolderu /ios.
2. Instalacja zależności NPM
Przejdź do katalogu głównego i uruchom następujące polecenie:
curl -O https://raw.githubusercontent.com/react-native-community/template/refs/heads/0.77-stable/template/package.json
Spowoduje to skopiowanie pliku package.json ze szablonu społecznościowego do Twojego projektu.
Następnie zainstaluj pakiety NPM, uruchamiając:
- npm
- Yarn
npm install
yarn install
Proces instalacji utworzył nowy folder node_modules. Ten folder przechowuje wszystkie zależności JavaScript wymagane do zbudowania projektu.
Dodaj node_modules/ do swojego pliku .gitignore (tutaj domyślny z szablonu).
3. Instalacja narzędzi deweloperskich
Narzędzia wiersza poleceń dla Xcode
Zainstaluj narzędzia wiersza poleceń. W menu Xcode wybierz Settings... (lub Preferences...). Przejdź do panelu Locations i zainstaluj narzędzia wybierając najnowszą wersję z rozwijanej listy Command Line Tools.

CocoaPods
CocoaPods to narzędzie do zarządzania pakietami dla rozwoju iOS i macOS. Używamy go do lokalnego dodania kodu frameworka React Native do bieżącego projektu.
Zalecamy instalację CocoaPods przy użyciu Homebrew:
brew install cocoapods
4. Dodawanie React Native do aplikacji
Konfiguracja CocoaPods
Do konfiguracji CocoaPods potrzebujemy dwóch plików:
-
Gemfile definiujący wymagane zależności Ruby.
-
Podfile określający sposób poprawnej instalacji naszych zależności.
Aby uzyskać Gemfile, przejdź do katalogu głównego projektu i uruchom polecenie:
curl -O https://raw.githubusercontent.com/react-native-community/template/refs/heads/0.77-stable/template/Gemfile
Spowoduje to pobranie Gemfile ze szablonu.
Podobnie dla Podfile, przejdź do folderu ios w swoim projekcie i uruchom:
curl -O https://raw.githubusercontent.com/react-native-community/template/refs/heads/0.77-stable/template/ios/Podfile
Proszę użyć szablonu społecznościowego jako punktu odniesienia dla Gemfile oraz Podfile.
Pamiętaj o zmianie tej linii i tej linii w Podfile, aby odpowiadały nazwie Twojej aplikacji.
Jeśli Twoja aplikacja nie ma testów, pamiętaj o usunięciu tego bloku.
Teraz musimy uruchomić kilka dodatkowych poleceń, aby zainstalować gemy Ruby oraz Pody. Przejdź do folderu ios i wykonaj następujące polecenia:
bundle install
bundle exec pod install
Pierwsze polecenie zainstaluje zależności Ruby, a drugie zintegruje kod React Native z twoją aplikacją, dzięki czemu pliki iOS będą mogły importować nagłówki React Native.
5. Pisanie kodu TypeScript
Teraz faktycznie zmodyfikujemy natywną aplikację iOS, aby zintegrować React Native.
Pierwszy fragment kodu, który napiszemy, to właściwy kod React Native dla nowego ekranu, który zostanie zintegrowany z naszą aplikacją.
Tworzenie pliku index.js
Najpierw utwórz pusty plik index.js w katalogu głównym twojego projektu React Native.
index.js to punkt startowy aplikacji React Native i jest zawsze wymagany. Może to być mały plik, który importuje inne pliki będące częścią twojego komponentu lub aplikacji React Native, lub może zawierać cały potrzebny kod.
Nasz index.js powinien wyglądać następująco (tutaj plik szablonu społecznościowego jako odniesienie):
import {AppRegistry} from 'react-native';
import App from './App';
AppRegistry.registerComponent('HelloWorld', () => App);
Tworzenie pliku App.tsx
Utwórzmy plik App.tsx. To plik TypeScript, który może zawierać wyrażenia JSX. Zawiera główny komponent React Native, który zintegrujemy z naszą aplikacją iOS (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;
Tutaj plik szablonu społecznościowego jako odniesienie
5. Integracja z kodem iOS
Teraz musimy dodać kod natywny, aby uruchomić środowisko wykonawcze React Native i nakazać renderowanie naszych komponentów React.
Wymagania
React Native ma współpracować z AppDelegate. Poniższa część zakłada, że Twój AppDelegate wygląda następująco:
- ObjectiveC
- Swift
#import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate {
UIWindow *window;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
window = [UIWindow new];
window.rootViewController = [ViewController new];
[window makeKeyAndVisible];
return YES;
}
@end
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow()
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
return true
}
}
Aktualizacja klasy AppDelegate
Najpierw musimy rozszerzyć AppDelegate, aby dziedziczył po jednej z klas dostarczanych przez React Native: RCTAppDelegate.
- ObjectiveC
- Swift
To achieve this, we have to modify the AppDelegate.h file and the AppDelegate.m files:
- Open the
AppDelegate.hfiles and modify it as it follows (See the official template's AppDelegate.h as reference):
#import <UIKit/UIKit.h>
+#import <React-RCTAppDelegate/RCTAppDelegate.h>
-@interface AppDelegate : UIResponder <UIApplicationDelegate>
+@interface AppDelegate : RCTAppDelegate
@end
- Open the
AppDelegate.mmfile and modify it as it follows (See the official template's AppDelegate.mm as reference
#import "AppDelegate.h"
#import "ViewController.h"
+#import <React/RCTBundleURLProvider.h>
@interface AppDelegate ()
@end
@implementation AppDelegate {
UIWindow *window;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ self.automaticallyLoadReactNativeWindow = NO;
+ return [super application:application didFinishLaunchingWithOptions:launchOptions];
window = [UIWindow new];
window.rootViewController = [ViewController new];
[window makeKeyAndVisible];
return YES;
}
+- (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
Let's have a look at the code above:
- We are inheriting from the
RCTAppDelegateand we are calling theapplication:didFinishLaunchingWithOptionsof theRCTAppDelegate. This delegates all the React Native initialization processes to the base class. - We are customizing the
RCTAppDelegateby setting theautomaticallyLoadReactNativeWindowtoNO. This step instruct React Native that the app is handling theUIWindowand React Native should not worry about that. - The methods
sourceURLForBridge:andbundleURLare used by the App to tell to React Native where it can find the JS bundle that needs to be rendered. ThesourceURLForBridge:is from the Old Architecture and you can see that it is deferring the decision to thebundleURLmethod, required by the New Architecture.
To achieve this, we have to modify the AppDelegate.swift
- Open the
AppDelegate.swiftfiles and modify it as it follows (See the official template's AppDelegate.swift as reference):
import UIKit
+import React_RCTAppDelegate
@main
-class AppDelegate: UIResponder, UIApplicationDelegate {
+class AppDelegate: RCTAppDelegate {
- var window: UIWindow?
- func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
+ self.automaticallyLoadReactNativeWindow = false
+ super.application(application, didFinishLaunchingWithOptions: launchOptions)
window = UIWindow()
- window?.rootViewController = ViewController()
- window?.makeKeyAndVisible()
+ window.rootViewController = ViewController()
+ window.makeKeyAndVisible()
return true
}
+ 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
+ }
}
Let's have a look at the code above:
- We are inheriting from the
RCTAppDelegateand we are calling theapplication(_:didFinishLaunchingWithOptions:)of theRCTAppDelegate. This delegates all the React Native initialization processes to the base class. - We are customizing the
RCTAppDelegateby setting theautomaticallyLoadReactNativeWindowtofalse. This step instruct React Native that the app is handling theUIWindowand React Native should not worry about that. - The methods
sourceURLForBridge(for:)andbundleURL()are used by the App to tell to React Native where it can find the JS bundle that needs to be rendered. ThesourceURLForBridge(for:)is from the Old Architecture and you can see that it is deferring the decision to thebundleURL()method, required by the New Architecture.
Prezentowanie widoku React Native w rootViewController
Wreszcie możemy zaprezentować nasz widok React Native. Aby to zrobić, potrzebujemy nowego View Controller, który może hostować widok, w którym załadujemy zawartość JS.
-
W Xcode utwórz nowy
UIViewController(nazwijmy goReactViewController). -
Spraw, aby początkowy
ViewControllerprezentowałReactViewController. Można to zrobić na kilka sposobów, w zależności od aplikacji. W tym przykładzie zakładamy, że masz przycisk prezentujący React Native modalnie.
- 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 completion:nil];
+}
@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),
+ ])
}
}
- Zaktualizuj kod
ReactViewControllerw następujący sposób:
- ObjectiveC
- Swift
#import "ReactViewController.h"
+#import <React-RCTAppDelegate/RCTRootViewFactory.h>
+#import <React-RCTAppDelegate/RCTAppDelegate.h>
@interface ReactViewController ()
@end
@implementation ReactViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
+ RCTRootViewFactory *factory = ((RCTAppDelegate *)RCTSharedApplication().delegate).rootViewFactory;
+ self.view = [factory viewWithModuleName:@"HelloWorld"];
}
@end
import UIKit
+import React_RCTAppDelegate
class ReactViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
+ let factory = (RCTSharedApplication()?.delegate as? RCTAppDelegate)?.rootViewFactory
+ self.view = factory?.view(withModuleName: "HelloWorld")
}
}
- Upewnij się, że wyłączysz piaskownicę skryptów. Aby to osiągnąć, w Xcode kliknij swoją aplikację, przejdź do ustawień budowania. Odfiltruj "script" i ustaw
User Script SandboxingnaNO. Ten krok jest potrzebny do poprawnego przełączania między wersjami Debug i Release silnika Hermes, który dostarczamy z React Native.
;
6. Przeprowadź test integracji
Ukończyłeś wszystkie podstawowe kroki integracji React Native z Twoją aplikacją. Teraz uruchomimy bundler Metro, który skompiluje kod TypeScript w pakiet. Serwer HTTP Metro udostępnia pakiet z localhost w twoim środowisku deweloperskim na symulator lub urządzenie. Umożliwia to hot reloading.
Najpierw utwórz plik metro.config.js w katalogu głównym projektu o następującej zawartości:
const {getDefaultConfig} = require('@react-native/metro-config');
module.exports = getDefaultConfig(__dirname);
Możesz sprawdzić plik metro.config.js z szablonu społecznościowego jako odniesienie.
Gdy plik konfiguracyjny jest gotowy, możesz uruchomić bundler. Wykonaj następujące polecenie w katalogu głównym projektu:
- npm
- Yarn
npm start
yarn start
Teraz zbuduj i uruchom swoją aplikację na iOS w zwykły sposób.
Teraz zbuduj i uruchom swoją aplikację iOS w zwykły sposób.

Gdy dotrzesz do ekranu napędzanego przez Reacta w aplikacji, powinien on wczytać kod JavaScript z serwera deweloperskiego i wyświetlić:
Tworzenie wersji produkcyjnej w Xcode
Możesz także użyć Xcode do tworzenia wersji produkcyjnych! Jedynym dodatkowym krokiem jest dodanie skryptu wykonywanego podczas budowania aplikacji, który pakuje kod JS i obrazy do aplikacji iOS.
-
Kliknij
Build Phases -
Kliknij
+w lewym górnym rogu i wybierzNew Run Script Phase -
Kliknij linię
Run Scripti zmień nazwę skryptu naBundle React Native code and images -
Wklej w polu tekstowym następujący skrypt
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"
- Przeciągnij i upuść skrypt przed ten o nazwie
[CP] Embed Pods Frameworks.
Teraz, gdy zbudujesz aplikację w trybie Release, będzie działać zgodnie z oczekiwaniami.
Co dalej?
W tym momencie możesz kontynuować rozwijanie aplikacji w zwykły sposób. Odwołaj się do dokumentacji dotyczącej debugowania i wdrażania, aby dowiedzieć się więcej o pracy z React Native.