はじめに
こんにちは。京都オフィスでクライアント開発チーム(iOS/Android)のマネージャーをしています田中です。現在は出前館の開発チームで引き続きアプリエンジニアとして業務に取り組んでいます。
私はこれまでUnityを用いたスマホ向けゲームアプリのクロスプラットフォーム開発、Objective-C、Swiftを用いたiOSアプリ開発に取り組み、そして現在は出前館にてReact Nativeを用いたクロスプラットフォーム開発を行っています。
本記事では私のこれまでの経験を踏まえスマホ向けアプリのクロスプラットフォーム開発についてお話ししたいと思います。様々あるクロスプラットフォーム開発の技術でどれを利用すべきか悩んでいる方の参考になれば幸いです。
私が経験してきたクロスプラットフォーム開発
私がはじめてスマホ向けアプリ開発に携わったのはUnityを用いたゲームアプリ開発でした。Unityはクロスプラットフォーム開発を可能とするゲームエンジンです。開発者はUnityのおかげでプラットフォーム(iOS/Android)を意識せず開発を行えます。
私がUnityを用いてゲーム開発をしていたのはUnityのバージョンが4.xの頃で、以下のような開発をしていました。
- Unity(クライアント側)とサーバ側とのネットワーク処理の設計/実装
- Unity(クライアント側)でのローカルDB設計/実装
- Unity(クライアント側)とサーバ側で課金処理の実装
- CI/CD環境の構築
当時は徐々にUnityでのゲームアプリ開発の情報が増えてきていましたがそれでもなかなか大変だったことを覚えています。
その中でもクロスプラットフォーム開発ならではの悩みとして以下のようなことがありました。
- 課金処理などネイティブの機能を利用する時にはUnity側とネイティブ側をブリッジする実装が必要
- プラットフォーム固有の問題対処に時間がかかる(iOSやAndroidに詳しいチームメンバーの不足)
これらは他のクロスプラットフォーム開発技術を利用した時にも起こりうる問題だと思います。当時は私もiOSやAndroidについての知識が不足しており解決に非常に苦労しました。
出前館でのクロスプラットフォーム開発
Unityでのクロスプラットフォーム開発を経験した後、私はiOSアプリエンジニアとしてObjective-CやSwiftを用いて地図関連のサービス開発に従事していました。その後、LINEに入社し現在担当している出前館では、React Nativeを用いてクロスプラットフォーム開発を行っています。

React Nativeを使用することは今回がはじめてですが以下のような点に驚きました。
- Expoの存在
- Reactのエコシステム
1点目のExpoについて詳細は割愛しますがReact Nativeの話をする時には合わせて話がされるかと思います。Expoを利用することにより発生する制限事項もありますがその点について開発する対象のアプリで問題がないのであれば非常に魅力的な選択肢の一つです。
2点目について、React Nativeという名前の通りReactの知識が活かせる点は素晴らしいなと思っています。私自身は最近のWebフロントエンド技術動向は把握していないのですが、背景にある思想が同じであるということはReactが得意なWebフロントエンドのメンバーに相談ができそうで助かります。
クロスプラットフォーム開発とのつき合い方とアプリエンジニアとしての面白さ
私はまだ使用経験はありませんが、取り上げるべき話題として他にもFlutterやXamarinがあります。国内外の事例も多く、共に素晴らしいクロスプラットフォーム開発ツールです。特にFlutterは私も経験がないため時間のあるときにFlutterでアプリ開発をしてみたいと思っています。
さて、FlutterもReact Nativeも、Xamarinも、そしてゲームアプリを作るときにはUnityなど、クロスプラットフォーム開発を検討する時には魅力的な選択肢が多いですが、どのように検討を進めると良いのでしょうか。検討を行う時の観点として例えば以下があります。
- スケジュール / 開発リソース
- ネイティブ固有の機能の利用可否
- UI/UXの表現(ネイティブらしさ)
- 開発を担当するチームのスキルセット
- 各プラットフォーム(Android/iOS)固有機能への対応速度
- 開発ツール(開発作業のしやすさ)
クロスプラットフォーム開発を選択する理由の一番はスケジュールと開発リソースのことだと思います。開発するアプリにもよるので一概には言えませんが、たしかにiOS/Androidアプリをそれぞれネイティブアプリ開発するよりも早くリリースできる可能性は高いと私は思います。
一方で、ネイティブアプリよりも一つ多くレイヤーがあることでその技術動向も注視する必要があります。これは事業にとっては一つのリスクとなるでしょう。そのリスクを受け入れ、クロスプラットフォーム開発を行う際のメリットが大きいのであれば選択する価値は十分あるのだろうと私は考えています。
アプリエンジニアはこれからも様々な言語やツールを使っていくことになります。そういう時に大切なことが以下のような知識です。
- データ構造/アルゴリズム
- ソフトウェアアーキテクチャ(MVC/MVVM/・・・)
- OS(Android/iOS)
- UI/UX
私は現在社会人学生としてソフトウェアエンジニアリングを大学で学んでいます。そこでも改めて気づくことが多いのですが、こういった知識はアプリエンジニアとして向き合う技術がどう変わっていくとしてもベースになることだということです。
アプリ側が実現する役割や機能はこれからも変化し複雑になっていくでしょう。言語やツールも変わっていきます。
例えば、経験が少ない言語で、その言語仕様を少しずつ調べ、言語仕様を生かしたMVVMアーキテクチャを作っていく、というのは私としては好きな作業です。そういった状況をこれからも楽しむためにもこれらの項目はソフトウェアエンジニアとして磨き続けたいと思っています。
まとめ
スマホ向けアプリのクロスプラットフォーム開発についてお話をしてきました。どの技術を使うか、という判断は難しいと思いますが、所属する組織やチームと議論し、これからの事業のことなどを考えて選択することが私は大切だと思っています。
出前館ではReact Nativeを利用しアプリ開発を行っています。私もまだまだ勉強中ですがこれまでの経験や知識が生きることも多く楽しく開発ができています。東京または京都でアプリエンジニアを募集していますので、React Nativeでのアプリ開発が得意な方も、iOS/Androidでの開発経験が豊富な方も興味を持っていただけましたらぜひご検討頂けると幸いです。
それでは。
クライアント開発エンジニア / iOS / Android / 出前館
https://linecorp.com/ja/career/position/2210
iOS/Androidエンジニア / 京都開発室
https://linecorp.com/ja/career/position/1440