対象読者
- JavaScriptとWeb開発の基礎に理解がある方
- Reactを用いたJavaScriptアプリケーション開発の経験者
- Androidアプリ開発の経験者
- iOSアプリ開発の経験者
前提環境
本記事の内容は、React Native v0.57.4の実装を元にして解説しています。
プラットフォームの多様化とそれに伴う課題
2010年代のエンドユーザー向けクライアントアプリケーション開発は、激動の時代でした。企業や個人がインターネットを通じてユーザーにサービスを提供しようとしたとき、一昔前ならばWindowsアプリケーションを作って、Webサイトを通じてexeファイルを配布していました。
それが現在では、すべてがブラウザ上で完結する、Webアプリケーションとして提供することが当たり前になってきています。また、携帯電話(フィーチャーフォン)よりもインターネットとの親和性が高いスマートフォンが普及したことにより、サービスをAndroidアプリやiOSアプリからも利用できることが当たり前になってきました。
つまり、現代のWebサービスは、次の3つのプラットフォームに対応することが求められていることになります。
- ブラウザ(Webアプリケーション)
- Android
- iOS
もちろん、現実的にはサービスが実現したいことや特性(いわゆる「要件」)によって、ブラウザ向けのサービス展開が必要がないケースもありますし、時間とお金(≒人数)が足りないなどの問題で、Androidアプリだけを先行開発するケースもあることでしょう。それでも、時間とお金がある限りは、「できるだけ3つのプラットフォームすべてにアプリケーションを提供してほしい」といった要件が増えてきていると、筆者は感じています。
開発の作法の違いから来る人材不足
さて、ビジネス上の要求として、1つのサービスに付き3つのアプリケーションを作ることになったとしましょう。これらは同じやり方で作ることができるのでしょうか。
答えはNoです。WebアプリケーションとAndroidアプリとiOSアプリの作り方は、考え方として近い部分は随所にあるものの、基本的には大きく違うものです。これは、ブラウザやAndroid SDKやiOS SDKが提供している、開発ツールの文化が違うことに由来しています。筆者が少し考えただけでも、次のような点は違いとして挙げられます。
- 言語
- 非同期処理を実現するAPIの使い方
- 日時を計算するAPIの使い方
- UIを組み立てる方法
- UIを更新する方法
- リリースする方法
- etc…
プラットフォームごとに適した標準的なお作法や、仕組み上の課題・問題、それに対するベストプラクティスがあります。各プラットフォームのアプリケーション開発で活躍するエンジニアたちは、自分が専門とするプラットフォームの特性を把握しながら、日々、技術の進化に追従しているわけです。
これには、困ったことがあります。提供するプラットフォームごとに人材が必要になるので、1つのプラットフォームだけを開発する場合に比べると、単純に3倍の数のプラットフォーム専門家たちを用意しないといけないことになります。採用の特性も変わってくるので、採用コストはそれなりのものになります。
もし、すべてを1人でまかなえる人を見つけられれば、そういった人たちだけを集めてチームを組むこともできるかもしれません。しかし、Webアプリケーションも、Androidアプリも、iOSアプリも作って、リリースして、運用できる。そんな人材がいるでしょうか。いないことはないのですが、残念ながらそれは希少な人材です。採用するにしても、育成するにしても、一定のコストは覚悟する必要があります。
開発の作法の違いから来る工数の増大
また、各プラットフォーム向けのアプリケーションをそれぞれ組み上げる都合上、その開発にかかる時間(いわゆる工数)が、1プラットフォーム分だけを作る場合のそれよりも圧倒的に多くなることは、想像に難くないでしょう。開発の作法は違うのに、同じように動く形で機能を実現しなければいけません。ここに、「できるだけ3プラットフォーム同時にリリースして」といった要件が加わると、さらに難易度が上がります。
こればかりは、1人で3プラットフォームをまかなえるスーパーマンを連れてきても、解決できません。KotlinでAndroidアプリを書きながら、同時にSwiftでiOSアプリを作ることは、できないからです。
1つのサービスが、WebアプリケーションとAndroidアプリとiOSアプリをそれぞれ提供する、というのは、それなりに体力を要するのです。
クロスプラットフォームという選択肢
もちろん、各プラットフォーム向けに別々のアプリケーションを作れば、プラットフォームごとに違ったUIを用意することもできるくらいに、自由度が高くなります。それはそれで素晴らしいことです。
しかしながら、コストや人材を考えると、「多少自由度を失ってもいいから、一度の実装で複数のプラットフォームにアプリを提供したい」というニーズが開発現場から生まれてくることも、妥当なものではないでしょうか。そういった理由から、AndroidアプリとiOSアプリ(以降、モバイルアプリとまとめます)の同時開発の分野で、多くの試みがなされました。大別して、3つのアプローチがあったと筆者は認識しています。各アプローチと、代表的な開発ツールについて、簡単に挙げてみましょう。
- ハイブリッド型: WebViewの上でWebアプリケーションを動かす
- 独自レンダラ型: 独自の描画エンジンでUIを描画する
- ネイティブUI型: AndroidやiOSのUIシステムを別の言語やフレームワークから操作する
どれも、モバイルアプリの発展に寄与してきた、偉大なツールたちです。本連載はReact Nativeのためのものなので、他のツールを細かく解説することはできませんが、もし本連載を読んで、React Nativeが肌に合わないと感じたときには、その他のツールを参照してみるとよいでしょう。