Visit our website at footballgather.app for more information.
- minimum iOS 26.0
- Xcode & Swift for development - https://developer.apple.com/xcode/
- Swift Package Manager for modularization - https://www.swift.org/package-manager/
- GitHub Actions for CI/CD pipelines - https://docs.github.com/en/actions
- fastlane for automating CI & distribution to TestFlight - https://fastlane.tools/
- Bundler to execute fastlane commands - https://bundler.io/
Clone the repository and ensure you have the correct Xcode version installed:
git clone https://github.com/radude89/footballgather-prod.git
- Open the project in Xcode:
open FootballGather.xcodeproj - Select a simulator or connected device from the scheme menu in Xcode's toolbar
- Select the
FootballGatherscheme - Click the Run button (
▶️ ) or pressCmd + Rto build and run the app
To run the project or unit tests, use the FootballGather scheme:
- Select Product > Test from the menu bar, or
- Press
Cmd + Uto run the tests
To run the UI tests, use the UITests scheme:
- Select the
UITestsscheme from the scheme menu - Select Product > Test from the menu bar, or
- Press
Cmd + Uto run the UI tests
For fastlane usage, please refer to this guide. Available commands:
# Running unit tests
bundle exec fastlane ut
# Running UI tests
bundle exec fastlane ui
# Taking snapshots
bundle exec fastlane screenshots
# Bumping versions
bundle exec fastlane bump_versions
Football Gather helps you record and track matches that you play with your friends.
Key features:
- Player management
- Customizable match countdown timer
- Score tracking
- Match history
Article series - Battle of the iOS Architecture Patterns:
- Model View Controller (MVC) - medium article here or on my personal blog.
- A Look at Model-View-ViewModel (MVVM) - medium article here or on my personal blog.
- Model View Presenter (MVP) - medium article here or on my personal blog.
- Model View Presenter with Coordinators (MVP-C) - medium article here or on my personal blog.
- View Interactor Presenter Entity Router (VIPER) - medium article here or on my personal blog.
- View Interactor Presenter (VIP) - medium article here or on my personal blog.
Other connected articles:
- Using Vapor 3 and Fluent to create a REST API - medium article here or on my personal blog.
- Migrating to Vapor 4 - medium article here or on my personal blog.
- Acceptance Tests created.
- Unit Tests created - aiming for 100% code coverage.
- Integration Tests created where needed.
- UI tests for core journeys.
- Accessibility support.
- Dark mode support.
- All tests are green locally.
- Code integrated with
main. - All tests are green on the CI tool.
- No known bugs are introduced into the product.
- No design / UI issues are introduced into the product.
All stories and the product backlog can be seen publicly here: https://trello.com/b/UTfCqxBK/football-gather.
The architecture is modular and leverages Swift packages. The UI implementation uses MVVM architecture pattern with SwiftUI.
We adhere to the following engineering principles and best practices:
The app consists of the following components:
- App - Contains the entry point of Football Gather and the
WindowGroupthat houses theMainView. It depends on theHomemodule. - Core Packages - Foundation modules with no dependencies:
FoundationTools,UITools, andCoreModels. - Use Cases - Independent feature modules that implement the application's functionality.
Below, we present the high-level diagram of the project's packages:
Notes:
- Composition root: app launch logic and the place where the dependencies are created.
- AppLauncher: main function of the app, checks if the app has been ran from the test target or from the app target and initializes the
Appobject. - FootballGatherApp: the app structure, that is implementing the
SwiftUIprotocolApp. This is a type that represents the structure and behavior of the app.' - TestApp: a simplified version of the UI that is used when running test targets.
- AppLauncher: main function of the app, checks if the app has been ran from the test target or from the app target and initializes the
- Home Use Case: contains the
Homescreen logic. - Gather Use Case: the main package of the application, that has the timer and score handling.
- TeamSelection Use Case: this is the place where we select players and assign them teams.
- PlayerDetails Use Case: we have here the information about the player, such as name, age or position.
- PlayerList Use Case: represents the list of players.
- History Use Case: your previous played gathers.
- Core Packages: the tools for the project, having a lot of packages that depend on them.
- FoundationTools: contains the core utils, helpers, extensions files.
- UITools: is the package containing the helper files related to the application's UI.
- CoreModels: this package contains the domain models of the app.
- SwiftUI for user interface implementation
- Chosen to gain practical experience with the framework in a production environment
- MVVM architecture pattern for UI implementation
- Natural integration with SwiftUI
- UIKit implementation for player selection
- Implemented due to SwiftUI limitations with drag & drop functionality in multi-sectioned Lists
We use unit tests, integration tests and UI tests.
Snippets from April, 2022:
| Test Type | Count |
|---|---|
| Unit Tests | 301 |
| Integration Tests | 51 |
| UI Tests | 26 |
| Total | 378 |
| Package | Coverage | Executable Lines |
|---|---|---|
| Core Packages | ||
| CoreModels | 100% | 23 |
| FoundationTools | 100% | 278 |
| Use Cases | ||
| TeamSelection | 94.86% | 175 |
| Gather | 99.18% | 486 |
| History | 100% | 93 |
| PlayerList | 100% | 149 |
| PlayerDetails | 100% | 88 |
| Home | 100% | 11 |
Note: Coverage metrics include only business logic files, excluding views.
Football Gather is developed as an open source project. I encourage everyone to contribute.
Please do make pull requests if you have suggestions or ideas of improvement.
Thanks!
Hi! I'm Radu Dan, a Staff iOS Engineer with over 13 years of experience in mobile development. I'm passionate about crafting high-quality iOS applications and sharing knowledge with the developer community.
- Currently Staff iOS Engineer at Qonto
- Previously Mobile Lead at Deloitte Digital Romania
- Over 6 years of experience in fintech projects
Besides Football Gather, I've developed several other indie apps:
- Personal Website: radude89.com
- LinkedIn: Radu Dan
- Email: rdan.dev@gmail.com
Football Gather source code is released under the MIT license. See LICENSE for details.



