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

既存のアプリとの統合

React Nativeは、新しいモバイルアプリをゼロから開発する際に非常に役立ちます。しかし、既存のネイティブアプリケーションに単一のビューやユーザフローを追加する場合にも有効です。いくつかのステップを踏むことで、新しいReact Nativeベースの機能、画面、ビューなどを追加できます。

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

キーコンセプト

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

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

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

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

前提条件

開発環境の設定およびフレームワークなしのReact Nativeの使用に関するガイドに従って、Android用のReact Nativeアプリをビルドするための開発環境を構成します。また、このガイドでは、Activityの作成やAndroidManifest.xmlファイルの編集など、Android開発の基本を理解していることを前提としています。

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

スムーズなエクスペリエンスを実現するために、統合されたReact Nativeプロジェクト用の新しいフォルダを作成し、次に既存のAndroidプロジェクト/androidサブフォルダに移動します。

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

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

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

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

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

npm install

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

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

3. React Nativeをアプリに追加する

Gradleの設定

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

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

// 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を開き、次の行を含める必要があります(コミュニティテンプレートから推奨されているように)。

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ファイルです - コミュニティテンプレートファイルを参考に使用できます)内に次の行を追加します。

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ファイルを開き、次の行を追加します(コミュニティテンプレートファイルを参考にしてください)。

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

マニフェストの設定

まず、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>

次に、デバッグ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>

いつものように、コミュニティテンプレートからのAndroidManifest.xmlファイルを参照用に使用してください:maindebug

これは、アプリケーションがローカルバンドラーである[Metro][https://metrobundler.dev/]と通信するため必要です。HTTP経由で。

必ずデバッグマニフェストにのみ追加してください。

4. TypeScriptコードの記述

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

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

index.jsファイルの作成

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

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

index.jsは次のようになります(コミュニティテンプレートファイルを参照してください)。

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

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

App.tsxファイルの作成

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

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クラスの更新

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

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を作成する必要があります。このアクティビティは、React Nativeランタイムを開始し、Reactコンポーネントをレンダリングする役割を担います。

// 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をレンダリングします。

<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バンドラーを起動して、TypeScriptアプリケーションコードをバンドルにビルドします。MetroのHTTPサーバーは、開発環境のlocalhostからシミュレーターまたはデバイスにバンドルを共有します。これにより、ホットリロードが可能になります。

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

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

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

構成ファイルを配置したら、バンドラーを実行できます。プロジェクトのルートディレクトリで次のコマンドを実行します。

npm start

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

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

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

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

React Native Gradle プラグインは、JS コードを APK/App Bundle 内にバンドルする処理を行います。

Android Studio を使用していない場合は、次のコマンドでリリースビルドを作成できます。

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

次は?

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