はじめに
モバイルアプリの開発として, ネイティブ開発にするかクロスプラットフォーム開発でFlatterやReactNativeを使うか、今でも議論が絶えません。
現在Androidのリードエンジニアとして働いている自分から見て、どう選定するかを個人的な意見を書きたいと思います。選定の方法として絶対正しい、はないと思いますので参考までにしていただければと思います。
下のような記事の内容はすでに把握している方が対象です。
前提条件
iOSとAndroidの両OSでアプリを作る必要がある場合を想定
自分の経歴
自分のモバイルアプリ歴として、ざっくり書いておきます。
-
Swift
- Swift UIで個人開発3件
- 100万円以上の収益化に成功しているアプリあり
- 経歴は1.5-2年ほど
-
Kotlin
- 個人開発で2件
- 経歴は1年ちょい
- 現在リードエンジニア
- 主にJetpack Composeを使用
-
ReactNative
- 実務で1年半ほど
- ネイティブ機能のブリッジ実装やライブラリ選定経験あり
-
Flutter:
- 実務で3ヶ月ほど
- といっても実装経験はほとんどない
- 環境設定まわりの支援
このようなバックグラウンドの自分ならどのように選定するかを述べたいと思います。
結論
クロスプラットフォームの React Native or Flutter を第一候補とします。
しかし、次のような状況の場合はネイティブ開発を選びます。
-
開発予算が潤沢である場合
-
先進的なネイティブ機能を使う場合
-
非機能要件がシビアな場合
-
組み込みライブラリを必要とする場合
クロスプラットフォーム ファーストの理由
まず、Flutter or React Nativeを使うのをお勧めします。色々あるけど、やはりiOSとAndroidのコードを共通化できる恩恵はコスト的に恩恵が非常に大きいです。開発予算を純粋に抑えられるのと、 iOSとAndroidの差異が限りなく小さくできます。
ネイティブ開発で作るとして、仕様が不明瞭な場合の時には、そもそもの実装者の仕様認識の相違からそれぞれのOSで挙動が若干違うということも少なくありません。
単純な実装コストだけでなく、このよう認識不足によるバグのコスト等も考慮すると、遥かにクロスプラットフォームを使うメリットが大きくなります。
Flutter vs React Native
このどちらからを使うかは、個人的にはReact Native をお勧めします。
実装的な観点
実装的な観点からは、正直flutterの方が使いやすい印象です。特に環境周りの設定がとても楽なので、使い始めるまでがスムーズです。おそらくこれが初心者にも人気な理由だと思っています。
一方で、拡張性という点ではReactNativeの方ができることは多いです。やはりWebフロントで使われるライブラリをそのまま使えることがほとんどなので、基本的にwebフロントでできることはReactNativeでもできます。
ビジネス的観点
これはReact Nativeが勝ります。単純にReactを書くことができれば、最初の環境構築の壁さえ乗り越えればほぼReactと同じとして扱えるからです。
フロントの主流はReactになってきているので、エンジニアも集めやすいですし、同様にWebのReactの現場へもいけるエンジニアになります。
Flutterで使われるDartはどうしても他への潰しが効きにくいので、これはReact Nativeが勝ると思っています。
React Native Expoはまだ使うべからず!
いくつかの現場を見てきましたが、Expoはまだ使うべきでないというのが個人的な意見です。導入自体は楽になりますが、開発を進めていくとライブラリの制限や、認証周りの挙動などで不具合があったりするのでお勧めしません。普通のbareを使いましょう。
もう少し整備されてから使うのはアリかとは思います。
ネイティブで実装する方が良い例
資金が潤沢である場合
資金が潤沢であり、コストを気にしなくて良いのであればネイティブにすべきです。ライブラリがまずApple と Googleによって作られたものが基本なので、それらを使うことで信頼性の高く、パフォーマンスの高いアプリを作ることができます。
ReactNativeの場合はバージョンによってライブラリが使えなくなったり、バグが起きるのは日常茶飯事ですのでライブラリ1つ導入するにしても精査が必要です。(Flutterではあまりそういうことはないようですが...)
ネイティブ開発ではこのようなことが(ほとんど)起きないのは開発経験としてもとても良いです。
さらに、クロスプラットフォームとは違い、それぞれのプラットフォームで発表された最新の技術をすぐに導入できるのも強みだと思います。
ネイティブ開発の方ができることは多く、さらに強固なアプリになるので資金がある(大企業)などであれば普通はネイティブ開発を選択します。
先進的な機能を使う場合
上記にも述べましたが、ARなど最新機能を使う場合はそもそもクロスプラットフォームではサポートされてないことが多いので、必然的にネイティブ開発になります。
(実はクロスプラットフォームでもネイティブブリッジによる実装をすれば最新機能を使うこともできるはずなのですが、実装が煩雑で難易度も高く情報が少ないのでお勧めしません。)
非機能要件がシビアな場合
基本的に、パフォーマンスの面ではネイティブアプリ開発の方が良いです。
例えば、カメラの起動時のスピードなどでネイティブ開発とクロスプラットフォームで性能に差異があり、どうしてもクロスプラットフォームの方が悪く(起動が遅かったり、ビルド後のアプリの容量が大きくなったり...)なります。
そのため、このような非機能要件が厳しい場合にはネイティブによる開発が必要です。
組み込みライブラリを必要とする場合
組み込みライブラリ(Rustライブラリなど)の実装をする場合も、ネイティブがお勧めです。 これもクロスプラットフォームでもブリッジ実装すればできますが、わりと煩雑な構成になり難易度も高くバグの温床になりがちです。(経験済み)
逆にこれを(完璧に)実装できるクロスプラットフォーム開発経験者がいるのであれば、そちらでも問題ない気はしています。
まとめ
- まずはクロスプラットフォーム開発を考える
- React Nativeの方がお勧め
- 特定の条件下においてはネイティブ開発を選定する