3.

Xcode プロジェクトのファイル構成と役割完全ガイド

編集
この記事の要点
  • .xcodeproj = プロジェクトファイル (Xcode で開くやつ)。実体はディレクトリで中に project.pbxproj が入る
  • .xcworkspace = 複数プロジェクトをまとめる入れ物。CocoaPods 使用時はこちらを開く
  • Info.plist = アプリ情報 (Bundle ID / バージョン / 権限) を XML で持つ
  • AppDelegate.swift = アプリのライフサイクルエントリポイント。Main.storyboard = UI レイアウト、Assets.xcassets = 画像/色
  • パッケージ管理: Package.resolved (SwiftPM) / Podfile (CocoaPods) / Cartfile (Carthage)

典型的なディレクトリ構成

MyApp/
├── MyApp.xcodeproj/                # プロジェクトファイル
│   ├── project.pbxproj             #   実体 (テキスト、Git 管理対象)
│   ├── xcuserdata/                 #   ユーザ別設定 (Git 除外)
│   └── project.xcworkspace/
├── MyApp.xcworkspace/              # ワークスペース (Pod 利用時)
├── MyApp/
│   ├── AppDelegate.swift           # アプリエントリポイント (UIKit)
│   ├── SceneDelegate.swift         # シーン管理 (iOS 13+)
│   ├── MyAppApp.swift              # SwiftUI のエントリポイント
│   ├── ContentView.swift           # SwiftUI ビュー
│   ├── ViewController.swift        # UIKit のビュー
│   ├── Main.storyboard             # UI レイアウト (UIKit)
│   ├── LaunchScreen.storyboard     # 起動画面
│   ├── Assets.xcassets/            # 画像 / カラー / アイコン
│   ├── Info.plist                  # アプリ設定
│   └── MyApp.entitlements          # 権限設定
├── MyAppTests/                     # 単体テスト
│   └── MyAppTests.swift
├── MyAppUITests/                   # UI テスト
│   └── MyAppUITests.swift
├── Package.swift                   # SwiftPM パッケージ定義
├── Package.resolved                # 依存バージョンロック
├── Podfile                         # CocoaPods 定義
├── Podfile.lock                    # CocoaPods バージョン
├── Pods/                           # CocoaPods 依存ライブラリ
├── .gitignore
└── README.md

1. プロジェクト / ワークスペース

ファイル / ディレクトリ役割Git
.xcodeprojプロジェクト本体 (バンドル形式)
.xcodeproj/project.pbxprojプロジェクト構造の実体 (テキスト)○ (コンフリクト多発)
.xcodeproj/xcuserdata/ユーザ固有の UI 状態× (gitignore)
.xcodeproj/xcshareddata/共有スキーム
.xcworkspace複数プロジェクトの入れ物△ (Pod 等)

重要: CocoaPods を使うプロジェクトでは .xcworkspace のほうを開く。.xcodeproj を開くと Pod ライブラリがリンクされません。

2. アプリエントリポイント

ファイルUI フレームワーク役割
AppDelegate.swiftUIKitアプリのライフサイクル (起動 / 終了 / 通知)
SceneDelegate.swiftUIKit (iOS 13+)シーン (Window 単位) のライフサイクル
MyAppApp.swiftSwiftUI@main 付きのエントリ
main.swiftmacOS従来の main 関数 (任意)
// AppDelegate.swift (UIKit)
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: ...) -> Bool {
        return true
    }
}

// MyAppApp.swift (SwiftUI)
import SwiftUI

@main
struct MyAppApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

3. Info.plist — アプリ設定

アプリのメタ情報をすべて持つ XML ファイル:

キー意味
CFBundleIdentifierBundle ID (com.example.myapp)
CFBundleVersionビルド番号
CFBundleShortVersionString表示バージョン (1.0.0)
UILaunchStoryboardName起動画面の Storyboard
UISupportedInterfaceOrientations対応する画面向き
NSCameraUsageDescriptionカメラ利用の説明 (権限ダイアログ)
NSLocationWhenInUseUsageDescription位置情報利用の説明
NSAppTransportSecurityHTTPS 強制設定
LSApplicationQueriesSchemes外部アプリ起動の許可リスト

CFBundleIdentifier
com.example.myapp
CFBundleVersion
1
CFBundleShortVersionString
1.0.0
NSCameraUsageDescription
QR コード読み取りに使用します

4. UI 関連

ファイル役割
Main.storyboardUIKit の UI レイアウト (ビジュアルエディタ)
LaunchScreen.storyboard起動画面 (静止画推奨)
ContentView.swiftSwiftUI のビュー
ViewController.swiftUIKit のビューコントローラ
*.xib個別 View レイアウト (古い)

5. リソース

ファイル役割
Assets.xcassets画像 / アプリアイコン / カラー / シンボル
AppIcon.appiconsetアプリアイコン (各サイズ)
AccentColor.colorsetアクセントカラー
Localizable.strings多言語化文字列
InfoPlist.stringsInfo.plist の多言語化

6. パッケージ管理

ツール主要ファイル説明
Swift Package ManagerPackage.swift / Package.resolvedApple 純正、Xcode 統合
CocoaPodsPodfile / Podfile.lock / Pods/古参、依然多数のライブラリ対応
CarthageCartfile / Cartfile.resolvedApple 純正でないが軽量
# Podfile の例
platform :ios, '15.0'
use_frameworks!

target 'MyApp' do
  pod 'Alamofire', '~> 5.6'
  pod 'SnapKit'
  pod 'RxSwift', '~> 6.0'
end
// Package.swift の例
// swift-tools-version:5.7
import PackageDescription

let package = Package(
    name: "MyLib",
    products: [
        .library(name: "MyLib", targets: ["MyLib"]),
    ],
    dependencies: [
        .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.6.0"),
    ],
    targets: [
        .target(name: "MyLib", dependencies: ["Alamofire"]),
    ]
)

7. 配布・署名

ファイル役割
*.entitlementsApp Sandbox / Push / iCloud 等の権限
*.mobileprovisionプロビジョニングプロファイル
*.cer / *.p12署名証明書
*.xcconfigビルド設定 (Debug / Release 別)

8. テスト

ディレクトリ役割
MyAppTests/単体テスト (XCTest)
MyAppUITests/UI テスト (XCUITest)

9. .gitignore の典型

# Xcode
*.xcuserstate
*.xcuserdata/
xcuserdata/
DerivedData/

# CocoaPods (チームによっては Pods/ をコミットする派閥もある)
# Pods/

# Carthage
Carthage/Build/

# SwiftPM
.swiftpm/
.build/

# macOS
.DS_Store

# Fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/
fastlane/test_output/

FAQ

Q: project.pbxproj のマージコンフリクト多発
A: git config merge.union 設定や XcodeGen / Tuist でプロジェクトをテキスト定義から生成するアプローチで回避。

Q: Info.plist がプロジェクトに無い
A: Xcode 13+ は Info.plist をビルド設定に統合。「Build Settings → Info.plist Values」で編集。

Q: Pods/ をコミットするべき?
A: チームポリシー次第。コミット派 = CI が速い / 確実。非コミット派 = リポジトリが軽い。Podfile.lock は必ずコミット。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. マップの追加方法
  2. テンプレートの種類一覧
  3. ファイルの役割一覧
  4. シミュレーターの画面の拡大/縮小をする方法
  5. スライダーの作成とカスタマイズ
  6. ボタンの作成とプログラムと連携
  7. ラベルの作成とプログラムと連携
  8. 【Xcode/Swift】ImageViewのContentMode一覧
  9. エラー一覧
  10. アプリを実機で起動させる方法
  11. ツールバーの設置とボタンの追加
  12. 画像の追加