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 scanin 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.
