メインコンテンツへスキップ

既存アプリとの統合

React Native は、新しいモバイルアプリをゼロから開発する場合に非常に優れています。しかし、既存のネイティブアプリケーションに単一のビューやユーザーフローを追加する場合にもうまく機能します。いくつかの手順を踏むだけで、新しい React Native ベースの機能、画面、ビューなどを追加できます。

具体的な手順は、ターゲットとするプラットフォームによって異なります。

主要な概念

React Native コンポーネントを Android アプリケーションに統合するための鍵は、次のとおりです。

  1. 正しいディレクトリ構造を設定する。
  2. 必要な NPM 依存関係をインストールする。
  3. Gradle 設定に React Native を追加する。
  4. 最初の React Native 画面の TypeScript コードを記述する。
  5. ReactActivity を使用して React Native を Android コードと統合する。
  6. バンドラーを実行し、アプリの動作を確認して統合をテストする。

コミュニティテンプレートの使用

このガイドに従う間、React Native Community Template を参考にすることをお勧めします。このテンプレートには最小限の Android アプリが含まれており、既存の Android アプリに React Native を統合する方法を理解するのに役立ちます。

前提条件

開発環境のセットアップフレームワークなしで React Native を使用するガイドに従って、Android 用の React Native アプリをビルドするための開発環境を設定してください。このガイドでは、Activity の作成や `AndroidManifest.xml` ファイルの編集など、Android 開発の基本に精通していることを前提としています。

1. ディレクトリ構造の設定

スムーズな体験を確実にするために、統合された React Native プロジェクト用に新しいフォルダーを作成し、既存の Android プロジェクトを `/android` サブフォルダーに移動してください。

2. NPM 依存関係のインストール

ルートディレクトリに移動し、次のコマンドを実行します

shell
curl -O https://raw.githubusercontent.com/react-native-community/template/refs/heads/0.82-stable/template/package.json

これにより、コミュニティテンプレートの `package.json` ファイルがプロジェクトにコピーされます。

次に、次のコマンドを実行して NPM パッケージをインストールします。

shell
npm install

インストールプロセスにより、新しい `node_modules` フォルダーが作成されました。このフォルダーには、プロジェクトのビルドに必要なすべての JavaScript 依存関係が保存されます。

`.gitignore` ファイルに `node_modules/` を追加します(コミュニティのデフォルトはこちら)。

3. アプリへの React Native の追加

Gradle の設定

React Native は、React Native Gradle Plugin を使用して依存関係とプロジェクト設定を構成します。

まず、コミュニティテンプレートで推奨されているように、次の行を追加して `settings.gradle` ファイルを編集しましょう。

groovy
// 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")

次に、トップレベルの `build.gradle` を開き、この行を含める必要があります (コミュニティテンプレートで推奨されているように)。

diff
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle:7.3.1")
+ classpath("com.facebook.react:react-native-gradle-plugin")
}
}

これにより、React Native Gradle Plugin (RNGP) がプロジェクト内で利用できるようになります。最後に、これらの行をアプリケーションの `build.gradle` ファイルに追加します (通常は `app` フォルダー内にある別の `build.gradle` ファイルです。参照としてコミュニティテンプレートファイルを使用できます)。

diff
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()
+}

最後に、アプリケーションの `gradle.properties` ファイルを開き、次の行を追加します(参照としてコミュニティテンプレートファイルはこちら)。

diff
+reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
+newArchEnabled=true
+hermesEnabled=true

マニフェストの設定

まず、`AndroidManifest.xml` に Internet 権限があることを確認してください。

diff
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

+ <uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".MainApplication">
</application>
</manifest>

次に、デバッグ `AndroidManifest.xml` でクリアテキストトラフィックを有効にする必要があります。

diff
<?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>

いつものように、参照として使用するコミュニティテンプレートの AndroidManifest.xml ファイルはこちらです: main および debug

これは、アプリケーションがローカルのバンドラーである Metro と HTTP 経由で通信するため必要です。

これをデバッグマニフェストにのみ追加するようにしてください。

