Skip to content

iOS App Store リリースの実務チェックとハマりどころ

hi-yu の v1.0 リリース準備(2026-07-02)で実地確認した知見。

xcodebuild Archive → Export

bash
xcodebuild -project App.xcodeproj -scheme App -destination 'generic/platform=iOS' \
  -archivePath build/App.xcarchive archive -allowProvisioningUpdates
xcodebuild -exportArchive -archivePath build/App.xcarchive \
  -exportOptionsPlist build/ExportOptions.plist \
  -exportPath build/export -allowProvisioningUpdates
  • フラグは -exportOptionsPlist-exportOptionsPath は存在せず、xcodebuild は 「invalid option」を出した後に大量のヘルプを吐くので、エラー本文は head で先頭を見る。
  • ExportOptions.plist の最小構成: method=app-store-connect / teamID / uploadSymbols

aps-environment の見え方(混乱ポイント)

  • Archive 内の .app は開発署名なので aps-environment=development と表示されて正常。 app-store-connect method の Export で再署名され、IPA では production になる。
  • 検証方法: IPA を unzip → codesign -d --entitlements :- Payload/App.app | plutil -p -
  • entitlements の aps-environment: $(APS_ENVIRONMENT) + xcconfig の構成別値 (Debug=development / Release=production)で出し分けても、最終値は配布プロファイル側で決まる。

リリース前に見落としやすいコード側チェック

  • feature flag の既定値: 「既定 Mock・DEBUG トグルで CloudKit に切替」のような開発向け既定は、 Release で必ず本物になるよう #if DEBUG で分岐した判定関数に集約する (hi-yu では既定 Mock のままリリース寸前だった)。flag を読む箇所が複数あると漏れるので1関数に。
  • デモパネル等の開発 UI が #if DEBUG 限定か。
  • ITSAppUsesNonExemptEncryption=false(HTTPS のみなら)で輸出質問を省略。
  • PrivacyInfo.xcprivacy と NSE(appex)が IPA に同梱されているか unzip -l で確認。

審査対策(ペア型・位置情報アプリ)

  • 2台×別 iCloud が必須の体験は審査員が再現できない → 審査メモに明記+デモ動画 URL 添付。
  • 位置収集アプリはプライバシーポリシー URL 必須。「正確な位置は見せない」「サーバレス (CloudKit のみ・運営者はアクセス不可)」は明記すると通りやすい。
  • Always 位置権限は理由(背景で気配を届ける・SLC で低消費)を審査メモに書く。
  • IAP がある場合: Paid Apps 契約+銀行/税務、IAP 自体にも審査用スクショが必要。App と同時提出。

CloudKit Production スキーマ

  • TestFlight/App Store ビルドは Production 環境を見る。dev で自動生成されたスキーマは Dashboard の Deploy 必須(cktool は development 専用)。
  • 独自フィールドの無い空レコード型は Production へ昇格不可(ダミーの TIMESTAMP 等を足す)。