Appearance
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 等を足す)。