An iOS team with 5 members. Long term project, with both development and maintenance being handled within the team. Design the app and as the tech lead, implement the main fundamental functionalities.
Open Messenger/Messenger.xcodeproj
, and Run (Cmd + R)
.
- Show a list of users retrieved from GitHub.
- Handle rate limit case.
- Pull to refresh list users.
- Paging loading.
- Support landscape and portrait.
- Images caching.
- Direct messaging screen functionalities.
- UI improved.
- Storing messages for each user.
- Following VIPER architechture.
- UnitTests.
- Swiftlint for coding styles & clean code.
- Support
fastlane
. Runfastlane scan
in Xcode project directory. - Prepared to support multi environments (dev and prod).
Messenger
├── Resources
├── Models
├── Modules
├── Core
│ └── Image
│ └── Persistence
│ └── Helper
| └── Extensions
| └── Networking
│ └── BaseVIPER
| └── Presenter
| └── Router
| └── View
MessengerTests
VIPER is a very clean architecture. It isolates each module from others. So changing or fixing bugs are very easy as you only have to update a specific module. Also for having modular approach VIPER creates a very good environment for unit testing.
- Good for large teams.
- Makes it scalable. Enable developers to simultaneously work on it as seamlessly as possible.
- Makes it easy to add new features.
- Makes it easy to write automated tests since your UI logic is separated from the business logic.
- Makes it easier to track issues via crash reports due to the Single Responsibility Principle.
- Makes the source code cleaner, more compact, and reusable.
- Reduces the number of conflicts within the development team.
- Applies SOLID principles.
- Reduces the number of merge conflicts.
I created a VIPER Xcode template to make the work easier, reduce time for create new files and repeate the same code per module.
To create new module: Create new Group as your module name ---> Add new File --> Scroll down to select VIPER template --> type your module name.
A very lightweight URLSession wrapper to work with REST APIs. Easy to use and flexible with diffirent endpoints, methods.
networkClient.fetch(endPoint: ListUsersEndpoint.fetchListUser(lastId: lastId), type: [User].self) { (result) in
switch result {
case .success(let users):
print("Fetched list users: \(users)")
case .failure(let error):
print("Error: \(error)")
}
}
Add test cases for each modules or base components to make sure we won't break it after changes. Can run fastlane scan
[x] PersistenceTests.
[x] ImagesCacheTests.
[x] ListUsersTests.
[x] DirectMessagesTests.
[x] Support Mockable test or load data from local JSON.
- Intergrate CI/CD with this repo, to double check every commit/PR pass the test cases.
- Separate Chat sessions by date. And store it with CoreData/Realm, not UserDefault like current approach.
- Add UI tests.