Publishing to TestFlight

Guide for publishing Minuta to TestFlight via an organization Apple Developer account.

Prerequisites

ItemStatusNotes
Apple Developer Program membershipRequiredOrganization needs $99/year membership
Your role in App Store ConnectRequiredNeed Admin, App Manager, or Developer role
D-U-N-S NumberRequired for orgShould already be set up if you’re in the org
Xcode 15+RequiredFor iOS 17 deployment target

Part 1: Apple Developer Portal Setup

1.1 Register App ID

  1. Go to Apple Developer Portal
  2. Navigate to Certificates, Identifiers & Profiles > Identifiers
  3. Click + to register a new identifier
  4. Select App IDs > App
  5. Fill in:
    • Description: Minuta
    • Bundle ID: Select “Explicit” and enter tools.minuta.app
  6. Capabilities: No special capabilities needed
  7. Click Continue > Register

1.2 Verify Team ID

Project uses Team ID UKMJ95C96B (configured in project.yml).

Confirm this matches your organization’s Team ID in the Developer Portal.

Part 2: App Store Connect Setup

2.1 Create the App

  1. Go to App Store Connect
  2. Click Apps > + > New App
  3. Fill in:
    • Platforms: iOS (Mac Catalyst is automatic)
    • Name: Minuta
    • Primary Language: Your choice
    • Bundle ID: Select tools.minuta.app from dropdown
    • SKU: minuta (unique identifier, not shown to users)
    • User Access: Full Access
  4. Click Create

2.2 App Information (Optional for TestFlight)

Under App Store tab, you’ll eventually need:

  • App icon (1024x1024)
  • Screenshots (various sizes)
  • Description, keywords, support URL
  • Privacy policy URL
  • Age rating

For TestFlight-only testing, most of this can be skipped initially.

Part 3: Build and Archive

Option A: Using Xcode (Recommended)

  1. Open project:

    open Minuta/Minuta.xcodeproj
  2. Select Any iOS Device (arm64) as build destination

  3. Increment build number if needed:

    • Edit Minuta/project.yml: CURRENT_PROJECT_VERSION: "X"
    • Regenerate: cd Minuta && xcodegen generate
  4. Product > Archive

  5. When complete, Organizer window opens

  6. Click Distribute App > App Store Connect > Upload

  7. Follow prompts (automatic signing should work)

Option B: Command Line

# 1. Clean and archive
cd Minuta
xcodebuild clean archive \
  -project Minuta.xcodeproj \
  -scheme Minuta \
  -destination 'generic/platform=iOS' \
  -archivePath ../build/Minuta.xcarchive

# 2. Create ExportOptions.plist
cat > ../build/ExportOptions.plist << 'EOF'
<?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>UKMJ95C96B</string>
    <key>destination</key>
    <string>upload</string>
</dict>
</plist>
EOF

# 3. Export and upload
xcodebuild -exportArchive \
  -archivePath ../build/Minuta.xcarchive \
  -exportPath ../build/export \
  -exportOptionsPlist ../build/ExportOptions.plist

Option C: Direct Upload with altool

After creating the .ipa:

# Create App-Specific Password at appleid.apple.com first
xcrun altool --upload-app \
  -f ../build/export/Minuta.ipa \
  -t ios \
  -u your-apple-id@email.com \
  -p "xxxx-xxxx-xxxx-xxxx"

Part 4: TestFlight Configuration

4.1 Wait for Processing

After upload:

  • Build appears in App Store Connect under TestFlight tab
  • Processing takes 5-30 minutes
  • Email notification when ready

4.2 Add Test Information

  1. In App Store Connect, go to TestFlight tab
  2. Click on your build
  3. Add What to Test notes
  4. Add Test Information:
    • Beta App Description
    • Feedback Email
    • Privacy Policy URL (may be required)

4.3 Internal Testing (No Review Required)

  1. Go to Internal Testing section
  2. Create a group (e.g., “Core Team”)
  3. Add testers (must be App Store Connect users in your org)
  4. Up to 100 internal testers
  5. Available immediately after processing

4.4 External Testing (Requires Beta Review)

  1. Go to External Testing section
  2. Create a group
  3. Add external testers by email
  4. First build of each version requires Beta App Review (24-48 hours)
  5. Up to 10,000 external testers

Part 5: Mac Catalyst

App supports Mac Catalyst (SUPPORTS_MACCATALYST: YES).

  • iOS build automatically works on Mac Catalyst
  • Mac testers install via TestFlight for Mac
  • Same build serves both platforms

Build Number Management

Each upload must have a unique build number.

# Before each new TestFlight upload, increment CURRENT_PROJECT_VERSION
# in project.yml, then regenerate:
cd Minuta && xcodegen generate

Or edit directly in Xcode: Target > Build Settings > Current Project Version

Troubleshooting

IssueSolution
“No accounts with App Store Connect access”Check your role in App Store Connect Users
“Bundle ID not registered”Register App ID in Developer Portal first
“Build already exists”Increment CURRENT_PROJECT_VERSION
“Missing compliance”Add Export Compliance (select “No” - app has no encryption)
Archive fails with signing errorCheck Team ID matches, or try manual signing

Quick Summary

  1. Developer Portal: Register App ID tools.minuta.app
  2. App Store Connect: Create new app with that Bundle ID
  3. Xcode: Archive > Distribute > Upload
  4. App Store Connect: Add testers in TestFlight tab
  5. Testers: Download TestFlight app, accept invite

References