ios-app-store-submission
npx skills add https://github.com/kimny1143/claude-code-template --skill ios-app-store-submission
Agent 安装分布
Skill 文档
iOS App Store Submission
You are an expert in iOS app submission, Apple review guidelines, and build automation. Your goal is to guide users through the entire submission process efficiently, avoiding common pitfalls and rejections.
Core Philosophy
App Store submission is not just about uploading a binary. It’s about:
- Meeting Apple’s technical and content requirements
- Providing accurate metadata and privacy disclosures
- Preparing for potential review questions
- Automating the process for fast iteration
Quick Reference: Build Methods
| æ¹æ³ | æè¦æé | ãã¤ä½¿ã |
|---|---|---|
| CLI Local (æ¨å¥¨) | 10-15å | æéããã¼ã«ã«ã§Archiveâç´æ¥ã¢ãããã¼ã |
| Xcode GUI | 10-15å | CLIã«æ £ãã¦ããªãå ´å |
| EAS Build | 15-30å+ãã¥ã¼ | CI/CDããã¼ã éçºãFree tierã¯ãã¥ã¼å¾ ã¡ãã |
â ï¸ Known Issues Prevention (ãã«ãåã«å¿ ã確èª)
éå»ã®ãªã¸ã§ã¯ãäºä¾ããå¦ãã ããã«ãåã«å¿ ã確èªãã¹ãé ç®ã
1. Provider ã§ null ãè¿ããªã
åé¡: ThemeProviderçãAsyncStorageèªã¿è¾¼ã¿ä¸ã«nullãè¿ãã¨ãå¯©æ»æã«ãé»ãç»é¢ãã§ãªã¸ã§ã¯ãã
ç¢ºèªæ¹æ³:
grep -r "return null" src/providers/
対å¦: ãã¼ãã£ã³ã°UIãè¿ã
// NG
if (!isLoaded) return null;
// OK
if (!isLoaded) {
return (
<View style={{ flex: 1, backgroundColor: '#1a1a2e', justifyContent: 'center', alignItems: 'center' }}>
<ActivityIndicator size="large" color="#059669" />
</View>
);
}
2. ATT ãã©ã°ã¤ã³è¨å®
åé¡: expo-tracking-transparencyããã¢æååã§è¨å®ããã¨ãATTãã¤ã¢ãã°ã表示ãããªãã
ç¢ºèªæ¹æ³:
# app.json確èª
grep -A5 "expo-tracking-transparency" app.json
# prebuildå¾ã®Info.plist確èª
npx expo prebuild --clean
grep -A1 "NSUserTrackingUsageDescription" ios/*/Info.plist
æ£ããè¨å®:
[
"expo-tracking-transparency",
{
"userTrackingPermission": "This identifier will be used to deliver personalized ads to you."
}
]
3. UIRequiredDeviceCapabilities ã« telephony ãå ¥ããªã
åé¡: telephonyãè¨å®ããã¨ãMac Apple silicon / Vision Pro ã§è¦åãåºãã
ç¢ºèªæ¹æ³:
grep -r "telephony" app.json
grep -r "UIRequiredDeviceCapabilities" ios/*/Info.plist
対å¦: iPhoneã®ã¿å¯¾å¿ã¯ supportsTablet: false ã§ååãtelephonyã¯ä¸è¦ã
4. ãã«ãåæ¤è¨¼ã³ãã³ã
# å
¨ãã§ãã¯ã䏿¬å®è¡
echo "=== Provider null check ===" && grep -r "return null" src/providers/ 2>/dev/null || echo "OK"
echo "=== ATT config check ===" && grep -A5 "expo-tracking-transparency" app.json
echo "=== telephony check ===" && grep -r "telephony" app.json 2>/dev/null || echo "OK"
Phase 1: Initial Setup (One-time)
1.1 App-specific Password
CLIã§ã¢ãããã¼ãããããã«å¿ è¦ãä¸åº¦ä½æããã°å ¨ã¢ããªã§ä½¿ãåãå¯è½ã
- https://appleid.apple.com ã«ã¢ã¯ã»ã¹
- ãµã¤ã³ã¤ã³ â ãµã¤ã³ã¤ã³ã¨ã»ãã¥ãªã㣠â ã¢ããªç¨ãã¹ã¯ã¼ã
- + â ã©ãã«å
¥åï¼ä¾:
mued-appsï¼â 使 - ãã¹ã¯ã¼ããã³ãã¼ï¼
xxxx-xxxx-xxxx-xxxxå½¢å¼ï¼ .env.localã«ä¿å:
# Apple ID app-specific password
APPLE_ID=your-apple-id@example.com
APP_PASSWORD=xxxx-xxxx-xxxx-xxxx
TEAM_ID=XXXXXXXXXX
1.2 ExportOptions.plist
ããã¸ã§ã¯ãã«ã¼ãã«ä½æ:
<?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>app-store-connect</string>
<key>teamID</key>
<string>YOUR_TEAM_ID</string>
<key>uploadSymbols</key>
<true/>
<key>destination</key>
<string>upload</string>
</dict>
</plist>
Phase 2: CLI Build & Upload (æ¨å¥¨)
2.1 Full CLI Workflow
# 1. Prebuildï¼ãã¤ãã£ãããã¸ã§ã¯ãçæï¼
npx expo prebuild --clean
# 2. Archive
xcodebuild -workspace ios/YourApp.xcworkspace \
-scheme YourApp \
-configuration Release \
-archivePath build/YourApp.xcarchive \
-destination "generic/platform=iOS" \
DEVELOPMENT_TEAM=YOUR_TEAM_ID \
CODE_SIGN_STYLE=Automatic \
-allowProvisioningUpdates \
archive
# 3. Export & Uploadï¼ä¸çºã§App Store Connectã¸ï¼
xcodebuild -exportArchive \
-archivePath build/YourApp.xcarchive \
-exportPath build \
-exportOptionsPlist ExportOptions.plist \
-allowProvisioningUpdates
2.2 ããããã¨ã©ã¼ã¨å¯¾å¦
| ã¨ã©ã¼ | åå | å¯¾å¦ |
|---|---|---|
No profiles found |
ãããã¸ã§ãã³ã°æªè¨å® | -allowProvisioningUpdates ã追å |
Signing requires development team |
ãã¼ã IDæªæå® | DEVELOPMENT_TEAM=XXXX ã追å |
No provider associated |
Apple IDæªèªè¨¼ | Xcode â Preferences â Accounts ã§èªè¨¼ |
2.3 Uploadå¾ã®ç¢ºèª
- App Store Connect ãéã
- My Apps â Your App â TestFlight
- ãã«ãããå¦çä¸ãâãå©ç¨å¯è½ãã«ãªãã¾ã§5-15åå¾ ã¤
- App Store ã¿ã â ãã«ãã鏿 â 審æ»ã«æåº
Phase 3: Xcode GUI Build (Alternative)
CLIãè¦æãªå ´åã®ä»£æ¿æé ã
# 1. Prebuild
npx expo prebuild --clean
# 2. Xcodeã§éã
open ios/YourApp.xcworkspace
Xcodeå ã®æä½
- Signing: Automatically manage signing â Team鏿
- Device: “Any iOS Device (arm64)” ã鏿
- Product â Archive
- Archiveã¦ã£ã³ã㦠â Distribute App
- App Store Connect â Upload
Phase 4: EAS Build (Cloud)
ãã¼ã éçºãCI/CDã§ä½¿ç¨ãFree tierã¯ãã¥ã¼å¾ ã¡ããï¼æ°ååãæ°æéï¼ã
# Build
eas build --platform ios --profile production
# Submit
eas submit --platform ios --latest
eas.json è¨å®
{
"cli": {
"version": ">= 16.0.0",
"appVersionSource": "remote"
},
"build": {
"production": {
"ios": {
"autoIncrement": "buildNumber"
}
}
},
"submit": {
"production": {
"ios": {
"appleId": "your-apple-id@example.com",
"ascAppId": "1234567890",
"appleTeamId": "XXXXXXXXXX"
}
}
}
}
Phase 5: App Store Connect Setup
5.1 App Information
| Field | Requirements |
|---|---|
| Name | 30 chars max, unique on App Store |
| Subtitle | 30 chars max, optional |
| Category | Primary + optional secondary |
| Age Rating | Complete questionnaire |
5.2 App Privacy (Critical!)
App Store Connect â App Privacy â Get Started
AdMobä½¿ç¨æã®å®£è¨:
| Data Type | Collected | Linked | Tracking |
|---|---|---|---|
| Device ID | Yes | Yes | Yes (if ATT granted) |
| Product Interaction | Yes | No | No |
| Advertising Data | Yes | Yes | Yes |
| Crash Data | Yes | No | No |
5.3 Screenshots
| Device | Size (pixels) | Required |
|---|---|---|
| 6.7″ iPhone | 1290 x 2796 | Yes |
| 6.5″ iPhone | 1284 x 2778 | Yes |
| 12.9″ iPad Pro | 2048 x 2732 | If supports iPad |
Phase 6: Privacy Requirements
6.1 App Tracking Transparency (ATT)
AdMobçã®åºåSDKã使ãå ´åã¯å¿ é ã
app.jsonè¨å®ï¼ãã©ã°ã¤ã³çµç±ãæ¨å¥¨ï¼:
{
"plugins": [
[
"expo-tracking-transparency",
{
"userTrackingPermission": "This identifier will be used to deliver personalized ads to you."
}
]
]
}
â ï¸ æ³¨æ: infoPlistã«ç´æ¥æ¸ãã®ã§ã¯ãªãããã©ã°ã¤ã³è¨å®ã使ããprebuildæã«Info.plistã«æ£ããåæ ãããã
ã³ã¼ãå®è£ :
import { requestTrackingPermissionsAsync } from 'expo-tracking-transparency';
async function requestTracking() {
const { status } = await requestTrackingPermissionsAsync();
// 'granted' | 'denied' | 'undetermined'
}
6.2 ATTè¨å®ã®æ¤è¨¼
npx expo prebuild --clean
grep -A1 "NSUserTrackingUsageDescription" ios/YourApp/Info.plist
Phase 7: App Review
7.1 Review Timeline
| Type | Typical Duration |
|---|---|
| New App | 24-48 hours |
| Update | 24 hours |
| Expedited Review | 24 hours (request required) |
7.2 Common Rejection Reasons & Fixes
1. Guideline 2.1 – App Completeness
“Your app crashed during review” / “Black screen on launch”
åå :
- Providerï¼ThemeProviderçï¼ããã¼ãã£ã³ã°ä¸ã«
nullãè¿ãã¦ãã - AsyncStorageèªã¿è¾¼ã¿ä¸ã«ç»é¢ãçã£é»
Fix:
// Before (NG)
if (!isLoaded) {
return null;
}
// After (OK)
if (!isLoaded) {
return (
<View style={{ flex: 1, backgroundColor: '#1a1a2e', justifyContent: 'center', alignItems: 'center' }}>
<ActivityIndicator size="large" color="#059669" />
</View>
);
}
2. Guideline 5.1.2 – ATT Not Shown
“App doesn’t show ATT dialog”
åå :
expo-tracking-transparencyããã¢æååã§ãã©ã°ã¤ã³è¨å®ããã¦ããNSUserTrackingUsageDescriptionãInfo.plistã«å«ã¾ãã¦ããªã
Fix:
// Before (NG)
"plugins": ["expo-tracking-transparency"]
// After (OK)
"plugins": [
[
"expo-tracking-transparency",
{
"userTrackingPermission": "This identifier will be used to deliver personalized ads to you."
}
]
]
3. Guideline 2.3 – Accurate Metadata
“Screenshots don’t match app functionality”
Fix:
- ã¹ã¯ãªã¼ã³ã·ã§ãããææ°çã«æ´æ°
- åå¨ããªãæ©è½ã表示ããªã
7.3 Responding to Rejection
- Resolution Centerã§è¿ä¿¡ (App Store Connect â Your App â Resolution Center)
- ä¿®æ£å 容ãå ·ä½çã«èª¬æ
- åãã«ãâåã¢ãããã¼ãâåæåº
7.4 Resolution Center ã³ã¡ã³ããã³ãã¬ã¼ã
審æ»å¡ã«ä¿®æ£å 容ãä¼ããã³ã¡ã³ããè±èªã§ãå ·ä½çã«æ¸ãã
Black Screen / Crash ä¿®æ£æ
We have addressed the issue identified in the previous review:
**[Issue description] (fixed)**
- Root cause: [Technical explanation of what was wrong]
- Fix: [What was changed]
- File changed: [File path]
Build [N] contains this fix. Thank you for your review.
ATT Not Shown ä¿®æ£æ
We have addressed the ATT (App Tracking Transparency) issue:
**ATT dialog not shown (fixed)**
- Root cause: `expo-tracking-transparency` was configured as a bare string, causing `NSUserTrackingUsageDescription` to not be included in Info.plist
- Fix: Changed plugin configuration to include `userTrackingPermission` parameter
- Verified: Confirmed the description is now present in Info.plist via prebuild
Build [N] contains this fix. Thank you for your review.
UIRequiredDeviceCapabilities è¦åä¿®æ£æ
We have addressed the compatibility warning:
**Mac/Vision Pro compatibility (fixed)**
- Removed `UIRequiredDeviceCapabilities: ["telephony"]` from Info.plist
- The app targets iPhone only via `supportsTablet: false` setting
Build [N] contains this fix. Thank you for your review.
ãã¤ã³ã:
- ä½ãåé¡ã ã£ããï¼Root causeï¼
- ä½ã夿´ãããï¼Fixï¼
- ã©ã®ãã«ãã«å«ã¾ãã¦ãããï¼Build Nï¼
- ç°¡æ½ã«ãæè¡çã«æ£ç¢ºã«
7.5 Requesting Expedited Review
ç·æ¥æã®ã¿:
- App Store Connect â Your App â App Review
- Contact Us â Request Expedited Review
- çç±ãæç¢ºã«èª¬æ
Checklist: Pre-Submission
Technical
-
ExportOptions.plist使æ¸ã¿ -
app.jsonã®bundleIdentifier,versionè¨å®æ¸ã¿ - ATTãã©ã°ã¤ã³è¨å®æ¸ã¿ï¼åºåä½¿ç¨æï¼
- ãã¼ãã£ã³ã°ç¶æ
ã§UIã表示ï¼
nullãè¿ããªãï¼ - 宿©ã§ãã¹ãæ¸ã¿
App Store Connect
- App Privacy è¨å®æ¸ã¿
- Screenshots ã¢ãããã¼ãæ¸ã¿
- Description, Keywords è¨å®æ¸ã¿
- Support URL è¨å®æ¸ã¿
Quick Commands Reference
# === CLI Build (æ¨å¥¨) ===
npx expo prebuild --clean
xcodebuild -workspace ios/App.xcworkspace -scheme App -configuration Release \
-archivePath build/App.xcarchive -destination "generic/platform=iOS" \
DEVELOPMENT_TEAM=XXXX CODE_SIGN_STYLE=Automatic -allowProvisioningUpdates archive
xcodebuild -exportArchive -archivePath build/App.xcarchive -exportPath build \
-exportOptionsPlist ExportOptions.plist -allowProvisioningUpdates
# === EAS Build ===
eas build --platform ios --profile production
eas submit --platform ios --latest
# === Debugging ===
grep -A1 "NSUserTrackingUsageDescription" ios/App/Info.plist # ATT確èª
eas build:view BUILD_ID --json # ãã«ãã¹ãã¼ã¿ã¹ç¢ºèª
Related Skills
- android-play-store-submission: Google Play Store submission
- launch-strategy: App launch planning
- marketing-psychology: App Store optimization (ASO)