4. TypeScript コードの記述

次に、React Native を統合するためにネイティブ Android アプリケーションを実際に変更します。

最初に書くコードは、アプリケーションに統合される新しい画面のための実際の React Native コードです。

`index.js` ファイルを作成する

まず、React Native プロジェクトのルートに空の `index.js` ファイルを作成します。

`index.js` は React Native アプリケーションのエントリポイントであり、常に必要です。これは、React Native コンポーネントまたはアプリケーションの一部である他のファイルを `import` する小さなファイルでも、それらに必要なすべてのコードを含むファイルでも構いません。

`index.js` は次のようになるはずです(参照としてコミュニティテンプレートファイルはこちら)。

js
import {AppRegistry} from 'react-native';
import App from './App';

AppRegistry.registerComponent('HelloWorld', () => App);

`App.tsx` ファイルを作成する

`App.tsx` ファイルを作成しましょう。これは、TypeScript ファイルであり、JSX 式を持つことができます。Android アプリケーションに統合するルート React Native コンポーネントを含んでいます (リンク)。

tsx
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;

参照としてコミュニティテンプレートファイルはこちらです。

5. Android コードとの統合

React Native ランタイムを起動し、React コンポーネントをレンダリングするように指示するために、いくつかのネイティブコードを追加する必要があります。

アプリケーションクラスの更新

まず、`Application` クラスを次のように更新して、React Native を適切に初期化する必要があります。

diff
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();
+ }
}
}

いつものように、`MainApplication.kt` コミュニティテンプレートファイルを参照として使用してください。

ReactActivity の作成

最後に、`ReactActivity` を拡張し、React Native コードをホストする新しい `Activity` を作成する必要があります。この Activity は、React Native ランタイムを起動し、React コンポーネントをレンダリングする役割を担います。

java
// 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());
}
}

いつものように、`MainActivity.kt` コミュニティテンプレートファイルを参照として使用してください。

新しい Activity を作成するたびに、`AndroidManifest.xml` ファイルに追加する必要があります。また、`MyReactActivity` のテーマを `Theme.AppCompat.Light.NoActionBar` (または ActionBar のないテーマ) に設定する必要があります。そうしないと、アプリケーションが React Native 画面の上に ActionBar をレンダリングしてしまいます。

diff
<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>

これで、アクティビティは JavaScript コードを実行する準備ができました。

6. 統合のテスト

React Native をアプリケーションと統合するためのすべての基本手順を完了しました。次に、Metro bundler を起動して、TypeScript アプリケーションコードをバンドルにビルドします。Metro の HTTP サーバーは、開発環境の `localhost` からシミュレーターまたはデバイスにバンドルを共有します。これにより、ホットリロードが可能になります。

まず、次のようにプロジェクトのルートに `metro.config.js` ファイルを作成する必要があります。

js
const {getDefaultConfig} = require('@react-native/metro-config');
module.exports = getDefaultConfig(__dirname);

参照として、コミュニティテンプレートファイルから`metro.config.js` ファイルを確認できます。

設定ファイルが整ったら、バンドラーを実行できます。プロジェクトのルートディレクトリで次のコマンドを実行します。

shell
npm start

次に、通常通り Android アプリをビルドして実行します。

アプリ内で React を使用したアクティビティに到達すると、開発サーバーから JavaScript コードがロードされ、表示されるはずです。

Android Studio でリリースビルドを作成する

Android Studio を使用してリリースビルドを作成することもできます!以前の既存のネイティブ Android アプリのリリースビルドを作成するのと同じくらい迅速です。

React Native Gradle Plugin が、JS コードを APK/App Bundle にバンドルする処理を行います。

Android Studio を使用していない場合、次のようにしてリリースビルドを作成できます。

cd android
# For a Release APK
./gradlew :app:assembleRelease
# For a Release AAB
./gradlew :app:bundleRelease

次は何を?

この時点から、通常通りアプリの開発を続けることができます。React Native の使用方法の詳細については、デバッグおよびデプロイのドキュメントを参照してください。