React NativeでAndroid向けにObjective-Cを用いて、Native Modulesを実装する方法を解説します。
モグモグさん
出来るだけ分かりやすく解説していきます。
- Native Modulesがわかる
- Objective-Cを用いてカスタムのNative Modulesを作成することができる
- React 17.0.2
- React Native 0.65.1
モグモグさん
Swiftで実装する方法についてはこちらで解説しています。
【iOS・Swift】React NativeでNative Modulesを実装する方法を解説
Native Modulesとは?
Native Modulesについて簡単に解説します。
モグモグさん
すでに理解している方はスキップしてください。
Native Modulesとは、React Nativeで用意されていない機能をネイティブで実装するための機能です。
アプリの要件によって、React Nativeがもともと用意していない機能を足したり、パフォーマンスの観点等でネイティブで実装すべき箇所をNative Modulesを使って実装したりすることが多いです。
React Nativeでも多くのことがすでにできますが、Native Modulesを使うことで幅が広がります。
- iOS: Objective-CとSwiftどちらでも実装可能
- Android: JavaとKotlinどちらでも実装可能
本記事では紹介しませんが、UIに関連するものはNative UI Componentsを利用します。
モグモグさん
それぞれのドキュメントを貼っておきますので参考にしてください。
事前準備(ベースのアプリを作成)
まずは、React Nativeでアプリを作成しましょう。
この記事では、NativeModuleExampleというプロジェクトを作成しました。
モグモグさん
すでに作成済みの方はスキップでOKです!
こちらの記事も参考にしてください。
【ReactNative入門 】Macで開発環境を作って始める
Native Modulesの作成
それでは、Native Modulesを作成していきます。
今回は、デバイスの名前を返すメソッドを実装していきます。
headerファイルの作成
本記事では、CustomNativeModuleObjc
というファイル名にしましたが、任意の名前にしてください。
#import <React/RCTBridgeModule.h>
@interface CustomNativeModuleObjc : NSObject <RCTBridgeModule>
@end
.mファイルの実装
続いて実装を追加します。
主なポイントは下記の点です。
- RCT_EXPORT_MODULE: モジュールを使えるようにする
- RCT_EXPORT_METHOD: メソッドを使えるようにする
#import "CustomNativeModuleObjc.h"
#import <UIKit/UIKit.h>
@implementation CustomNativeModuleObjc
RCT_EXPORT_MODULE();
// RCT_EXPORT_METHOD: メソッドをJS側から呼べるようにする
RCT_EXPORT_METHOD(getDeviceName:(RCTResponseSenderBlock)callback) {
@try{
NSString *deviceName = [[UIDevice currentDevice] name];
callback(@[[NSNull null], deviceName]);
}
@catch(NSException *exception){
callback(@[exception.reason, [NSNull null]]);
}
}
@end
JavaScript側から使う
カスタムのNative Modulesを作成したので、JavaScript側から使う方法を解説していきます。
App.jsでimport
Moduleの名前は、ご自身で定義したものを使ってください。
import {NativeModules} from 'react-native';
const App = () => {
const {CustomNativeModuleObjc} = NativeModules;
}
メソッドを呼ぶ
呼ぶ場所は、任意ですが本記事では、useEffect
内でそれぞれのメソッドを呼んでみました。
const App = () => {
useEffect(() => {
CustomNativeModuleObjc.getDeviceName((err, name) => {
console.log(err, name);
});
}, []);
}
実行結果
null 'iPhone 12'
のように出力されると思います。
モグモグさん
デバイス名はみなさんの環境次第で変わります。
まとめ
モグモグさん
お疲れ様でした!
iOS向けにObjective-Cを用いて、NativeModulesを実装する方法を解説しました。
React Nativeを実装する上で非常に有用なので、ぜひ実際に使ってみてください!