iCoinic Quiz App is a Multiple-Choice Quiz App empowered with The Trivia API to provide entertaining and educational app of multiple-choice questions.
The App is built entirely with SwiftUI using Xcode from Apple targeting smart phone devices running iOS 16 and above, integrated with The Trivia API, and uses core data to store and retrieve data.
The app is built with MVVM architecture, uses Apple Combine framework and async-await for structured concurrency, and modular programming.
The app relies on external api provider to fetch set of multiple-choice questions on specific parameters (set by the user) and provide an interesting challenging quiz experience.
The app architecture design takes into consideration the need for changing the api service provider. As such, the api service manager and api data structure are designed in a way to be replaceable without any major impact on app skeleton, workflow or data flow.
Data structure is divided into:
- User Defaults to save quiz parameters that are needed to fetch a new quiz, and
- Core Data to store results by finished quiz for analysis and tracking purposes.
The views flow consists of one parent view (Main View) container of all child views/ screens:
- Loading View
- Settings View
- Question View
- Results View
- Activities View
Main View is managed by a view model with the assistance of service class that manages all api calls to api service provider.
App architecture is composed of:
- Core Components (Models, Views and View Model)
- Peripheral Components (Services, Utilities, UI Components and Extensions)
Core Components make up the app skeleton:
Data model architecture is composed of:
- Quiz Parameters holds user's selection of quiz parameters.
- Question of local type is derived from verified data of type v2, which in turn is formed from fetched raw data of type v1.
- Results model is made of Activity Model that holds results by quiz, and Category Model that holds results by category by quiz.
Views flow architecture is as follow:
- Loading view represents loading indicator.
- Landing view or Settings View that displays options for the user to choose the parameters of a new quiz, and provides a start button action to start a new quiz.
- Question view appears with each new load of a new question (with multiple-choice answers) from the fetched set of questions of the new quiz.
- Results view appears the moment the user reach end of the quiz, and displays quiz results by question.
- User can navigate to activities view from Settings View or Results View. Activities View displays all past activities (history of past quizzes).
View Model is data repository and view manager that is responsible to make local data available to parent view (Main View), cascade data to children views and make all methods available to manage user interaction.
Other Components manage data flow and style.
API Service class is responsible to manage all api calls with api endpoint to fetch data. All api calls are built with Apple Combine framework and async-await for structured concurrency.
- End Point - URL Builder uses url components and query parameters to build a callable url session link.
- Network Manager - Network Engine is responsible to establish url session to download data from api endpoint.
- Font Modifiers - Modifiers responsible to format data display on screens with several levels including Font Title level 2 for screen title, Font Title level 3 for headers, Font Body for body text, Circle Focus for focused text inside circle, and Rounded Rectangle Focus for focused text inside rounded rectangle.
- URL Link View - Custom view empowered with custom SF Safari View Wrapper to display url link in a form of a web view.
- ActionButton - Custom button.
- NavigationBar - Custom navigation bar.
- Double Extension - Custom formatted percentage.
- Color Extension - Theme colors.
Database uses Core Data, which is composed of:
- Activity Model represented by Quiz Entity entity.
- Category Model represented by Category Entity.
Those two core data entities are represented by two separate structures (Quiz Entity Data Model and Category Entity Data Model) that work as middle-man between structures of local data and entities of core data.
Combine framework and async-await are used to maintain synchronization while adding data to or deleting data from core data.
The app relies on external api source The Trivia API for fetching multiple-choice questions. The external source can be easily replaced with other sources by changing the structures model of api raw data, url builder parameters and api service class as per documentation of the new source.