Flutter Code Signing (2026): Complete Guide to Certificates & Profiles
Code signing is the single step that blocks most Flutter developers from shipping to the App Store. The error messages are cryptic, the terminology overlaps, and Xcode's automatic signing hides what it is doing — until it breaks.
This guide covers everything you need to know about code signing for a Flutter iOS app in 2026: what certificates and provisioning profiles are, how automatic signing works, when to switch to manual signing, and how to fix the most common errors.
What code signing actually does
Code signing proves to iOS that your app comes from a known developer and has not been modified since you built it. Without a valid signature, iOS refuses to run the app (Flutter docs).
Three pieces work together:
- Distribution certificate — Identifies you as the developer. Created from a signing request in the Apple Developer portal or through Xcode. Tied to your Apple Developer account.
- Provisioning profile — Links your certificate to a specific bundle ID and set of capabilities. Tells iOS that your app is allowed to run on devices.
- App ID — A combination of your team ID and bundle identifier (e.g.,
TEAMID.com.example.myapp). Must be registered before you can create a provisioning profile.
Prerequisites
Before you start (Apple Developer Program):
- An Apple Developer Program membership ($99/year for individuals).
- A Mac with Xcode 15 or later.
- Your Flutter project with a valid bundle identifier.
Automatic signing (the default)
Xcode's automatic signing handles certificate and provisioning profile creation for you. For most Flutter apps, this is all you need (Flutter docs).
To enable it:
- Open your Flutter project's iOS workspace:
open ios/Runner.xcworkspace - Select the Runner target in the Xcode navigator.
- Go to the Signing & Capabilities tab.
- Check Automatically manage signing.
- Select your Team from the dropdown. If your account is not listed, click Add Account... and sign in.
Xcode will create the distribution certificate, register your App ID, and generate a provisioning profile automatically. If you see a green checkmark next to your team, signing is working.
When automatic signing breaks
Automatic signing fails in a few common scenarios:
- Multiple certificates — If you have more than one distribution certificate, Xcode may pick the wrong one. Delete the old certificate in the Apple Developer portal.
- Bundle ID mismatch — The bundle ID in Xcode must match the one registered in the Apple Developer portal. Check for typos, extra spaces, or case differences.
- Expired certificate — Distribution certificates expire after one year. Renew in the Apple Developer portal, then re-enable automatic signing.
- Capability not supported in automatic mode — Some capabilities (like Push Notifications with a custom entitlement) may require manual profile creation.
- "No profiles for [bundle ID] were found" — The provisioning profile has not been created. Let Xcode create it by keeping automatic signing on, or create it manually in the developer portal.
Manual signing (when you need it)
Switch to manual signing when you need fine-grained control — for example, in CI/CD pipelines, when using fastlane, or when automatic signing keeps failing (Apple Developer).
Provisioning profile types:
- App Store — For distribution through the App Store. Does not restrict to specific devices.
- Ad Hoc — For distribution to up to 100 registered devices. Used for TestFlight and direct device installs.
- Development — For running on your own devices during development.
To set up manual signing:
- Go to the Apple Developer portal.
- Create a distribution certificate (Certificates > Add > Apple Distribution).
- Register your App ID (Identifiers > Add > App IDs).
- Create a provisioning profile (Profiles > Add > App Store).
- Download the profile and the certificate.
- In Xcode, uncheck Automatically manage signing.
- Select the provisioning profile and signing certificate manually.
Code signing for CI/CD
If you build your Flutter app in CI (GitHub Actions, Codemagic, etc.), you cannot use Xcode's automatic signing. You need to export your signing assets and configure them in your pipeline (Flutter docs):
- Export your distribution certificate and private key from Keychain Access as a
.p12file. - Download your provisioning profile from the Apple Developer portal.
- Store both as base64-encoded secrets in your CI environment.
- In your pipeline, create a temporary keychain, import the certificate, and install the profile.
Tools like fastlane match automate this by storing your signing files in a git repository and syncing them across machines.
Common signing errors and fixes
| Error | Cause | Fix |
|---|---|---|
| "No profiles for com.example.app were found" | Provisioning profile not created | Enable automatic signing, or create the profile manually in the developer portal |
| "Your account already has a valid iOS Distribution certificate" | Duplicate certificate | Revoke the old certificate in the developer portal, then re-enable signing |
| "You have reached the maximum number of certificates" | Too many certificates (limit varies by type) | Revoke unused certificates in the developer portal |
| "The certificate used to sign the app is not valid" | Expired or revoked certificate | Generate a new distribution certificate and update your provisioning profile |
| "Code Sign error: no certificate matching team ID" | Wrong team selected in Xcode | Select the correct team in Signing & Capabilities |
| "This provisioning profile does not have the entitlement com.apple.developer.associated-domains" | Profile missing a capability | Regenerate the provisioning profile with the required capability enabled |
Checklist before you archive
Before you build your release archive, confirm:
- Bundle ID in Xcode matches the registered App ID exactly.
- Distribution certificate is valid and not expired.
- Provisioning profile is active and includes the correct capabilities.
- iOS deployment target is set to the minimum version you support.
- All capabilities (Push Notifications, Sign in with Apple, etc.) are enabled in the App ID and provisioning profile.
- No build settings override the code signing identity or provisioning profile.
Run flutter build ipa --release to verify the build succeeds. If it does, you are ready to upload to App Store Connect.
ShipForge can check this for you
Code signing errors are one of the most common reasons Flutter apps get stuck before submission. ShipForge's Launch Score checks your project's signing configuration, bundle ID consistency, and capability alignment before you archive — so you catch issues while you can still fix them easily.
Run your free Launch Score to check your app's signing readiness and every other rejection risk before you submit.
Frequently asked questions
How do I code sign a Flutter app for iOS?
To code sign a Flutter app for iOS: open Xcode, select your target, go to Signing & Capabilities, select your development team, enable Automatically manage signing, and ensure a valid provisioning profile is created. For distribution, use App Store distribution profile.
What is a provisioning profile in iOS development?
A provisioning profile links your app, developer certificate, and device. It tells iOS that your app is authorized to run on a specific device during development, or to be distributed via the App Store or TestFlight. Xcode can manage provisioning profiles automatically.
Why does my Flutter iOS build fail with code signing error?
Common code signing errors include: no development team selected in Xcode, expired provisioning profile, bundle ID mismatch between Xcode and Apple Developer Portal, or missing distribution certificate. Open the project in Xcode and fix signing under Signing & Capabilities.