モバイルアプリ開発で事前に確認すべきことを整理できていますか?数十万ユーザー規模のアプリをReact Nativeで開発・運用する過程で分かった「気づき・教訓」をもとに、開発時に知っておきたいスマートフォン固有機能の仕様確認から、運用時に知っておきたい証明書更新まで幅広く取り扱います。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
各社のエンジニアが発信する「テックブログ」。その熱量を@IT編集部がピックアップ。 生成AI前提時代に向けて環境が激変する中、“隣のエンジニア”は何を感じ、何を考え、どうアクションしているのか?――試行錯誤のプロセス、成功の鍵、変化に立ち向かうマインドなど現場のリアル、ナレッジを凝縮してお届けします。
本稿はTISインテックグループが運営する、開発現場から生まれた技術ノウハウを公開するサイト「Fintan」上で2025年8月25日に掲載した記事を転載するものです。そのため、用字用語の統一ルールなどが、@ITのものと異なります。ご了承ください。
モバイルアプリ開発には、Webアプリにはない特有の注意点やポイントが多く存在します。開発前にこうした知見を押さえておくかどうかで、トラブルの有無や品質が変わります。
本稿では、モバイルアプリの新規開発プロジェクトにて、数十万ユーザー規模のアプリをReact Nativeで開発・運用することで得た「気づき・教訓」をもとに、開発前に知っておきたかったポイントを10個選んでお伝えします。
例えば、モバイルアプリでプッシュ通知を利用する場合は、Androidの「通知チャンネル」機能について理解しておく必要があります。この点を正しく把握していないと、通知の優先度やチャンネル名などの要件を見落としてしまう恐れがあります。プッシュ通知やディープリンクといったスマートフォン固有の機能を活用する際は、事前に最新の仕様を確認し、理解しておくことが重要です。
Fintanで公開しているReact Nativeのサンプルアプリケーションにも、プッシュ通知機能の実装方式が記載されているので、ぜひ参考にしてみてください。
アプリは、端末がWi-Fiに接続している、バッテリー残量が十分である、自動アップデート設定がオンになっているなど、OSごとに定められた条件を満たしている場合にのみ自動的にアップデートされます。さらに、App StoreやGoogle Playはアップデートの実行を制御するための「強制アップデート」機能を提供していないため、アップデートを確実に適用させることはストア側では制御できません。
そのため、致命的な不具合の修正やセキュリティ対応を確実にユーザーへ反映させるには、アプリ内で強制的にアップデートを促す仕組みを実装する必要があります。
プロジェクトでは、強制アプリアップデートで紹介されている実装方式を参考に実装しました。
モバイルアプリを開発する場合、フレームワークで用意されているものだけでは実現できない機能を開発することがあります。その際にはサードパーティ製のライブラリを利用することも検討しますが、ライブラリを選定した上で、そのライブラリのIssueを事前に確認し、既知の不具合や、その対応状況などを把握することで、後からトラブルに直面することを未然に防ぐことができます。
実際にリリース後に、サードパーティライブラリの既知の不具合に直面し、patch-packageでパッチを当てて対応せざるを得なくなった経験がありましたが、もし事前にIssueを確認していれば、こうした問題を事前に回避できたと痛感しました。
ユーザーから見れば、問題の原因がサードパーティライブラリにあろうとアプリ自体にあろうと、すべて「アプリの不具合」として認識されるため、ライブラリ選定には十分な責任を持つ必要があります。
今回の経験を通じて、ライブラリ選定時のリスク確認や事前調査の重要性を改めて認識しました。ライブラリの選定については、サードパーティライブラリの導入の記事が参考になります。
重要なボタンが、ユーザーが画面をスクロールしなければ見えない位置に配置されていることは、ユーザビリティの観点から大きな問題となります。実際、プロジェクトのユーザビリティテストにおいても、重要なボタンが画面の下部にあるため、スクロールしないと気づけないという課題が指摘されました。
状況によってはコンテンツの高さを調整するなど、ユーザーがアプリを開いたときに最初に目にする「ファーストビュー」に重要な情報を配置するようにしましょう。
ページに表示されるコンテンツ量に応じて、ユーザーが快適に操作できるスクロールのスピードや慣性になっているか注意しましょう。また、ネイティブ画面と WebView画面を比較し、スクロール時の操作感に違和感がないかも確認することが重要です。
プロジェクトのユーザビリティテストでは、特定の画面でスクロールの慣性に違和感があるという報告がありました。原因を調べたところ、react-native-webviewを使用してWebViewを表示していた際に、スクロールの減速率(decelerationRate)のデフォルト設定が高めに設定されていたことが原因であると判明しました。
処理速度の遅い端末や通信環境の悪い場所では、ページの読み込みに時間がかかることがあります。こうした場面では、待機中であることが明確に伝わるようにローディングインジケーターなどを適切に表示することが重要です。実際のテストフェーズでも、APIのレスポンスが想定より時間がかかることに気づき、ローディングインジケーターの表示が不十分だと分かりました。
iOS(Safari)では、入力フォームの文字サイズが16px未満の場合に自動的にズームしたり、フォームに青色の枠線を表示するなど、アクセシビリティやユーザビリティを向上させるための機能があります。これらの挙動が発生したときに違和感のないデザインとなっているかを、注意する必要があります。
React Nativeでは、1つのプログラムでAndroid、iOS両端末で動くのが大きなメリットですが、AndroidとiOSのプラットフォーム間で挙動の違いがたくさんあります。
プロジェクトで実際に経験した点をいくつか挙げますが、開発時は注意が必要です。
iOSではReact NativeのModalを同時に2つ表示できません。例えば、エラー発生時にモーダルを表示する場合は、同時に複数のエラーが発生しても、複数のモーダルが同時に表示されないよう制御する必要があります。
AndroidのTalkBackとiOSのVoiceOverについては、テキストや素材の読み上げ方が異なります(そもそも読み上げが行われない場合もあります)。そのため、アクセシビリティ要件として読み上げ機能に対応する際は、TalkBackとVoiceOverの両方で実際に動作を確認し、許容できる読み上げ内容になっているかを検証する必要があります。
アプリをアンインストールした時の端末に保存されたアプリデータの扱いですが、KeyStore/KeyChain領域に保存したデータの扱いには以下の違いがあります。
そのため、expo-secure-storeなどを使用してこれらのデータ領域を利用している場合は、挙動の違いに注意が必要です。
AndroidとiOSには、アプリのライフサイクル管理の違いがあります。この知識は普段の機能開発では意識しないかもしれませんが、不具合調査やテストの際に役立ちました。実際、以下のような不具合対応の際に、ライフサイクルに関する知識を原因の特定や対応方針の検討に役立てることができました。
具体的には、AndroidでアプリのIn-App Browser(認証用Web画面)を開いたままアプリをバックグラウンドにし、再度アプリアイコンをタップしてフォアグラウンドに戻した際にエラーが発生する、という障害がありました。
一方で、Appスイッチャー(現在開いているすべてのアプリの一覧表示)からの再起動では問題は発生しませんでした。このような症状を前にしたとき、「ライフサイクルの状態遷移による処理の違いが原因ではないか」と仮説を立てて調査を進めることができました。もしライフサイクルの仕組みを知らなければ、どこから手を付けてよいか分からず、原因特定にさらに時間がかかっていたと思います。
このように、アプリのライフサイクルへの理解があることで、思いがけない不具合が発生した場合のヒントになります。アプリのライフサイクル管理の記事にライフサイクルに関する説明がありますので、目を通しておくことをお勧めします。
OSや環境によっては、ライブラリの挙動に微妙な違いが生じることがあります。実際にライブラリの仕様を十分に理解していなかったため、Androidで一部の機能が期待通りに動作せず、後から代替手段を検討せざるを得ない場面がありました。
こうした問題は、公式ドキュメントを丁寧に読むことで、事前に仕様や制限、プラットフォームごとの違いに気づける場合があります。トラブルを未然に防ぐためにも、ライブラリのドキュメントには一通り目を通し、挙動や制約を事前に把握しておくことが重要です。
「ダークモード」や「横向き画面」、「キーボードの制御」、「フォントサイズ変更」など、モバイルアプリならではのテスト観点がたくさんあります。Fintanのテスト種別&テスト観点カタログでは、このようなモバイルアプリならではの観点が網羅的に整理されています。プロジェクトでも、テスト観点漏れの対策としてこのカタログを活用しました。
ユーザー目線で様々な操作パターンを試すモンキーテストは、必ず実機で積極的に実施することを推奨します。実機によるモンキーテストでは、エミュレーターでは再現しにくい端末固有の挙動や、UX上の問題を発見することができました。
モバイルアプリの継続的な配信を円滑に行うためには、ビルドパイプラインやプログラムの定期的なメンテナンスが欠かせません。
実際、プロジェクトで不具合修正をリリースしようとした際、ビルドパイプラインで使用しているXcodeのバージョンが古かったためにエラーが発生し、スムーズにリリースできなかった経験がありました。この出来事から、OSやストアのポリシー、SDKバージョンのアップデートへの追従が不十分だと、いざという時に迅速な対応が難しくなることを実感しました。
Google Playの要件では、targetSdkVersionを毎年更新することが求められています。新しいAPIレベルがリリースされた後、一定期間内にそのAPIレベルに対応したtargetSdkVersionを適用しないと、新規アプリの公開や既存アプリの更新が制限されます。
App Storeでは、Appleが指定する最新のXcodeおよびiOS SDKでビルドしたアプリの提出が、一定の猶予期間後に必須となります。これは、年次のiOSリリースに合わせて定期的に行われています。
そこで、ビルドパイプラインとストアへのアップロード作業を定期的に実施する対策を講じました。これにより、ストアの仕様変更やSDK更新によるビルドエラーや警告を早期に発見し、問題発生時にも迅速に対応できるようになりました。
ただし、こうした対応は問題発生後の対処に過ぎません。OSのリリーススケジュールや開発ツールのアップデート情報を事前に把握し、年間の開発計画に組み込むことも同様に重要です。
iOSアプリの開発・運用では、署名に使用する証明書やプロビジョニングプロファイルの有効期限(通常1年間)に注意してください。これらは有効期限を過ぎると、新しいビルドやApp Storeへの配信ができなくなります。
そのため、証明書やプロビジョニングプロファイルの有効期限を事前に把握し、期限切れ前に更新作業を行う運用フローの整備を推奨します。とくに運用担当者が交代した場合など、更新漏れが発生しやすいので、定期的なチェックリストやリマインダーの設定を検討しましょう。
本稿では、React Nativeでのモバイルアプリ開発において、経験から得た「気づき・教訓」や「知っておきたかったこと」を共有しました。要件定義から設計、実装、テスト、そして運用に至るまで、モバイルアプリ開発ならではの注意点が多く存在します。これらの情報が、これからモバイルアプリ開発に携わる方々にとって、少しでも開発のヒントや効率化に役立つことを願っています。
ITエンジニア必読書『徳丸本』が8年ぶりの改訂へ 「第3版」のポイントを筆者が解説
Google I/O 2026を読み解く AIエージェント時代のソフトウェア開発はどこにたどりついたのか
年収1000万円が狙えるエンジニア職種は? アプリ開発は915万円で下位だが安定
「Cursor」のエージェント機能がWebとモバイル環境に対応
一から始めるローコード開発――タスク管理アプリ作成で分かるkintoneの基本機能Copyright © ITmedia, Inc. All Rights Reserved.