Argano の松田です。 先日、[Android] React Native で JavaScript からネイティブコードを呼び出す方法という記事を書きました。 本記事では iOS 版をご紹介したいと思います。

Native Module

Native Module は、Objective-C、Swift、Java、Kotlin、C++ クラスのインスタンスを JavaScript オブジェクトとして公開し、それによって JavaScript の中から任意のネイティブコードを実行できるようにするものです。 今回は React Native アプリケーション内の JavaScript から ネイティブのメソッドを実行してみます。 最終的には、JavaScript から MyModule.log('Test'); を呼び出し、ネイティブにログ出力できるようにします。

Native Module の作成

環境構築は終わっている前提で進めます。iOS の Native Module を作成するには Objective-C か Swift を選ぶことができますが、今回は Objective-C を使用します。 まず、Native Module のヘッダーファイルと実装ファイルを作成します。

ヘッダーファイル RCTMyModule.h の内容

#import <React/RCTBridgeModule.h>

@interface MyModule : NSObject <RCTBridgeModule>
@end

実装ファイル RCTMyModule.m の内容

#import "RCTMyModule.h"

@implementation RCTMyModule

RCT_EXPORT_MODULE();

@end

Native メソッドを JavaScript に書き出す

React Native は、明示的に指示されない限り、Native Module 内のメソッドを JavaScript に公開することはありません。公開したい場合 RCT_EXPORT_METHOD マクロを使用して行うことができます。

// RCTMyModule.m

#import "RCTMyModule.h"

@implementation RCTMyModule

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(log:(NSString *)content)
{
  RCTLogInfo(@"Cessage: %@", content);
}

@end

Native Module を JavaScript から呼び出す

JavaScript から Native Module にアクセスするためには、まず React Native から NativeModules をインポートする必要があります。

import { NativeModules } from 'react-native';

そして、NativeModules から MyModule のネイティブモジュールにアクセスできるようになります。

const { MyModule } = NativeModules;

あとは 実装したメソッドを呼び出すだけです。

const onPress = () => {
  MyModule.log('test log');
};

最後に再ビルドを実行します。Native Module を修正した場合は JavaScript を修正した場合と違い、ホットリロードが効かないため注意が必要です。

npx react-native run-ios

まとめ

Native Module の基本的な使い方を見てきました。Android より多少手順が少なく実装できます。 JavaScript にイベントを送信したり、ライフサイクルメソッドを使用したりすることもできます。 React Native であれど、かなり柔軟にさまざまな要件を満たせそうです。