A React Native mobile application built with Expo, featuring a complete EAS Build and deployment pipeline for iOS and Android platforms.
- Project Overview
- Prerequisites
- Initial Setup
- Development Workflow
- Build and Deployment
- Stakeholder Testing
- Production Deployment
- Team Collaboration
- Troubleshooting
- Project Structure
Bundle Identifiers:
- iOS:
com.plabs.myfrequency
- Android:
com.plabs.myfrequency
EAS Project ID: cd382a7b-f16f-403c-8dbb-48c4443fe06d
Deployment Strategy:
- Preview builds for stakeholder feedback and internal testing
- Production builds for App Store and Play Store distribution
- TestFlight distribution for iOS beta testing
- Direct APK distribution for Android testing
- Expo Account - Sign up at https://expo.dev/signup
- Apple Developer Account - $99/year at https://developer.apple.com/programs/ (required for iOS builds)
- Google Play Console - $25 one-time (only needed for Play Store publishing)
- GitHub Account - For version control and team collaboration
- Node.js 20.16.0+ - Download from https://nodejs.org
- Git - For version control
- iOS/Android device - For testing
# Install required CLI tools
npm install -g eas-cli
npm install -g @expo/cli
# Verify installations
node --version # Should be 20.16.0+
eas --version # Should be 16.19.3+
npx @expo/cli --version # Should be 54.0.6+
# Clone the repository
git clone [repository-url]
cd MyFrequency
# Install dependencies
npm install
# Login to Expo
eas login
The project is configured with:
- EAS Build profiles in
eas.json
- App configuration in
app.json
- Build scripts in
package.json
# Connect Apple Developer account and register devices
eas device:create
# Follow prompts to:
# - Connect your Apple Developer account
# - Register test devices
# - Generate certificates and provisioning profiles
# Start development server
npx expo start
# For device testing with Expo Go
# Scan QR code with Expo Go app (iOS) or camera app (Android)
# For custom development builds
npx expo start --dev-client
# Create feature branch
git checkout -b feature/your-feature-name
# Make your changes
# ... code development ...
# Commit changes
git add .
git commit -m "Description of changes"
# Push to GitHub
git push origin feature/your-feature-name
# Create pull request for code review
# Merge to main branch when approved
- Purpose: Stakeholder feedback, internal testing
- Distribution: Direct download URLs, TestFlight
- Profile:
preview
- Purpose: App Store and Play Store releases
- Distribution: App stores via EAS Submit
- Profile:
production
For stakeholder testing and feedback:
# Build for all platforms (recommended)
eas build --profile preview --platform all
# Build for specific platform
eas build --profile preview --platform ios
eas build --profile preview --platform android
# Build with cache clearing (if issues)
eas build --profile preview --platform all --clear-cache
Build Process:
- Takes 15-20 minutes for iOS
- Takes 10-15 minutes for Android
- Builds run in parallel when using
--platform all
- You receive download URLs when complete
Example Output:
✅ Build completed
iOS: https://expo.dev/artifacts/eas/[build-id].ipa
Android: https://expo.dev/artifacts/eas/[build-id].apk
For app store submissions:
# Production build
eas build --profile production --platform all
# Submit to app stores
eas submit --platform ios --latest
eas submit --platform android --latest
# List recent builds
eas build:list --limit 10
# Cancel a running build
eas build:cancel [build-id]
# View build logs
eas build:view [build-id]
- Create preview build
- Share download URLs with stakeholders
- Stakeholders install and test
- Collect feedback and iterate
- Open the iOS URL on your iPhone
- Tap "Install"
- App will install to home screen
- Open and test
Requirements:
- Device must be registered with our Apple Developer account
- Contact dev team to register new devices
- Open the Android URL on your Android device
- Download the APK file
- Install (may need to allow "Install from Unknown Sources")
- Open and test
No registration required for Android testing
📱 NEW BUILD AVAILABLE
iOS: [iOS-URL]
Android: [Android-URL]
Changes in this version:
- [List key changes]
- [Feature additions]
- [Bug fixes]
Please test and provide feedback by [date].
Issues? Reply to this message or contact [contact-info].
TestFlight is Apple's official beta testing platform that allows you to distribute iOS builds to up to 10,000 external testers without requiring device registration.
TestFlight Advantages:
- No device UDID registration required
- Support for up to 10,000 testers
- Automatic update notifications to testers
- Built-in feedback collection
- Professional distribution experience
- No 90-day app expiration
TestFlight Disadvantages:
- Requires App Store review for external testing (1-3 days)
- More complex setup than direct distribution
- Requires App Store Connect access management
-
Ensure App Store Connect App Exists
# First build will create the app in App Store Connect eas build --profile production --platform ios
-
Submit to TestFlight
# Submit latest build to TestFlight eas submit --platform ios --latest # Or submit specific build eas submit --platform ios --id [build-id]
-
Configure TestFlight Settings
- Go to App Store Connect: https://appstoreconnect.apple.com
- Navigate to your app → TestFlight
- Add external testers or groups
- Configure build settings and testing information
Adding Individual Testers:
- In App Store Connect → TestFlight → External Testing
- Click "Add Testers"
- Enter email addresses
- Testers receive email invitation with TestFlight install link
Creating Tester Groups:
- Create groups (e.g., "Stakeholders", "QA Team", "Beta Users")
- Add testers to appropriate groups
- Assign builds to specific groups
TestFlight Commands:
# Build and submit to TestFlight
eas build --profile production --platform ios
eas submit --platform ios --latest
# Check submission status
eas submission:list --platform ios
# View submission details
eas submission:view [submission-id]
-
Build and Submit
eas build --profile production --platform ios eas submit --platform ios --latest
-
Wait for Processing (15-30 minutes)
- Build processes automatically
- Available for internal testing immediately
- External testing requires Apple review (1-3 days for first submission)
-
Add Testers in App Store Connect
- Add stakeholder email addresses
- Create relevant testing groups
- Set up testing instructions
-
Distribute to Testers
- Select build in TestFlight
- Add to external testing groups
- Testers receive email invitations
-
Tester Experience
- Install TestFlight app from App Store
- Accept invitation email
- Install your app via TestFlight
- Automatic notifications for new builds
📱 NEW iOS BUILD AVAILABLE ON TESTFLIGHT
Version: [version-number]
Build: [build-number]
Changes in this version:
- [List key changes]
- [Feature additions]
- [Bug fixes]
To install:
1. Install TestFlight from the App Store (if not already installed)
2. Check your email for the TestFlight invitation
3. Tap "Accept" in the email or use this link: [testflight-link]
4. Install and test the app
Please test and provide feedback by [date].
Use TestFlight's built-in feedback feature or reply to this message.
Note: TestFlight builds expire after 90 days but you'll receive automatic updates.
For Stakeholder Testing:
- Use production profile builds for TestFlight
- Set clear testing instructions in App Store Connect
- Create separate groups for different stakeholder types
- Use TestFlight's feedback collection features
- Send regular updates with clear changelogs
Build Versioning:
// In app.json, increment for each TestFlight build
{
"expo": {
"version": "1.0.0",
"ios": {
"buildNumber": "123" // Auto-incremented by EAS
}
}
}
Managing Multiple Builds:
- Keep 2-3 recent builds active for different testing phases
- Archive old builds to reduce clutter
- Use clear build notes for each TestFlight submission
# Build and submit for App Store release
eas build --profile production --platform ios
eas submit --platform ios --latest
# Monitor submission status
eas submission:list --platform ios
# Build and submit
eas build --profile production --platform android
eas submit --platform android --latest
# Monitor submission status
eas submission:list --platform android
Update version in app.json
:
{
"expo": {
"version": "1.1.0",
"ios": {
"buildNumber": "2"
},
"android": {
"versionCode": 2
}
}
}
- Preview channel: Internal testing and stakeholder feedback
- Production channel: App store releases
- Main branch: Production-ready code
- Feature branches: Individual feature development
- Pull requests: Required for all changes to main
- Code reviews: Required before merging
# Daily workflow
git pull origin main
# ... make changes ...
git add .
git commit -m "Feature: description"
git push origin feature-branch
# Create pull request
# Create builds for stakeholders
eas build --profile preview --platform all
# Deploy to production
eas build --profile production --platform all
eas submit --platform all --latest
- GitHub Issues: Bug reports and feature requests
- Pull Requests: Code reviews and discussions
- Slack/Email: Build notifications and stakeholder communication
# Re-setup certificates
eas credentials:list
eas device:create
# Generate new keystore
eas build --profile preview --platform android --clear-cache
- Ensure all referenced assets exist in
assets/
folder - Check
app.json
for correct asset paths
- Free tier has longer queue times
- Consider upgrading to paid plan for faster builds
- Android builds typically have shorter queues than iOS
- Verify device is registered:
eas device:list
- Check Apple Developer account status
- Ensure valid provisioning profile
- Enable "Install from Unknown Sources" in Android settings
- Try downloading APK directly to device vs transferring from computer
# View detailed build logs
eas build:view [build-id]
# Check project status
eas project:info
# List all builds
eas build:list --limit 20
MyFrequency/
├── App.js # Main application component
├── app.json # Expo configuration
├── eas.json # EAS Build configuration
├── package.json # Dependencies and scripts
├── assets/ # Images, icons, splash screens
│ ├── icon.png
│ ├── splash.png
│ ├── adaptive-icon.png
│ └── favicon.png
├── components/ # Reusable components
├── screens/ # Screen components
├── navigation/ # Navigation configuration
├── services/ # API services and utilities
├── constants/ # App constants and configuration
└── README.md # This file
{
"cli": {
"version": ">= 16.19.3",
"appVersionSource": "remote"
},
"build": {
"preview": {
"distribution": "internal",
"channel": "preview"
},
"production": {
"autoIncrement": true,
"channel": "production"
}
}
}
Contains app metadata, bundle identifiers, assets configuration, and update settings.
npx expo start # Start development server
npx expo start --dev-client # Start for custom builds
npx expo install [package] # Install Expo-compatible packages
eas build --profile preview --platform all # Preview builds
eas build --profile production --platform all # Production builds
eas build:list # List builds
eas build:cancel [build-id] # Cancel build
eas submit --platform ios --latest # Submit to App Store
eas submit --platform android --latest # Submit to Play Store
eas project:info # Project information
eas device:list # List registered devices
eas device:create # Register new device
For technical issues or questions:
- Check this README first
- Review build logs:
eas build:view [build-id]
- Check Expo documentation: https://docs.expo.dev/
- Contact the development team
EAS Dashboard: https://expo.dev/accounts/arus/projects/my-frequency-app
Last Updated: September 2025