
どうも、小野です。私はずっとWebアプリ開発を行ってきたので、スマホアプリ開発は未経験です。興味本位で軽く触ったことはありますが、初心者同然です。最近、Android開発のデベロッパーに登録したこともあり、勉強し始めたところです。(iOSは1年単位の更新があるので登録していません) まず、スマホアプリ開発の方法として、以下の2つがあると思います。
Android、iOSそれぞれのネイティブ言語で開発する
クロスプラットフォームフレームワークを利用して開発する。
今回はネイティブ言語をそれぞれ学習するのは大変なので、後者について検討してみます。現在、クロスプラットフォームなフレームワークには主にReact NativeとFlutterが主流となっています。 React NativeとFlutterの比較は他の記事にもたくさんあるのでそちらを参考にしていただき、ここでは私がReact Nativeを選択した理由をお話したいと思います。(正確にはReact Native+Expoです。) 選択した理由としては3つあります。
TypeScriptで開発が可能
ストアを介さずにアップデートが可能
開発OSに制限がない
TypeScriptで開発ができる
TypeScriptは現代のWebフロントエンド開発において最も人気のある言語の一つです。特に以下のような利点があります。
静的型チェックによりバグの早期発見が可能
コード補完やリファクタリングのサポートが充実
大規模なアプリケーション開発での保守性が高い
Webフロントエンド開発者にとって、React NativeでTypeScriptが使えることは以下のような大きなメリットがあります:
既存のTypeScriptの知識やベストプラクティスをそのまま活用できる
React/React Nativeのコンポーネント開発で型の恩恵を受けられる
npmパッケージの型定義を活用でき、安全にライブラリを利用できる
これにより、Webフロントエンド開発からモバイルアプリ開発への移行がスムーズになり、学習コストを大幅に削減することができます。
※FlutterはDartという言語を覚える必要があります。
ストアを介さずにアップデートが可能
アプリをストアを介さずに更新できるOTAアップデート(Over The Air update)が可能です。 React NativeとExpoを組み合わせることで、アプリの新バージョンをサーバーにアップロードし、ユーザーが次回アプリを起動した際に自動的に更新を適用することができます。 これにより、以下のようなメリットがあります。
バグ修正や小規模な機能更新を迅速にリリースできる
App StoreやGoogle Play Storeのレビュープロセスを待つ必要がない
ユーザーが手動でアプリを更新する手間を省ける
ただし、ネイティブコードの変更を伴う更新の場合は、従来通りストアを通じた配布が必要になります。
※Flutterにはこのような機能はありません。
開発OSに制限がない
通常、iOSアプリを開発する場合、ビルドやテストにMacOSが必要となります。これは、iOSの開発環境であるXcodeがMacOS専用のソフトウェアだからです。 しかし、React NativeとExpoを組み合わせ、さらにEAS(Expo Application Services)を利用することで、この制限を回避できます。EASはクラウド上でビルドを実行するため、開発者のローカル環境に依存せず、WindowsやLinuxなど、どのOSからでもiOSアプリの開発が可能になります。 これにより、以下のようなメリットがあります。
開発チームのメンバーが好みのOSを選択できる
MacOSの端末を用意する必要がなく、初期コストを抑えられる
クラウド上でビルドを行うため、ローカル環境の負荷を軽減できる
※Flutterを利用した場合、iOSアプリ開発にはMacOSが必要になります。
注意点
React Native + Expoには以下のようなデメリットがあるので、それを理解した上でプロジェクトの要件に合わせて適切な判断を行うことが重要です。
ネイティブな機能へのアクセスが制限される可能性がある
バンドルサイズが大きくなりがち
パフォーマンスがネイティブアプリに比べて劣る場合がある
Expoの無料プランには制限がある(ビルド回数制限など) 特に以下の場合は、React Native + Expoの使用を慎重に検討する必要があります。
高度なハードウェア機能を使用する必要がある場合
極めて高いパフォーマンスが要求される場合
アプリのサイズを極限まで小さくする必要がある場合
おわりに
注意点にも書きましたが、採用するかどうかはアプリ要件次第ではあるので、慎重に検討する必要があります。私自身、仕事で開発予定はなく、個人で開発する手始めとして調査したところ、学習コストをかけずにできることが最優先ではあったので、ReactNativeを採用しました。 もし、アプリ開発の方法で悩んでたら判断材料として参考にしていただけると幸いです。