# モバイルアプリケーションの分類

「モバイルアプリケーション」や「モバイルアプリ」という用語を使用する場合、モバイルデバイス上で動作するように設計された自己完結型コンピュータプログラムを指します。発行時点で、Android および iOS オペレーティングシステムは累計で [モバイル OS 市場シェアの 99 %以上](https://www.idc.com/promo/smartphone-market-share/os) を占めており、モバイルインターネットの使用率はデスクトップインターネットの使用率をはるかに上回っています。これはモバイルアプリが [最も広く普及しているインターネット対応アプリの種類](https://www.idc.com/promo/smartphone-market-share/os) であることを意味します。

また、このガイドではモバイル OS 上で動作するあらゆる種類のアプリケーションを指す一般的な用語として「アプリ」という用語を使用します。通常、アプリは設計されたプラットフォーム上で直接動作するか、スマートデバイスのモバイルブラウザ上で動作するか、あるいはこれら二つの方法をミックスして使用します。

この章では、以下の種類のアプリについて説明します。

* [ネイティブアプリ](#native-apps)
* [クロスプラットフォームモバイルフレームワーク](#cross-platform-mobile-frameworks)
* [ウェブアプリ](#web-apps)
* [ハイブリッドアプリ](#hybrid-apps)
* [プログレッシブウェブアプリ](#progressive-web-apps)

## ネイティブアプリ <a href="#native-apps" id="native-apps"></a>

モバイル OS に特化したアプリを開発するためにソフトウェア開発キット (Software Development Kit, SDK) で開発されたモバイルアプリはその OS に対して *ネイティブ* と呼ばれます。ネイティブアプリについて議論している場合、そのオペレーティングシステム向けの標準プログラミング言語、iOS では Objective-C や Swift、Android では Java や Kotlin、で実装されていると想定します。

*ネイティブアプリ* 特定の OS 向けに設計され、その OS 向けのツールを使用しているため、最高の信頼性で最速の性能を提供する能力を備えています。それらは通常、プラットフォーム固有の設計原則 ([Android デザインの原則](https://developer.android.com/design) など) に準拠するため、 *ハイブリッド* アプリや *ウェブ* アプリと比べてより一貫性のあるユーザーインタフェース (UI) となります。オペレーティングシステムとの密接に統合しているため、*ネイティブアプリ* は一般的にデバイスのほとんどすべてのコンポーネント (カメラ、センサー、ハードウェア支援のキーストアなど) に直接アクセスできます。

しかし、Android は二つの開発キット Android SDK と Android NDK を提供しているため、このプラットフォームの *ネイティブアプリ* という用語にはいくらかあいまいさがあります。SDK は Java および Kotlin プログラミング言語をベースとしており、アプリ開発のデフォルトですが、プラットフォームの NDK (Native Development Kit, ネイティブ開発キット) は C/C++ キットであり、低レベル API (OpenGL など) に直接アクセスできるバイナリライブラリを開発するために使用されます。これらのライブラリは SDK で構築された通常のアプリに含めることができます。したがって私たちは、Android *ネイティブアプリ* (つまり、SDK を使用して構築されている) は NDK を使用して構築された *ネイティブ* コードを持つ可能性がある、と表現します。

## クロスプラットフォームモバイルフレームワーク <a href="#cross-platform-mobile-frameworks" id="cross-platform-mobile-frameworks"></a>

*ネイティブアプリ* の最も明白な欠点はひとつの特定のプラットフォームに限定されることです。開発者が Android と iOS の両方に対して同じアプリを構築したい場合は、二つの独立したコードベースを維持するか、多くの場合二つのプラットフォームを一つのコードベースに移植するために複合開発ツールを導入する必要があります。

以下に開発者が Android と iOS の両方を含むさまざまなターゲット向けに単一のコードベースをコンパイルできるクロスプラットフォームフレームワークをいくつか示します。

* [.NET MAUI](https://dotnet.microsoft.com/en-us/apps/maui)
* [Flutter](https://flutter.dev/)
* [React Native](https://reactnative.dev/)
* [Unity](https://unity.com/)

これらのフレームワークを使用して開発されたアプリは、各システムにネイティブな API を内部的に使用し、ネイティブアプリと同等のパフォーマンスを提供します。また、これらのアプリは GPS、加速度計、カメラ、通知システムなど、すべてのデバイス機能を利用できます。これらのフレームワークを使用して作成されたアプリは機能的には真のネイティブアプリと同等ですが、通常はそう呼ばれることはありません。*ネイティブアプリ* という用語は OS のネイティブ SDK で作成されたアプリに使用され、これらのフレームワークを使用して作成されたアプリは一般的にクロスプラットフォームアプリと呼ばれます。

アプリがクロスプラットフォームのモバイルフレームワークを使用している場合、静的解析や動的解析を実行するためには一般的に特定のツールが必要になるため、知ることが重要です。実際のアプリケーションロジックは、アプリが *ネイティブアプリ* に見られるような典型的なコードも含むにも関わらず、通常はアプリ内のフレームワーク固有のファイルに配置されています。ただし、このネイティブコードは通常、クロスプラットフォームフレームワークを初期化し、いわゆるプラットフォーム固有のバインディングを通じてネイティブシステム API とフレームワーク SDK 間のバインディングを提供するためにのみ使用されます。

稀ではありますが、アプリはネイティブコードとクロスプラットフォームフレームワーク、あるいは複数のクロスプラットフォームフレームワークを組み合わせることがあるため、アプリの攻撃対象領域全体を正しくカバーするには、使用されているすべてのテクノロジを特定することが重要です。

## ウェブアプリ <a href="#web-apps" id="web-apps"></a>

モバイルウェブアプリ (または単に *ウェブアプリ*) は *ネイティブアプリ* のようなルックアンドフィールで設計されたウェブサイトです。これらのアプリはデバイスのブラウザで動作し、通常はモダンなウェブページと同様に HTML5 で開発されています。ランチャーアイコンは *ネイティブアプリ* にアクセスするのと同じような感覚となるように使用することができます。但し、これらのアイコンは基本的にブラウザのブックマークと同じで、単にデフォルトのウェブブラウザを開いて参照先のウェブページを読み込むだけです。

ウェブアプリはブラウザの制限内で動作するため、デバイスの一般的なコンポーネントとの統合が制限されて (すなわち「サンドボックス化」されて) おり、一般にネイティブアプリと比較して性能が低くなります。開発者はウェブアプリでは一般的に複数のプラットフォームを対象としているため、通常、その UI は特定のプラットフォームの設計原則に従いません。しかし、開発者が単一のコードベースを使用することで開発および保守のコストを削減し、プラットフォーム固有のアプリストアを経由せずにアップデートを配信できるため、*ウェブアプリ* は人気があります。例えば、*ウェブアプリ* 用の HTML ファイルへの変更は実行可能なクロスプラットフォームのアップデートとして機能することができますが、ストアベースのアプリへの更新はかなりの労力を必要とします。

## ハイブリッドアプリ <a href="#hybrid-apps" id="hybrid-apps"></a>

*ハイブリッドアプリ* は *ネイティブアプリ* と *ウェブアプリ* の長所を生かそうとする特定の種類の *クロスプラットフォームアプリ* です。このタイプのアプリは *ネイティブアプリ* のように動作しますが、プロセスの大部分はウェブテクノロジーに依存しています。つまり、アプリの一部が埋め込み型ウェブブラウザ (通常は "WebView" と呼ばれる) 内で動作します。そのため、*ハイブリッドアプリ* は *ネイティブアプリ* と *ウェブアプリ* の長所と短所の両方を継承します。これらのアプリはウェブからネイティブへの抽象レイヤーを使用して、純粋な *ウェブアプリ* にはアクセスできないデバイス機能にアクセスできます。開発に使用されるフレームワークによっては、*ハイブリッドアプリ* コードベースはさまざまなプラットフォームを対象とし、オリジナルのプラットフォームのものによく似た UI 要素を利用する複数のアプリを生成できます。

以下は *ハイブリッドアプリ* を開発するためのより一般的なフレームワークです。

* [Apache Cordova](https://cordova.apache.org/)
* [Framework 7](https://framework7.io/)
* [Ionic](https://ionicframework.com/)
* [Native Script](https://www.nativescript.org/)
* [Onsen UI](https://onsen.io/)
* [Sencha Ext JS](https://www.sencha.com/products/extjs/)

## プログレッシブウェブアプリ <a href="#progressive-web-apps" id="progressive-web-apps"></a>

*プログレッシブウェブアプリ* (PWA) は最近のブラウザが提供するウェブのさまざまなオープンスタンダードを組み合わせて、リッチなモバイルエクスペリエンスの利点を提供します。シンプルな JSON ファイルである Web App Manifest を使用して、「インストール」後にアプリの動作を設定できます。これらのアプリは通常のウェブページと同じようにロードしますが、いくつかの点で通常のウェブアプリとは異なります。

たとえば、オフラインで作業したり、モバイルデバイスのハードウェアにアクセスすることが可能ですが、これは *ネイティブアプリ* のみが利用できる機能でした。PWA は Android および iOS の両方でサポートされていますが、まだすべてのハードウェア機能が利用できるわけではありません。たとえば、プッシュ通知、iPhone X の Face ID、拡張現実のための ARKit はまだ iOS では利用できません。
