タイトル: ファイルの役割一覧
SEOタイトル: 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.swift | UIKit | アプリのライフサイクル (起動 / 終了 / 通知) |
SceneDelegate.swift | UIKit (iOS 13+) | シーン (Window 単位) のライフサイクル |
MyAppApp.swift | SwiftUI | @main 付きのエントリ |
main.swift | macOS | 従来の 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 ファイル:
| キー | 意味 |
CFBundleIdentifier | Bundle ID (com.example.myapp) |
CFBundleVersion | ビルド番号 |
CFBundleShortVersionString | 表示バージョン (1.0.0) |
UILaunchStoryboardName | 起動画面の Storyboard |
UISupportedInterfaceOrientations | 対応する画面向き |
NSCameraUsageDescription | カメラ利用の説明 (権限ダイアログ) |
NSLocationWhenInUseUsageDescription | 位置情報利用の説明 |
NSAppTransportSecurity | HTTPS 強制設定 |
LSApplicationQueriesSchemes | 外部アプリ起動の許可リスト |
CFBundleIdentifier
com.example.myapp
CFBundleVersion
1
CFBundleShortVersionString
1.0.0
NSCameraUsageDescription
QR コード読み取りに使用します
4. UI 関連
| ファイル | 役割 |
Main.storyboard | UIKit の UI レイアウト (ビジュアルエディタ) |
LaunchScreen.storyboard | 起動画面 (静止画推奨) |
ContentView.swift | SwiftUI のビュー |
ViewController.swift | UIKit のビューコントローラ |
*.xib | 個別 View レイアウト (古い) |
5. リソース
| ファイル | 役割 |
Assets.xcassets | 画像 / アプリアイコン / カラー / シンボル |
AppIcon.appiconset | アプリアイコン (各サイズ) |
AccentColor.colorset | アクセントカラー |
Localizable.strings | 多言語化文字列 |
InfoPlist.strings | Info.plist の多言語化 |
6. パッケージ管理
| ツール | 主要ファイル | 説明 |
| Swift Package Manager | Package.swift / Package.resolved | Apple 純正、Xcode 統合 |
| CocoaPods | Podfile / Podfile.lock / Pods/ | 古参、依然多数のライブラリ対応 |
| Carthage | Cartfile / Cartfile.resolved | Apple 純正でないが軽量 |
# 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. 配布・署名
| ファイル | 役割 |
*.entitlements | App 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 は必ずコミット。