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
- Enroll at developer.apple.com
- Create an App ID matching your bundle identifier
- 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
- EAS uploads your project to Expo's build servers
- If needed, EAS creates/manages iOS credentials automatically
- The build runs in the cloud (~15-30 minutes)
- When complete, you'll get an IPA file link
TestFlight Distribution
- Build with the production profile
- EAS can automatically submit to TestFlight:
eas submit --platform ios - Or manually upload the IPA via Transporter app on macOS
- In App Store Connect, add testers to the TestFlight group
- Testers receive an email to install via TestFlight app
App Store Submission
- Build a production IPA
- Submit via
eas submit --platform iosor Transporter - 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:
| Key | Description |
|---|---|
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