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)

最近更新/作成されたページ