Skip to main content

Building for iOS

Create an iOS build using Expo Application Services (EAS).

Prerequisites

  • Node.js 18+
  • Expo account — Sign up at expo.dev
  • EAS CLI: npm install -g eas-cli
  • Apple Developer Account ($99/year) — Required for distribution

Apple Developer Setup

  1. Enroll at developer.apple.com
  2. Create an App ID matching your bundle identifier
  3. EAS can manage certificates and provisioning profiles automatically

Creating a Build

Development Build

cd mobile
eas build --platform ios --profile development

TestFlight Build

cd mobile
eas build --platform ios --profile production

Build Process

  1. EAS uploads your project to Expo's build servers
  2. If needed, EAS creates/manages iOS credentials automatically
  3. The build runs in the cloud (~15-30 minutes)
  4. When complete, you'll get an IPA file link

TestFlight Distribution

  1. Build with the production profile
  2. EAS can automatically submit to TestFlight:
    eas submit --platform ios
  3. Or manually upload the IPA via Transporter app on macOS
  4. In App Store Connect, add testers to the TestFlight group
  5. Testers receive an email to install via TestFlight app

App Store Submission

  1. Build a production IPA
  2. Submit via eas submit --platform ios or Transporter
  3. In App Store Connect:
    • Fill in app description, keywords, and categories
    • Upload screenshots for required device sizes
    • Add privacy policy URL
    • Submit for App Review

iOS Permissions

Ensure the following usage descriptions are set in app.json under expo.ios.infoPlist:

KeyDescription
NSLocationWhenInUseUsageDescription"Required for attendance check-in verification"
NSLocationAlwaysAndWhenInUseUsageDescription"Required for background attendance features"
NSCameraUsageDescription"Used to take photos for requests and profile"
NSPhotoLibraryUsageDescription"Used to upload attachments to requests"
NSFaceIDUsageDescription"Used for biometric authentication"

Version Management

In mobile/app.json:

{
"expo": {
"version": "1.1.0",
"ios": {
"buildNumber": "2"
}
}
}
  • version — User-facing version (must match App Store)
  • buildNumber — Must increment for each TestFlight/App Store upload