- Ci/cd
- Core networking
- Core caching
- Movie listing
- Movie searching
- Movie details
- Favoriting / saving movies
- Better ui / animations
- Add observability / logging lib
- Migrate to combine
- Migrate to SwiftTesting
- Add cache expiry logic
- Use api search instead of local search
- Modules for each core dependency
- Modules with custom tests and actions
This projects uses Xcodegen, Fastlane and Bundler to minimize your time setting up everything! It also has Swiftlint to ensure code coding style and conventions.
Please use Xcode 16
to run this.
Xcodegen is a good choice when wroking in big repos because it removes the need for pushing .xcodeproj
and .xcworkspace
to remote. This is possible thanks to the way it works, we provide a configuration file (project.yml
) that is used to generate .xcodeproj
files on the fly!
There are other alternatives too, one that work particulary well with SPM is called Tuist
Fastlane is just awesome, it's a really powerful tool that allow creating lanes
for each job your pipeline might need. If you see my other test repo you'll see that i did basically the same github actions configurations as here, but using Makefile
. You'll also see that it was necessary a couple of extra scripts to achieve what was possible with just one file with Fastlane
.
Bundler was used to ensure all machines run under the same dependencies. It's super annoying when the code works on my machine
, but you can't get it to run on someone else's. In theory, if we all run with the same conditions, the project should work just fine for everybody!
In the same line as Bundler
, other awesome tools that we could use are Xcodes for managing xcode versions and rbenv to manage different ruby versions (specially for our fastlane gems!).
Swiftlint is used to ensure a codebase consistency and clarity.
Although this is not required, it is recommended to use rbenv to manage your ruby environment:
brew install rbenv
rbenv install 3.2.0
rbenv local 3.2.0
First install any missing dependencies with:
bundle install
Then run fastlane to create the project:
bundle exec fastlane generate_project
You can find the design document for the app in Miro here.
But overall we're aiming for 3 screens:
- One for listing the movies
- One for showing the details for that movie
- One for listing saved / favorited movies
You'll notice that I'm structuring this project using VIP
pattern. And, to be honest, this was more of a personal choice for the stack that we'll be using here. If we were to use SwiftUI
and/or reactive programming
, I'd definetely go for a MVVM
pattern, since I belive it works pretty well with reactivity.
Excluding ui components, here is how this project will be sctructured:
As a side note, this design document was created before the actual implementation of the app (as it should be haha). So if there are any differences between both, something might had happened and it would be a good point for discussions on why the change.
This project uses TMDB's api.
Here are a couple of references:
Icon downloaded from: https://www.iconfinder.com/iconsets/user-interface-777