iOS Credentials & Provisioning
Certs, profiles, and EAS managed credentials - the cookbook for iOS signing on Expo SDK 57 without every engineer maintaining Xcode signing folders.
Search across all documentation pages
Certs, profiles, and EAS managed credentials - the cookbook for iOS signing on Expo SDK 57 without every engineer maintaining Xcode signing folders.
Quick-reference recipe card - copy-paste ready.
# Interactive credential setup
eas credentials --platform ios
# First production build (prompts for Apple login)
eas build --profile production --platform ios
# Non-interactive CI build after credentials exist
eas build --profile production --platform ios --non-interactive// app.config.ts - bundle ID is the signing anchor
import type { ExpoConfig } from "expo/config";
const config: ExpoConfig = {
name: "ShopApp",
slug: "shop-app",
ios: {
bundleIdentifier: "com.example.shopapp",
buildNumber: "1",
},
extra: {
eas: { projectId: "00000000-0000-0000-0000-000000000000" },
},
};
export default config;// eas.json - store vs internal distribution affects profile type
{
"build": {
"production": {
"distribution": "store",
"ios": { "simulator": false }
},
"preview": {
"distribution": "internal",
"ios": { "simulator": false }
}
}
}When to reach for this:
eas build --platform ios asks about certificates and provisioning profiles.Step 1 - Register the bundle identifier
ios.bundleIdentifier in app.config.ts.Step 2 - Let EAS manage signing credentials
eas credentials --platform iosChoose for a greenfield app:
? What do you want to do? › Set up credentials for a new bundle identifier
? Generate a new Apple Distribution Certificate? › Yes
? Generate a new Apple Provisioning Profile? › YesEAS stores:
.p12 equivalent, encrypted on Expo servers)distribution).p8) for APNsStep 3 - Register devices for internal builds
# Create a registration link for testers
eas device:create
# List registered devices
eas device:listInternal ("distribution": "internal") profiles embed registered UDIDs. Testers must register before you rebuild.
Step 4 - Build and verify
eas build --profile production --platform ios
eas build --profile preview --platform ios # ad hoc / internal testersDownload the IPA and install via TestFlight (eas submit) or ad hoc link - Internal Distribution.
| Credential | Purpose | Managed by EAS? |
|---|---|---|
| Apple Distribution Certificate | Signs release IPAs | Yes - recommended |
| Provisioning Profile (App Store) | Store / TestFlight distribution | Yes |
| Provisioning Profile (Ad Hoc) | Registered device installs | Yes - refreshes when devices added |
| Development Certificate | Local expo run:ios debug | Optional - local Xcode |
| APNs Key (.p8) | Push notifications | Yes - one key per team is typical |
| App Store Connect API Key | eas submit automation | Separate from signing - see EAS Submit |
eas credentials --platform ios
# Choose: Remove distribution certificate → Generate new → Rebuild all profiles
eas build --profile production --platform ios --clear-cache--non-interactive builds pick up new credentials automaticallyeas credentials --platform ios
# Choose: Upload distribution certificate (.p12 + password)
# Choose: Upload provisioning profile (.mobileprovision)EAS can enable portal capabilities that match your config plugins:
{
"build": {
"production": {
"ios": {
"autoIncrement": true
}
}
}
}// app.config.ts - associated domains require portal + entitlements alignment
ios: {
associatedDomains: ["applinks:shop.example.com"],
},
plugins: [["expo-notifications", { icon: "./assets/notification-icon.png" }]],app.config.ts / plugins first - then regenerate profiles via eas credentials| Symptom | Likely cause | Fix |
|---|---|---|
| "No valid code signing certificates" | Expired or missing distribution cert | eas credentials → regenerate |
| "Profile doesn't match bundle identifier" | bundleIdentifier drift vs portal | Align app.config.ts with App ID |
| "Device not in provisioning profile" | New tester UDID | eas device:create → rebuild internal profile |
| Push works in dev, fails in TestFlight | Wrong APNs environment | Production push needs production entitlements - TestFlight Distribution |
| "Account not enrolled in Apple Developer Program" | Personal Apple ID only | Enroll at developer.apple.com ($99/year) |
.p12, .mobileprovision, or passwords to git.distribution: "store" - TestFlight and App Review uploads.distribution: "internal" - direct IPA install to registered devices (max 100 per year per device type rules apply).eas credentials and eas build handle Apple portal API calls from any OS.expo run:ios or Xcode Instruments.eas credentials - entitlements come from Entitlements & Capabilities.Stack versions: This page was written for React 19.2.3, React Native 0.86.0, and Expo SDK 57 (
expo~57.0.4).
Reviewed by Chris St. John·Last updated Jul 16, 2026