リードエンジニアが選ぶ、ネイティブ開発 vs クロスプラットフォーム開発

はじめに

モバイルアプリの開発として, ネイティブ開発にするかクロスプラットフォーム開発でFlatterやReactNativeを使うか、今でも議論が絶えません。
現在Androidのリードエンジニアとして働いている自分から見て、どう選定するかを個人的な意見を書きたいと思います。選定の方法として絶対正しい、はないと思いますので一意見としてお読みください!

iOSとAndroidの両OSでアプリを作る必要があるという前提条件のもとで書いていきます。
下のような記事の内容はすでに理解している方対象です。

経歴

自分のモバイルアプリ歴として、ざっくり書いておきます。

  • Swift: Swift UIで個人開発で4件 
    – 100万円以上の収益化に成功しているアプリもあり。
    – 経歴は1.5-2年ほど
  • Kotlin: 個人開発で2件,現在リードエンジニア。主にJetpack Composeを使用。経歴は1年ちょいほど。
  • ReactNative: 実務で1年半ほど。ネイティブ機能のブリッジ実装やライブラリ選定経験などもあり。
  • Flutter: 実務で半年ほど。実装自体の経験は少ないが、環境設定まわりの支援など。

このようなバックグランドの自分ですが、その立場で自分ならどのように選定するかを述べたいと思います。

結論

クロスプラットフォームの React Native or Flutter を第一候補とします。
しかし、次のような状況の場合はネイティブ開発を選びます。

  • 開発予算が潤沢である。
  • 先進的なネイティブ機能を使うアプリ(AR表示)
  • 非機能要件がシビアなアプリ。
  • (Rustなどでライブラリ組み込みをするアプリ)

クロスプラットフォーム ファーストの理由

まず、Flutter or React Nativeを使うのをお勧めします。色々あるけど、やはりiOSとAndroidのコードを共通化できる恩恵はコスト的に恩恵が非常に大きいです。開発予算を純粋に抑えらるのと、 iOSとAndroidの差異が限りなく小さくできます。

仮にネイティブ開発で作るとして、仕様が不明瞭な案件の時には基本的にOSで実装者が異なります。これにより、そもそもの理解の相違からそれぞれのアプリで挙動が違う場合がありそのようなコストも考慮すると、遥かにクロスプラットフォームを使うメリットが大きくなります。

少なくとも自分の場合は、今後個人開発で新しいアプリを作るなら特段理由がない限りReactNative一択です。

Flutter vs React Native

このどちらからを使うかは、個人的にはReact Native をお勧めします。

実装的な観点

実装的な観点からは、正直flutterの方が使いやすい印象です。特に環境周りの設定がとても楽なので、使い始めるまでがスムーズです。おそらくこれが初心者にも人気な理由だと思っています。

一方で、拡張性という点ではReactNativeの方ができることは多いです。やはりWebフロントで使われるライブラリをそのまま使えることがほとんどなので、基本的にwebhurontnoでできることはReactNativeでもできます。

ビジネス的観点

これはReact Nativeが勝ります。単純にReactを書くことができれば、最初の環境構築の壁さえ乗り越えればほぼReactだからです。フロントの主流はReactになってきているので、エンジニアも集めやすいですし、同様にWebのReactの現場へもいけるエンジニアになります。

Flutterで使われるDartはどうしても他への潰しが効きにくいので、これはReact Nativeが勝ると思っています。

*Expoはまだ使うな!!

いくつかの現場を見てきましたが、React NativeのExpoはまだ使うべきではないです。導入は楽になりますが、ライブラリの制限や、認証周りの挙動などで不具合があったりするのでお勧めしません。bareを使いましょう。もう少し整備されてから使うのはアリかとは思います。

ネイティブで実装する方が良い例

資金が潤沢である場合

やはり資金が潤沢であり、コストを気にしなくて良いのであればネイティブにすべきです。ライブラリがまずApple と Googleによって作られたものがあり、それらを使うことで信頼性の高く、質の高いアプリを作ることができます。

また、クロスプラットフォームとは違い、それぞれのプラットフォームで発表された最新の技術をすぐに導入できるのでそれも強みだと思います。

とにかくネイティブ開発の方が一番できることが多く、さらに強固なアプリになるので資金がある(大企業)などであれば普通はネイティブ開発を選択します。

先進的な機能を使う場合

上記にも述べましたが、ARなど最新機能を使う場合はそもそもクロスプラットフォームではサポートされてないことが多いので、必然的にネイティブ開発になります。
(といっても、実はクロスプラットフォームでもネイティブブリッジによる実装をすれば基本的には最新機能を使うこともできるのですが、実装が煩雑で難易度も高めなのでお勧めしません。)

非機能要件がシビアな場合

基本的に、パフォーマンスの面ではネイティブアプリ開発の方が良いです。
例えば、カメラの起動時のスピードなどでネイティブ開発とクロスプラットフォームで性能に差異があり、どうしてもクロスプラットフォームの方がパフォーマンスが悪い(起動が遅かったり、アプリの容量が大きくなったり…)方向に行きます。
そのため、このような非機能要件が厳しい場合にはネイティブによる開発が必要です。

組み込みライブラリの実装をする場合

組み込みライブラリ(Rustライブラリなど)の実装をする場合は、ネイティブがお勧めです。 これもクロスプラットフォームでもブリッジ実装すればできますが、とても煩雑な構成になり難易度も高いです。(経験済み)

まとめ

  • まずはクロスプラットフォーム開発を考える
    • React Nativeの方がお勧め
  • 特殊な条件ならばネイティブ開発を選ぶ