Contents
前提条件と開発環境の整備
このセクションでは、SwiftUI macOS アプリをビルド・公証・配布するために最低限必要なツールチェーンと OS の要件を確認します。正しい環境が揃っていないと、署名エラーや Gatekeeper によるブロックが頻発し、リリース作業が大幅に遅延します。
Xcode のインストールと Command Line Tools の設定
Xcode と同梱されているコマンドラインツールは、Swift コンパイラ・codesign・notarytool などの実行基盤です。以下の手順で最新版を取得し、使用するバージョンを明示的に指定します。
- 入手方法
- App Store → 「Xcode」検索 → ダウンロード(最新の安定版)
-
または Apple Developer のダウンロードページからベータ版や過去バージョンも取得可能です。
-
Command Line Tools の選択
bash
# Xcode がインストールされたら、CLI ツールを確認・設定
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcode-select --install # 必要に応じて再インストール
- バージョン確認
bash
xcodebuild -version # 例: Xcode 15.2 (15C502)
swiftc --version # Swift コンパイラのバージョンも同時に表示
ポイント:
xcode-selectが指すディレクトリは、ビルドや notarization の際に使用される唯一の基準になります。複数台で作業する場合は必ず統一してください。
macOS SDK と Deployment Target の設定
SwiftUI は macOS 11.0 (Big Sur) 以降で利用可能ですが、最新 Xcode がデフォルトで提供する SDK(例:macOS 14 Sonoma)は新機能の検証に必須です。実際に配布したい最小バージョンは「Deployment Target」で明示します。
- 開発マシン:macOS 13.5 以上が推奨(Xcode が正常に動作する最低要件)。
- 対象 OS:
Project > Info > Deployment Targetを11.0に設定すれば、Big Sur 以降の全ユーザーが利用可能です。
注意:Deployment Target はビルド時に埋め込まれるため、後から変更できません。プロジェクト開始時点で最小サポートバージョンを確定しましょう。
SwiftUI の基礎構文とプレビュー活用
SwiftUI では宣言的に UI を記述し、Xcode のライブプレビューで即座に結果を確認できます。以下は 2 カラムレイアウトの最小サンプルです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import SwiftUI struct ContentView: View { var body: some View { HStack { List(0..<10) { i in Text("Item \\(i)") } .frame(minWidth: 150) Divider() VStack(alignment: .leading) { Text("詳細情報") .font(.title) Spacer() } .padding() } } } |
- ポイント:
@Stateや@ObservedObjectを使うとデータ駆動の UI がシンプルに実装できます。 - プレビュー起動:エディタ左上の「Resume」ボタンで即座に macOS のウィンドウが表示され、コード変更をリアルタイムで確認可能です。
Apple Developer アカウント取得と署名設定
App Store への公開・公証には有料の Apple Developer Program が必須です。以下ではアカウント取得から Xcode での自動署名設定まで、実務で必要な手順を網羅します。
Developer Program への加入手順と公式情報
- 公式サイト https://developer.apple.com/programs/ にアクセスし、「Enroll」ボタンをクリック。
- 個人または法人のいずれかを選択し、Apple ID と支払い情報(年額 99 USD)を入力。
- メールで送られる承認リンクを開き、手続き完了まで待ちます。(通常数日以内)
Developer ID と Development 証明書の作成
macOS アプリの公証・配布には次の 2 種類が必要です。
| 証明書種別 | 用途 | 発行先 |
|---|---|---|
| Developer ID Application | App Store 以外での配布(Gatekeeper 判定を通過) | Apple Developer → Certificates > Production |
| Mac Development | 開発・テストビルド用 | Apple Developer → Certificates > Development |
証明書作成手順
- キーチェーンアクセスで「証明書アシスタント」→「認証局へ証明書要求」を選択し、メールアドレスと
Common Name(例:Your Name (TeamID))を入力。CSR ファイルを保存します。 - Apple Developer ポータルの Certificates, Identifiers & Profiles → + → 対象証明書を選び、先ほど作成した CSR をアップロード。
- 発行された証明書が自動的にキーチェーンへインストールされることを確認(
loginキーホルダー内のCertificatesカテゴリ)。
ポイント:期限切れや名前変更がある場合は、必ず新しい証明書を再発行し、古いものは削除してください。
Xcode での自動署名とチーム設定
- プロジェクト → ターゲット → Signing & Capabilities を開く。
- 「Automatically manage signing」を ON にし、取得した Apple ID のチームを選択。
Provisioning Profileは Xcode が自動生成したものが表示されます(手動で管理する必要はありません)。
備考:
Developer ID Applicationを使用して直接配布する場合は「Manual signing」に切り替え、Export Options.plistでmethod = developer-idを明示します。
ビルド構成・App Store Connect 登録
この章では Bundle ID の作成から Release ビルドの最適化、App Store Connect への事前登録手順までを解説します。正しい設定がないとアップロード時に「Invalid bundle identifier」や「Missing signing certificate」エラーが頻発します。
Bundle Identifier と SKU の決め方
- Bundle ID は逆ドメイン形式(例:
com.example.MyApp)で、App Store では唯一無二です。 - SKU は内部管理用の文字列で、重複しないように日付やバージョンを組み合わせます(例:
MYAPP2026A01)。
手順
- App Store Connect にサインイン → My Apps → + → New App。
- 「Platform」欄で macOS を選択し、上記の Bundle ID と SKU を入力。
- 必要情報(App 名、プライマリ言語、価格帯)を設定し「Create」ボタンでアプリレコードを作成。
Release ビルドの構成と自動 Notarization 設定
- Xcode のメニューバー → Product > Scheme > Edit Scheme…
ArchiveとRunの両方で Build Configuration を Release に設定。- Signing & Capabilities タブで「Automatically manage signing」を ON、かつ Notarize(Xcode 15 以降の UI)を有効化します。
注意:
Notarizeのチェックは Xcode が内部的にxcrun notarytoolを呼び出すだけでなく、ビルド完了後に自動で Staple(ステープリング)も実行します。ただし手動プロセスが必要なケース(DMG/PKG 生成後の再公証など)では別途コマンドを使用してください。
手動 Notarization の完全フロー
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 1. アーカイブから .xcarchive を取得 xcodebuild -scheme MyApp -configuration Release archive \ -archivePath ./build/MyApp.xcarchive # 2. Export(Developer ID 用) → .pkg または .app が生成される xcodebuild -exportArchive \ -archivePath ./build/MyApp.xcarchive \ -exportOptionsPlist ExportOptions.plist \ -exportPath ./release # 3. Notarization (notarytool 推奨) xcrun notarytool submit ./release/MyApp.pkg \ --apple-id your@email.com \ --team-id <TeamID> \ --password @keychain:APP_SPECIFIC_PASSWORD \ --wait # 4. Staple(ステープリング)を付与 xcrun stapler staple ./release/MyApp.pkg |
notarytoolはaltoolの後継で高速かつ詳細なログが取得可能です。--waitオプションで非同期処理の完了まで待機し、成功・失敗を即座に判定できます。
公式コマンドリファレンス:https://developer.apple.com/documentation/xcode/notarytool
公証(Notarization)とベータテスト/審査の流れ
macOS アプリは Gatekeeper によって未署名・未公証アプリがブロックされます。ここでは Notarization の実行方法、エラー対処、TestFlight ベータ配布、App Store 審査時のチェックポイントをまとめます。
Notarization 実行と結果確認
- 自動:Xcode →
Archive→Distribute App→App Store Connectを選択すると、ビルド完了後に自動で公証が走ります。 - 手動(CI/CD 向け):
bash
# altool (旧方式) の例
xcrun altool --notarize-app \
-f MyApp.pkg \
-u your@email.com \
-p @keychain:APP_SPECIFIC_PASSWORD \
--output-format json
- 結果取得:
altoolは JSON を返し、notarytoolは標準出力に成功/失敗を示すメッセージを出します。さらにxcrun stapler staple <path>でステープリング済みか確認できます。
ログの取得方法
|
1 2 3 |
# notarization ID を取得したら、詳細ログをダウンロード xcrun notarytool log <REQUEST_ID> --output ./notarization.log |
- 失敗時はエラーメッセージに
Invalid signatureやMissing entitlementが含まれます。公式ドキュメントの「Common Notarization Errors」ページ(リンクあり)で原因と対策を確認してください。
よくあるエラーと具体的な対処例
| エラーメッセージ | 主な原因 | 解決策 |
|---|---|---|
Invalid signature |
証明書が期限切れ、またはバンドルに未署名ファイルが混在 | キーチェーンで Developer ID の有効期限を確認し、codesign --deep --force -s "Developer ID Application: …" で全ファイルを再署名 |
Missing entitlement |
必要な権限(例:com.apple.security.cs.allow-jit)がプロビジョニングに未設定 |
Signing & Capabilities に該当 Entitlement を追加、または --entitlements オプションで明示的に付与 |
File not found / Invalid bundle structure |
DMG/PKG にシンボリックリンクや隠しファイルが残存 | ditto -c -k --sequesterRsrc --keepParent MyApp.app MyApp.zip でクリーンなアーカイブを作成、または productbuild の --component オプションで正しいパス指定 |
TestFlight ベータテストの実施手順
macOS 向けでも TestFlight が利用可能です。ベータ版を配布して Gatekeeper 環境下での動作確認ができます。
- App Store Connect → 該当アプリ → TestFlight タブへ移動。
- 「+ New Build」→ アップロード済みの notarized ビルド(
.pkgまたは.app)を選択。 -
テスターメールまたは公開リンクを共有し、テスト開始。
-
ベータビルド番号は
CFBundleVersionをインクリメントしておくと、TestFlight が自動で差分検知します。 - フィードバック取得:TestFlight アプリ内の「Send Feedback」機能を有効にし、スクリーンショットやクラッシュレポートが自動送信されるよう設定。
App Store 提出時の最終チェックリスト
| 項目 | 必要性・ポイント |
|---|---|
| App 名・サブタイトル | 文字数制限とキーワードを意識し、検索エンジン最適化(ASO)を行う |
| スクリーンショット | macOS 14 (1440×900) 推奨サイズで最低 3 枚。実際の UI と一致させる |
| プライバシーポリシー | データ収集項目(例:Analytics、位置情報)を正確に記載 |
ビルド番号 (CFBundleVersion) |
1.0.0 (100) の形式で管理し、次回リリース時は必ずインクリメント |
| App Store Connect の「Prepare for Submission」項目 | すべて埋め終わったら「Submit for Review」ボタンをクリック |
- 審査通過のコツ:Apple が求める UI/UX ガイドライン(Human Interface Guidelines)に準拠しているか、機能説明が明確であるかを事前にレビュー。
- 公式ガイド:https://developer.apple.com/app-store/review/guidelines/
直接配布とリリース後のメンテナンス
App Store 以外でも macOS アプリは Developer ID 署名で安全に配布できます。また、リリース後のアップデート戦略を設計しておくことでユーザー体験が向上します。
Developer ID 署名によるエクスポート手順
xcodebuild -exportArchive に ExportOptions.plist を渡すと、Developer ID 用にサインされた .pkg または .app が生成されます。以下は最小構成の例です。
|
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>method</key><string>developer-id</string> <key>signingStyle</key><string>manual</string> <key>signingCertificate</key><string>Developer ID Application: Your Name (TeamID)</string> <key>teamID</key><string>TEAMID12345</string> </dict> </plist> |
|
1 2 3 4 5 |
xcodebuild -exportArchive \ -archivePath build/MyApp.xcarchive \ -exportOptionsPlist ExportOptions.plist \ -exportPath ./release |
- 生成された
MyApp.appは Developer ID が付与されているので、Gatekeeper の警告は出ません。
DMG と PKG パッケージの作成・再公証手順
DMG 作成(create-dmg)
|
1 2 3 4 5 6 7 |
brew install create-dmg # Homebrew がインストール済みであること create-dmg \ --window-size 600 400 \ --icon "MyApp.app" 200 190 \ MyApp.dmg ./release/MyApp.app |
PKG 作成(productbuild)
|
1 2 3 4 |
productbuild --component "./release/MyApp.app" "/Applications" \ --sign "Developer ID Installer: Your Name (TeamID)" \ MyApp.pkg |
再公証と Staple の実施
DMG/PKG は内部に署名済みバイナリを含むだけでなく、再度 Notarization する必要があります。手順は次の通りです。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# DMG の場合 xcrun notarytool submit MyApp.dmg \ --apple-id your@email.com \ --team-id TEAMID12345 \ --password @keychain:APP_SPECIFIC_PASSWORD \ --wait # PKG の場合も同様に実行 # 成功したら Staple xcrun stapler staple MyApp.dmg # または MyApp.pkg |
staplerが付与するステープル情報は、ユーザーがオフラインでも公証済みであることを確認できる鍵です。- 必ず Staple を実行しないと、配布後に Gatekeeper が「未署名」エラーを返すケースがあります。
エンドユーザー向けインストールガイド
| 手順 | 内容 |
|---|---|
| 1. ダウンロード | MyApp.dmg(または .pkg) を公式サイトから取得 |
| 2. DMG のマウント | ダブルクリックでマウントし、表示されたウィンドウを開く |
| 3. アプリの配置 | MyApp.app アイコンを /Applications フォルダーへドラッグ |
| 4. 初回起動時の例外設定 | 「開発元が未確認です」と出たら、アプリアイコンを Control キー+クリック → 「開く」 |
- ステップ3で Gatekeeper が自動的にステープル情報を参照 し、警告が表示されないことを明記すると安心感が得られます。
アップデート戦略とバージョン管理
バージョニング規則
- 形式:
MAJOR.MINOR.PATCH (BUILD)(例:1.2.3 (102)) CFBundleShortVersionString→MAJOR.MINOR.PATCHCFBundleVersion→ ビルド番号(整数)
Git タグと連携させる例:
|
1 2 3 |
git tag -a v1.2.0 -m "Add new filter feature" git push origin --tags |
自動更新フレームワークの選択
| フレームワーク | 特徴 |
|---|---|
| Sparkle (オープンソース) | macOS 向けに実績があり、XML フィードでバージョン管理。署名済みバイナリを自動ダウンロード・インストール |
| App Store の自動更新 | App Store Connect が提供する標準機能。ユーザーは手動操作不要 |
CI/CD パイプライン例(GitHub Actions)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
name: Build & Notarize on: push: tags: - 'v*' jobs: build: runs-on: macos-14 steps: - uses: actions/checkout@v4 - name: Set up Xcode run: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer - name: Build Archive run: | xcodebuild -scheme MyApp -configuration Release archive \ -archivePath ${{ runner.temp }}/MyApp.xcarchive - name: Export Package (Developer ID) run: | xcodebuild -exportArchive \ -archivePath ${{ runner.temp }}/MyApp.xcarchive \ -exportOptionsPlist ExportOptions.plist \ -exportPath ./release - name: Notarize with notarytool env: APPLE_ID: ${{ secrets.APPLE_ID }} TEAM_ID: ${{ secrets.TEAM_ID }} PASSWORD: ${{ secrets.APP_SPECIFIC_PASSWORD }} run: | xcrun notarytool submit ./release/MyApp.pkg \ --apple-id "$APPLE_ID" \ --team-id "$TEAM_ID" \ --password "$PASSWORD" \ --wait - name: Staple run: xcrun stapler staple ./release/MyApp.pkg - name: Upload Artifact uses: actions/upload-artifact@v3 with: name: MyApp-pkg path: ./release/MyApp.pkg |
- 上記はタグプッシュ時に自動ビルド・公証・ステープリングまで行い、完成した
.pkgを GitHub のアーティファクトとして保存する例です。 notarytoolとstaplerが組み込まれているため、手作業でのミスが減ります。
まとめ
- 環境整備:最新 Xcode と macOS SDK をインストールし、
xcode-selectで CLI ツールを固定。 - 署名資材:Developer ID Application/Mac Development 証明書を作成し、Xcode の自動署名に紐付ける。
- ビルド構成:Release ビルド+自動 Notarization を有効化し、手動
notarytool/staplerフローも備えておく。 - 公証:
notarytool submit … --waitで非同期処理を待ち、必ず Staple を付与して配布パッケージを完成させる。 - 配布:App Store Connect(TestFlight・審査)または Developer ID 署名+DMG/PKG の直接配布のいずれかを選択し、ユーザー向けインストール手順を明示する。
- メンテナンス:Git タグでバージョン管理し、Sparkle や App Store 自動更新で継続的にアップデートできる体制を構築。
これらの手順とベストプラクティスを守れば、SwiftUI で作成した macOS アプリは 安全かつスムーズに公証・配布 が可能です。開発からリリースまで一貫したフローを自動化すれば、将来的なバージョンアップや新しい Xcode/macOS が登場しても、同様のプロセスで対応できる柔軟性が得られます。