$npx -y skills add greenstevester/fastlane-skill --skill releaseSubmit iOS app to App Store for review
| 1 | ## App Store Production Release |
| 2 | |
| 3 | Submit the iOS app to App Store Connect for review and release. |
| 4 | |
| 5 | ### Pre-flight Checks |
| 6 | - Fastlane installed: !`fastlane --version 2>/dev/null | grep "fastlane " | head -1 || echo "✗ Not installed - run: brew install fastlane"` |
| 7 | - Fastfile exists: !`ls fastlane/Fastfile 2>/dev/null && echo "✓ Found" || echo "✗ Not found - run /setup-fastlane first"` |
| 8 | - App-specific password: !`[ -n "$FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD" ] && echo "✓ Set" || echo "⚠️ Not set - export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD='xxxx-xxxx-xxxx-xxxx'"` |
| 9 | |
| 10 | ### Arguments: ${ARGUMENTS:-none} |
| 11 | |
| 12 | --- |
| 13 | |
| 14 | ## What This Does |
| 15 | |
| 16 | ### `fastlane release` (Submit Existing Build) |
| 17 | 1. **Selects latest TestFlight build** already uploaded |
| 18 | 2. **Submits for App Store review** |
| 19 | 3. Ideal when you've already tested a beta build |
| 20 | |
| 21 | ### `fastlane release_full` (Full Pipeline) |
| 22 | 1. **Syncs certificates** via Match (appstore type) — *only once you've run the `match` skill; the base `setup-fastlane` lane skips this* |
| 23 | 2. **Bumps version number** (if `version:` provided) |
| 24 | 3. **Increments build number** |
| 25 | 4. **Builds release archive** with gym |
| 26 | 5. **Uploads to App Store Connect** |
| 27 | 6. **Submits for review** |
| 28 | 7. **Auto-releases after approval** (if `auto_release:true`) |
| 29 | |
| 30 | > **Scope:** `release` / `release_full` upload the **binary + app-level metadata/screenshots**. |
| 31 | > They do **not** upload **in-app-purchase / subscription assets** (per-IAP *Review |
| 32 | > Information → Screenshot*, 1024² *Image (Optional)* promos) — those are managed by hand |
| 33 | > in App Store Connect. See the `snapshot` skill for screenshot upload details |
| 34 | > (`deliver` layout, RGB/no-alpha, what it does and doesn't cover). |
| 35 | |
| 36 | --- |
| 37 | |
| 38 | ## Commands |
| 39 | |
| 40 | ### Submit Existing TestFlight Build |
| 41 | Run from your project directory (where `fastlane/` lives): |
| 42 | ```bash |
| 43 | fastlane release |
| 44 | ``` |
| 45 | |
| 46 | ### Full Release with Version Bump |
| 47 | ```bash |
| 48 | fastlane release_full version:"1.1.0" |
| 49 | ``` |
| 50 | |
| 51 | ### Full Release with Auto-Release |
| 52 | ```bash |
| 53 | fastlane release_full version:"1.2.0" auto_release:true |
| 54 | ``` |
| 55 | This will automatically release to the App Store once Apple approves the build. |
| 56 | |
| 57 | --- |
| 58 | |
| 59 | ## Workflow Recommendation |
| 60 | |
| 61 | 1. **Test first**: Run `fastlane beta` to upload to TestFlight |
| 62 | 2. **Verify in TestFlight**: Ensure the build works correctly |
| 63 | 3. **Submit for review**: Run `fastlane release` to submit the tested build |
| 64 | 4. **Or full pipeline**: Use `fastlane release_full` for a fresh build + submit |
| 65 | |
| 66 | --- |
| 67 | |
| 68 | ## Troubleshooting |
| 69 | |
| 70 | ### "No value found for 'username'" |
| 71 | Set your Apple ID in `fastlane/Appfile`: |
| 72 | ```ruby |
| 73 | apple_id("your@email.com") |
| 74 | ``` |
| 75 | |
| 76 | ### "Please sign in with an app-specific password" |
| 77 | 1. Go to https://account.apple.com → Sign-In & Security → App-Specific Passwords |
| 78 | 2. Generate a password named "Fastlane" |
| 79 | 3. Export it: |
| 80 | ```bash |
| 81 | export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD='xxxx-xxxx-xxxx-xxxx' |
| 82 | ``` |
| 83 | |
| 84 | ### "The provided entity includes an attribute with a value that has already been used" |
| 85 | The version number already exists. Increment the version: |
| 86 | ```bash |
| 87 | fastlane release_full version:"1.0.1" |
| 88 | ``` |
| 89 | |
| 90 | ### Build rejected or needs changes |
| 91 | 1. Address Apple's feedback |
| 92 | 2. Increment build number and re-upload: |
| 93 | ```bash |
| 94 | fastlane beta |
| 95 | ``` |
| 96 | 3. Submit again: |
| 97 | ```bash |
| 98 | fastlane release |
| 99 | ``` |
| 100 | |
| 101 | --- |
| 102 | |
| 103 | ## After Submission |
| 104 | |
| 105 | - **Review time**: Typically 24-48 hours (can be longer) |
| 106 | - **Check status**: App Store Connect → My Apps → Your App → App Store |
| 107 | - **If rejected**: Review feedback, fix issues, increment build, resubmit |
| 108 | - **If approved with auto_release**: App goes live immediately |
| 109 | - **If approved without auto_release**: Manually release in App Store Connect |