10.

app ファイル(.app)とは | macOS アプリケーションバンドルの中身・Info.plist・codesign

編集
この記事の要点
  • .app は macOS のアプリケーションバンドル。実体はファイルではなくフォルダ
  • Finder では 1 つのアイコンに見えるが、「パッケージの内容を表示」で内部構造(Contents/ など)にアクセスできる
  • バンドル直下は Info.plist が必須。実行バイナリは Contents/MacOS/、リソースは Contents/Resources/
  • 配布時は codesign で署名 + 公証(notarization)が必須。Gatekeeper が検証する
  • 通常は .dmg または .pkg に詰めて配布する

概要

.app は macOS アプリケーションを表す拡張子ですが、実体は単一のバイナリファイルではなく 「アプリケーションバンドル」と呼ばれる特殊なディレクトリです。Finder ではアイコン 1 つに見え、ダブルクリックすると即起動する一方、右クリック →「パッケージの内容を表示」を選ぶと中身のフォルダ階層を覗くことができます。

この「フォルダなのにファイルに見える」仕掛けは macOS(旧 NeXTSTEP)が古くから採用している設計で、アプリに必要なすべて—実行バイナリ、画像、サウンド、ローカライズリソース、設定 plist、ヘルプ HTML、フレームワーク—を 1 つのバンドル内に自己完結させられます。これにより以下のメリットが生まれます。

  • インストールがコピーだけ: .dmg から /Applications にドラッグするだけで完了
  • アンインストールも削除だけ: バンドルをゴミ箱に捨てれば原則きれいに消える(環境設定 plist や Library/Application Support の残骸は別途)
  • 多言語対応がきれい: en.lprojja.lproj のように言語別フォルダで切り替え
  • ローカル依存ライブラリも同梱: Contents/Frameworks/ に dylib を入れて配布

内部構造

典型的な .app バンドルは次のようなツリーになっています(例: MyApp.app)。

MyApp.app/
└── Contents/
    ├── Info.plist           # バンドル識別子・バージョン・実行ファイル名等のメタデータ
    ├── PkgInfo              # 4+4 文字の古典的タイプ識別子(APPL????)
    ├── MacOS/
    │   └── MyApp            # 実行ファイル本体(Mach-O 形式)
    ├── Resources/
    │   ├── AppIcon.icns     # アイコン
    │   ├── en.lproj/        # 英語リソース
    │   │   └── MainMenu.nib
    │   ├── ja.lproj/        # 日本語リソース
    │   └── Assets.car       # コンパイル済みアセットカタログ
    ├── Frameworks/          # 同梱する .framework / .dylib
    ├── PlugIns/             # プラグイン
    ├── Helpers/             # XPC ヘルパ等
    ├── embedded.provisionprofile  # (Mac App Store / Developer ID 配布時)
    └── _CodeSignature/
        └── CodeResources    # 署名情報

Info.plist はバンドル動作の核となる XML / バイナリ plist で、最低限以下のキーを持ちます。

  • CFBundleIdentifier: com.example.myapp 形式の一意 ID
  • CFBundleExecutable: 起動するバイナリ名(Contents/MacOS/ 配下)
  • CFBundleName / CFBundleDisplayName: 表示名
  • CFBundleVersion / CFBundleShortVersionString: バージョン
  • LSMinimumSystemVersion: 要求する macOS の最低バージョン
  • NSHighResolutionCapable: Retina 対応フラグ
  • LSApplicationCategoryType: App Store カテゴリ

実行バイナリ自体は Mach-O 形式で、Universal Binary にすると Apple Silicon(arm64)と Intel(x86_64)の両方を 1 ファイルに含められます(lipo で結合)。

主な用途

  • macOS の通常アプリ: Safari.app、Mail.app、Xcode.app、Finder.app など、すべて .app バンドル
  • サードパーティ製品: Visual Studio Code、Chrome、Slack、Notion 等。多くは .dmg 内に .app として配布
  • Mac App Store 配布: 同じ .app だが、サンドボックス必須、特権付与に制限
  • 自作スクリプトのアプリ化: AppleScript Editor の「アプリケーション形式で保存」、Automator、Platypus(OSS)等で簡単に .app 化できる
  • Electron アプリ: Slack や VSCode のように、Chromium + Node を内包した .app として配布される

関連形式との比較

形式プラットフォーム実体備考
.appmacOS / iOS シミュレータディレクトリInfo.plist 必須、Mach-O 実行
.frameworkmacOS / iOSディレクトリ動的ライブラリ + ヘッダ + リソースのバンドル
.bundle / .pluginmacOSディレクトリロード専用バンドル(プラグイン)
.ipaiOSZIP内部に Payload/MyApp.app/ を含む iOS 配布形式
.exeWindows単一ファイルPE 形式
AppImageLinux単一ファイルSquashFS 内に .desktop と実行バイナリ

コマンド・ツール

  • open MyApp.app: Finder ダブルクリック相当
  • open -a "Safari": 名前指定で起動
  • ls MyApp.app/Contents/: バンドル内をターミナルから直接覗ける(フォルダだから)
  • defaults read MyApp.app/Contents/Info.plist: Info.plist の中身を読む
  • lipo -info MyApp.app/Contents/MacOS/MyApp: 対応アーキテクチャ確認(arm64 / x86_64)
  • codesign --verify --deep --strict --verbose=2 MyApp.app: 署名検証
  • codesign --sign "Developer ID Application: Name" MyApp.app: 署名付与
  • spctl --assess --type execute MyApp.app: Gatekeeper による評価をシミュレート
  • xattr -d com.apple.quarantine MyApp.app: 隔離属性を外す(自己責任)
  • Xcode: Build & Archive で .app を出力。Archive → Distribute App で公証フローまで一気通貫

注意点

  • 署名 + 公証が事実上必須: Developer ID で署名しただけでは macOS 10.15+ では起動を拒否される。xcrun notarytool で公証 → stapler staple でチケット添付がワークフロー
  • Gatekeeper バイパスの誘導は危険: 「右クリック → 開く」や spctl 無効化を要求するアプリは要警戒
  • サンドボックス: Mac App Store 配布時は必須。com.apple.security.app-sandbox エンタイトルメントで宣言。Developer ID 配布では任意だが推奨
  • Hardened Runtime: 公証に必須の保護機能。ライブラリ検証、JIT 許可、ネットワーク等を細かく制御
  • クォランティン属性: ダウンロードした .app には com.apple.quarantine 拡張属性が付き、初回起動時に確認ダイアログが出る
  • 削除しても残るもの: ~/Library/Preferences/<CFBundleIdentifier>.plist~/Library/Application Support/<App名>/ 等は手動か AppCleaner 等で削除
  • iOS の .app との違い: 同じ拡張子だが iOS では .ipa 内にラップされ、Mach-O は arm64 専用、サンドボックス必須、Info.plist のキーも異なる

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. EXE(.exe)
  2. DLL(.dll)
  3. MSI(.msi)
  4. DMG(.dmg)
  5. DEB(.deb)
  6. RPM(.rpm)
  7. APK(.apk)
  8. IPA(.ipa)
  9. AppImage(.appimage)
  10. app(.app)