Home > Developer Guide > iOS > iOS Development Roadmap
iOS Development Roadmap
Purpose: Define the path to iOS feature parity with Android app, leveraging existing KMP shared code
Context: iOS Phase 2 (tournament features) completed in Week 28. This roadmap covers all remaining features.
Impact: Provides clear scope, dependencies, and effort estimates for each development phase
Executive Summary
Current State (Week 28):
- ✅ iOS app framework established
- ✅ Firebase Firestore integration working
- ✅ Tournament list and detail views implemented
- ✅ Join/leave tournament functionality
Shared Code Availability:
- Tournament: 100% shared (models, DAOs, presenters)
- Round Scoring: 90% shared (presenter, DAOs exist)
- Equipment: 95% shared (10 presenters, 11 DAOs exist)
- Statistics: 50% shared (DAOs exist, analytics logic Android-specific)
- Authentication: 40% shared (models exist, platform-specific implementation)
Estimated Total Effort: 12-16 weeks (remaining phases)
Phase Breakdown
Phase 1: Framework & Tournament List (Week 28) ✅ COMPLETE
Status: COMPLETED 2025-11-18
What Was Built:
- iOS app framework (Xcode project, KMP integration)
- TournamentListView (SwiftUI)
- TournamentListViewModel (Firebase integration)
- Navigation infrastructure
Key Achievements:
- Established Swift-Kotlin interop patterns
- Firebase setup and initialization
- KMP-NativeCoroutines integration
PRs:
- #272: Initial iOS app framework
- #273: TournamentListView
Lessons Learned:
- Swift Int → Kotlin Int32 conversion required
- KotlinLong uses
.int64Value, not.longValue - Firebase availability checks prevent crashes
- Graceful error handling essential
Phase 2: Tournament Detail & Participation (Week 28) ✅ COMPLETE
Status: COMPLETED 2025-11-18
What Was Built:
- TournamentDetailView (SwiftUI)
- TournamentDetailViewModel (Firebase integration)
- Join/leave tournament operations (transaction-based)
- Integration with TournamentListView navigation
Key Achievements:
- Transaction-based participant management (prevents race conditions)
- Proper type conversions for all Kotlin types
- Swift-Kotlin property name mapping patterns documented
PRs:
- #275: TournamentDetailViewModel implementation
- #276: TournamentDetailView implementation
- #278: Build error fixes (KMP plugin, type conversions, Firebase)
Lessons Learned:
- guard/return pattern doesn’t work in WindowGroup body
- Copilot enforcement of zero attribution
- Integration reviews critical for multi-agent work
Documentation:
- 2025-11-18-ios-phase2-build-fixes - Session summary
- kotlin-swift-interop - Type conversion patterns
- ios-firebase-setup - Firebase configuration guide
Phase 3: Tournament Creation & Authentication (Future)
Status: NOT STARTED
Estimated Duration: 2-3 weeks
Dependencies:
- Phase 2 complete ✅
Features to Implement:
3.1 Authentication (Google/Apple Sign-In)
- Shared Code Available: SecurityModels.kt (domain models)
- iOS Work Needed:
- Implement GoogleSignInProvider (Swift wrapper for Google SDK)
- Implement AppleSignInProvider (native AuthenticationServices)
- Create IOSAuthProvider (conforms to shared auth interface)
- AuthenticationView (SwiftUI login screen)
- AuthenticationViewModel (Firebase Auth integration)
Effort: 1 week
- Google Sign-In SDK integration (2 days)
- Apple Sign-In integration (1 day)
- AuthenticationView UI (1 day)
- Firebase Auth ViewModel (2 days)
3.2 Tournament Creation
- Shared Code Available: Tournament model, TournamentRepository interfaces
- iOS Work Needed:
- TournamentCreationView (multi-step form)
- TournamentCreationViewModel (validation, Firebase write)
- Form components (date picker, location selector, rules editor)
- Integration with TournamentListView (refresh after creation)
Effort: 1-2 weeks
- TournamentCreationView UI (4 days)
- Form validation logic (2 days)
- Firebase create operation (1 day)
- Integration and testing (2 days)
Shared Code Audit:
- ✅ Tournament model exists (shared/domain/models/tournament/)
- ✅ Firebase integration pattern established (from Phase 2)
- ❌ No shared tournament creation presenter (Android ViewModel is app-specific)
- Action: Create TournamentCreationViewModel in iOS (similar to Android pattern)
Success Criteria:
- User can sign in with Google or Apple ID
- User can create new tournaments
- Created tournaments appear in TournamentListView
- Authentication state persists across app launches
Phase 4: Active Scoring (Offline-First) (Future)
Status: NOT STARTED
Estimated Duration: 4-5 weeks
Dependencies:
- Phase 3 complete (authentication required for user-owned rounds)
Features to Implement:
4.1 Round Creation
- Shared Code Available:
- RoundDisplayPresenter (shared/presentation/round/)
- RoundDao (shared/database/)
- RoundFormat model (shared/domain/models/tournament/)
- iOS Work Needed:
- RoundCreationView (round setup form)
- RoundCreationViewModel (validation, local DB write)
- Integration with scoring session
Effort: 1 week
4.2 Active Scoring Interface
- Shared Code Available:
- RoundDisplayPresenter (shared/presentation/round/)
- RoundDao (shared/database/)
- ScoringSystem models (shared/domain/models/)
- iOS Work Needed:
- ActiveScoringView (end-by-end score entry)
- LiveScoringViewModel (local state management)
- Target face rendering (custom SwiftUI drawing)
- Arrow score input components
Effort: 2-3 weeks
- ActiveScoringView UI (5 days)
- Target face drawing (3 days)
- Score entry logic (3 days)
- LiveScoringViewModel (2 days)
Key Challenge: Offline-first architecture
- Local Room database writes
- Sync when online
- Conflict resolution
4.3 Round History & Details
- Shared Code Available:
- RoundDao (query operations)
- RoundDisplayPresenter
- iOS Work Needed:
- HistoricalRoundsView (list of completed rounds)
- RoundDetailsView (view past round scores)
- RoundAnalyticsView (basic stats: total, average, best end)
Effort: 1 week
Shared Code Audit:
- ✅ RoundDisplayPresenter exists (shared/presentation/round/RoundDisplayPresenter.kt)
- ✅ RoundDao exists (shared/database/dao/RoundDao.kt)
- ✅ ScoringSystem models exist (shared/domain/models/ScoringSystem.kt)
- ✅ TournamentScoreCacheDao exists (shared/database/dao/TournamentScoreCacheDao.kt)
- ❌ LiveScoringViewModel is Android-specific (app/ui/roundScoring/LiveScoringViewModel.kt)
- Action: Port LiveScoringViewModel logic to iOS (or create shared presenter)
Success Criteria:
- User can create new round with format/distance
- User can score arrows end-by-end
- Scores persist locally (offline mode)
- User can view historical rounds
- Scores sync to Firebase when online
Phase 5: Gear Management (Future)
Status: NOT STARTED
Estimated Duration: 3-4 weeks
Dependencies:
- Phase 3 complete (authentication required for user-owned equipment)
Features to Implement:
5.1 Equipment Profiles
- Shared Code Available: (⭐ HIGHEST KMP COVERAGE ⭐)
- 10 Equipment Presenters (shared/presentation/equipment/):
- AccessoryPresenter
- ArrowPresenter
- BowStringPresenter
- LimbsPresenter
- PlungerPresenter
- RestPresenter
- RiserPresenter
- SightPresenter
- StabilizerPresenter
- WeightPresenter
- 11 Equipment DAOs (shared/database/dao/):
- All equipment types (Riser, Limbs, BowString, Arrow, Sight, Rest, Plunger, Stabilizer, Weight, Accessory, BowSetup)
- BowSetup model (shared/domain/models/equipment/)
- 10 Equipment Presenters (shared/presentation/equipment/):
iOS Work Needed:
- EquipmentListView (list all equipment by type)
- EquipmentDetailView (view/edit equipment specs)
- EquipmentCreationView (add new equipment)
- EquipmentSelectionView (pick equipment for round)
- ViewModels wrapping existing presenters
Effort: 2-3 weeks
- Equipment list UI (3 days)
- Equipment detail/edit UI (4 days)
- Equipment creation UI (3 days)
- Integration with 10 presenters (3 days)
- Testing and refinement (2 days)
5.2 Bow Setup Management
- Shared Code Available:
- BowSetupDao (shared/database/)
- BowSetup model (shared/domain/models/equipment/)
- iOS Work Needed:
- BowSetupView (assemble bow from components)
- BowSetupViewModel (validation, save setup)
Effort: 1 week
Shared Code Audit:
- ✅ ALL 10 equipment presenters exist (shared/presentation/equipment/)
- ✅ ALL 11 equipment DAOs exist (shared/database/dao/)
- ✅ BowSetup model exists (shared/domain/models/equipment/BowSetup.kt)
- ✅ EquipmentStatsDao exists (shared/database/dao/EquipmentStatsDao.kt)
- KMP Readiness: 95% - Nearly all business logic is shared!
- Action: Create thin SwiftUI wrappers around existing presenters
Success Criteria:
- User can view all equipment by type
- User can add/edit equipment specifications
- User can create bow setups from components
- User can select equipment for rounds
- Equipment persists locally and syncs to Firebase
Phase 6: Statistics & Analytics (Future)
Status: NOT STARTED
Estimated Duration: 2-3 weeks
Dependencies:
- Phase 4 complete (needs round scoring data)
- Phase 5 complete (needs equipment data for correlations)
Features to Implement:
6.1 Personal Statistics
- Shared Code Available:
- EquipmentStatsDao (shared/database/dao/)
- Some analytics models (need audit)
- iOS Work Needed:
- PersonalStatsView (overview dashboard)
- StatsViewModel (aggregation queries)
- Charts/graphs (Swift Charts)
- Filters (date range, equipment, distance)
Effort: 1-2 weeks
6.2 Shot Grouping Analysis
- Shared Code Available:
- DomainCoordinate model (shared/domain/models/)
- iOS Work Needed:
- GroupingAnalysisView (visual shot pattern)
- GroupingViewModel (calculate grouping metrics)
- Custom drawing for shot dispersion
Effort: 1 week
Shared Code Audit:
- ✅ EquipmentStatsDao exists (shared/database/dao/EquipmentStatsDao.kt)
- ✅ DomainCoordinate exists (shared/domain/models/DomainCoordinate.kt)
- ⚠️ RoundAnalyticsViewModel is Android-specific (app/ui/roundScoring/RoundAnalyticsViewModel.kt)
- ⚠️ Analytics logic NOT in shared code (needs investigation)
- KMP Readiness: 50% - DAOs exist, but analytics calculations are Android-specific
- Action: Audit analytics algorithms, consider moving to shared presenter
Success Criteria:
- User sees personal bests and averages
- User sees progress over time (charts)
- User sees shot grouping analysis
- User can filter stats by equipment/date
Phase 7: iOS-Specific Features (Future)
Status: NOT STARTED
Estimated Duration: 2-3 weeks (optional enhancements)
Dependencies:
- Phases 1-6 complete (feature parity achieved)
Features to Implement (iOS Enhancements):
7.1 Widgets
- Home screen widget (today’s best score, upcoming tournaments)
- Lock screen widget (quick score entry)
- Effort: 1 week
7.2 Apple Watch App
- Round scoring on watch
- Tournament countdown
- Quick stats view
- Effort: 2-3 weeks
7.3 Live Activities
- Real-time tournament scoring updates
- Active round progress
- Effort: 3-5 days
Shared Code Audit:
- ❌ No shared code for widgets/watch (iOS-specific UI)
- ✅ Can reuse presenters/DAOs for data access
- KMP Readiness: N/A (platform features)
Success Criteria:
- Widget displays accurate data
- Watch app syncs with phone
- Live Activities work during tournaments
Shared Code Summary
High KMP Coverage (90%+)
-
Equipment Management - 95% shared
- 10 presenters ready to use
- 11 DAOs ready to use
- Minimal iOS UI work needed
-
Round Scoring - 90% shared
- RoundDisplayPresenter exists
- RoundDao exists
- LiveScoringViewModel needs porting
-
Tournament Management - 100% shared
- Already implemented in iOS (Phase 2)
Medium KMP Coverage (40-60%)
-
Statistics & Analytics - 50% shared
- DAOs exist
- Analytics calculations in Android ViewModels
- Needs shared presenter or iOS reimplementation
-
Authentication - 40% shared
- SecurityModels exist
- Platform-specific SDKs (Google, Apple)
- Firebase Auth integration per platform
Recommended Migration Strategy
Phase 4 & 5 (High Priority):
- Leverage existing shared presenters (equipment, round scoring)
- Focus iOS effort on SwiftUI UI layer
- Minimal business logic reimplementation
Phase 6 (Medium Priority):
- Audit Android analytics algorithms
- Consider moving calculations to shared presenter
- Alternative: Reimplement in iOS (if algorithms simple)
Phase 3 & 7 (Low Shared Code):
- Implement platform-specific code as needed
- Authentication: Use Firebase SDKs per platform
- Widgets/Watch: iOS-specific (no shared code)
Dependencies Between Phases
Phase 1 (Framework) ✅
↓
Phase 2 (Tournament Detail) ✅
↓
Phase 3 (Auth + Tournament Creation)
↓
Phase 4 (Active Scoring)
↓
Phase 5 (Equipment) ← Can parallelize with Phase 4
↓
Phase 6 (Analytics)
↓
Phase 7 (iOS-Specific Features)
Critical Path:
- Phases 1-2 (complete)
- Phase 3 (blocks everything - auth required)
- Phase 4 or 5 (can parallelize)
- Phase 6 (needs data from 4 & 5)
- Phase 7 (optional enhancements)
Parallelization Opportunities:
- After Phase 3: Phase 4 and Phase 5 can be built in parallel
- Phase 7 features are independent and can be prioritized separately
Effort Estimates
| Phase | Duration | Complexity | KMP Leverage |
|---|---|---|---|
| Phase 1: Framework ✅ | 2 weeks | Medium | 60% |
| Phase 2: Tournament Detail ✅ | 1-2 weeks | Medium | 80% |
| Phase 3: Auth + Creation | 2-3 weeks | Medium | 40% |
| Phase 4: Active Scoring | 4-5 weeks | High | 90% |
| Phase 5: Equipment | 3-4 weeks | Low | 95% |
| Phase 6: Analytics | 2-3 weeks | Medium | 50% |
| Phase 7: iOS Features | 2-3 weeks | Low | 0% |
| Total Remaining | 12-16 weeks | - | - |
Notes:
- KMP Leverage: Percentage of feature where shared code exists
- Complexity: Based on Android implementation size and algorithm complexity
- Duration: Assumes 1 full-time developer working on iOS
Risk Assessment
Technical Risks
Risk 1: Swift-Kotlin Type Conversion Edge Cases
- Likelihood: Medium
- Impact: Low (slows development, but not blocking)
- Mitigation: Continue documenting patterns in kotlin-swift-interop
Risk 2: Firebase Offline Sync Differences
- Likelihood: High
- Impact: Medium (affects Phase 4 scoring)
- Mitigation: Test offline behavior early, document differences
Risk 3: KMP-NativeCoroutines Plugin Updates
- Likelihood: Medium
- Impact: Medium (build breaks when upgrading Kotlin)
- Mitigation: Pin plugin versions, test upgrades in isolation
Risk 4: Room Database iOS Performance
- Likelihood: Low
- Impact: High (if slow, affects user experience)
- Mitigation: Profile query performance, add indexes as needed
Process Risks
Risk 5: Feature Scope Creep
- Likelihood: Medium
- Impact: High (delays feature parity)
- Mitigation: Strict adherence to roadmap, defer iOS-specific features to Phase 7
Risk 6: Android-iOS Feature Drift
- Likelihood: Medium
- Impact: Medium (iOS falls behind as Android adds features)
- Mitigation: Pause Android new features until iOS catches up, or budget iOS updates
Success Metrics
Phase Completion Metrics
- ✅ All features from Android phase implemented on iOS
- ✅ No build errors (Xcode compilation passes)
- ✅ No runtime crashes (Firebase, Room, type conversions work)
- ✅ Zero attribution in all commits/PRs
- ✅ Documentation updated (session notes, patterns, guides)
Quality Metrics
- Test coverage: 60%+ for ViewModels
- Zero P0 bugs at phase completion
- Performance: UI response < 100ms
- Offline mode: All features work without network
User Experience Metrics
- Feature parity: iOS has 100% of Android features
- User satisfaction: App Store rating > 4.5
- Retention: Users continue using both platforms
Next Steps
Immediate (Post-Phase 2):
- Merge PR #60 (iOS Phase 2 documentation)
- Celebrate Phase 2 completion 🎉
- Plan Phase 3 kickoff
Phase 3 Planning (Next Session):
- Design authentication flow (Google + Apple Sign-In)
- Create Agent assignments for Auth + Tournament Creation
- Set up Firebase Auth configuration
- Define acceptance criteria
Long-Term:
- Reassess roadmap after Phase 3 (adjust estimates)
- Consider hiring iOS specialist if timeline critical
- Evaluate Phase 7 features based on user feedback
Related Documentation
Architecture:
- week-28-ios-firebase-integration - iOS Phase 2 architecture decisions
- kotlin-swift-interop - Type conversion patterns
- ios-firebase-setup - Firebase configuration guide
Session Documentation:
- 2025-11-18-ios-phase2-build-fixes - Phase 2 debugging session
KMP Architecture:
shared/MODULE_ARCHITECTURE.md- KMP module structureshared/presentation/- Shared presenters for equipment, rounds, tournaments
Android Implementation:
app/src/main/java/com/archeryapprentice/ui/- Reference for iOS UIapp/src/main/java/com/archeryapprentice/ui/roundScoring/- Active scoring referenceapp/src/main/java/com/archeryapprentice/ui/equipment/- Equipment UI reference
Last Updated: 2025-11-18 Status: Active roadmap following iOS Phase 2 completion Next Review: After Phase 3 completion