Please use this identifier to cite or link to this item: https://er.chdtu.edu.ua/handle/ChSTU/9766
Title: Програмне забезпечення YourHealth під платформу iOS
Authors: Метелап , Володимир Володимирович
Михаль, Ростислав Володимирович
Keywords: МОБІЛЬНИЙ ДОДАТОК,;IOS;ЗДОРОВ’Я;Активність користувача,;SWIFT;SWIFTUI,;HEALTHKIT,;СТАТИСТИКА,;ІНТЕРФЕЙС КОРИСТУВАЧА,;ТЕСТУВАННЯ.;MOBILE APPLICATION,;IOS,;HEALTH;PHYSICAL ACTIVITY,;SWIFT;SWIFTUI;HEALTHKIT;STATISTICS;USER INTERFACE,;TESTING.
Issue Date: 17-Jun-2026
Abstract: АНОТАЦІЯ Кваліфікаційна робота бакалавра на тему « Програмне забезпечення YourHealth під платформу iOS для моніторингу стану здоров ʼ я під мобільну платформу iOS » містить сторінок таблиць рисунків список використаних джерел з найменувань додатків Актуальність теми належить до спеціальності «Інженерія програмного забезпечення» та зумовлена зростанням попиту на мобільні програмні рішення для підтримки фізичного і психічного здоров’я користувачів в умовах цифрової трансформації суспільства. Підвищений рівень стресу, малорухливий спосіб життя та інформаційне перевантаження формують потребу в інструментах для відстеження показників здоров’я, аналізу їх змін і встановлення персональних цілей. Незважаючи на значну кількість доступних застосунків, більшість із них не забезпечують комплексного підходу або мають складний інтерфейс. Метою кваліфікаційної роботи є розробка iOS застосунку для моніторингу активності користувача, який забезпечує зручний доступ до даних про стан здоров’я та їх аналіз. Основними завданнями під час проєктування програмного продукту є аналіз вимог, розробка архітектури та інтерфейсу, реалізація основної функціональності, забезпечення тестування та документування системи. Об’єктом дослідження є процеси збору, обробки та візуалізації даних про фізичну активність користувача в iOS застосунках. Предметом розробки є методи та засоби створення iOS застосунку для збору, обробки та візуалізації даних про фізичну активність користувача, зокрема архітектура програмного забезпечення, алгоритми обробки ін формації та інтерфейс користувача. Вирішено наступні поставлені задачі: розроблено архітектуру мобільного застосунку для iOS на основі SwiftUI та підходу MVVM; реалізовано інтеграцію з Apple HealthKit для отримання даних про кроки, дистанцію та активні калорії; створено зручний інтерфейс для перегляду щоденної та загальної активності користувача; забезпечено локальне збереження налаштувань та протестовано основну функціональність застосунку. Практичне значення отриманих результатів полягає в розр обці програмного забезпечення для моніторингу фізичної активності, яке доповнює стандартний застосунок Apple Health. YourHealth забезпечує контроль стану здоров’я, відстеження активності та персональних цілей завдяки сучасному інтерфейсу й покращеній взаєм одії з користувачем.
ANNOTATION The bachelor's qualification work titled “Development of “ Softw are for Health Monitoring in the iOS Mobile Platform" contains pages, tables, ___ a list of references with sources, and appendices. The relevance of the topic is associated with the field of Software Engineering and is determined by the growing demand for mobile software solutions aimed at supporting users’ physical and mental health in the context of the digital transformation of society. Increased stress leve ls, sedentary lifestyles, and information overload create a need for tools that enable users to track health indicators, analyze their changes, and set personal goals. Despite the large number of available applications in this area, most of them either do not provide a comprehensive approach or have overly complex user interfaces. The purpose of the qualification thesis is to develop an iOS application for monitoring users’ physical activity, providing convenient access to health related data and its analys is. The main objectives of the software design process include requirements analysis, architecture and user interface design, implementation of core functionality, testing, and system documentation. The object of research is the processes of collecting, processing, and visualizing user physical activity data in iOS applications. The subject of development is the methods and tools used to create an iOS application for collecting, processing, and visualizing physical activit y data, including software architecture, information processing algorithms, and user interface design. The following tasks were accomplished: the architecture of a mobile iOS application was developed based on SwiftUI and the MVVM architectural approach; integration with Apple HealthKit was implemented to retrieve data on steps, distance, and active calories; a user friendly interface was created for viewing daily and overall user activity; local storage of settings was implemented, and the core functional ity of the application was tested. The practical significance of the obtained results lies in the development of software for monitoring physical activity that complements the standard Apple Health application. YourHealth provides health monitoring, activi ty tracking, and personal goal management through a modern user interface and improved user interaction.
URI: https://er.chdtu.edu.ua/handle/ChSTU/9766
Appears in Collections:121 Інженерія програмного забезпечення (Інженерія програмного забезпечення)



Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.

Extracted text
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ 
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ 
Факультет інформаційних технологій і систем 
Кафедра програмного забезпечення автоматизованих систем 
 
 
ПОЯСНЮВАЛЬНА ЗАПИСКА 
до кваліфікаційної роботи бакалавра 
на тему: «Програмне забезпечення YourHealth під платформу iOS» 
 
 
Виконав: студент 4 курсу,  
групи ПЗС-2204 
спеціальності 
121 «Інженерія програмного забезпечення»  
              (шифр і назва напряму підготовки) 
 
 
 
Студент Михаль Р. В. 
 (прізвище та ініціали) 
Керівник Метелап В. В. 
 (прізвище та ініціали) 
Рецензент Захарова М.В. 
 (прізвище та ініціали) 
 
 
 
 
Черкаси 2026 
 
Факультет інформаційних технологій і систем 
Кафедра  програмного забезпечення автоматизованих систем 
Освітній рівень бакалавр 
Спеціальність 121 «Інженерія програмного забезпечення» 
Освітня програма Інженерія програмного забезпечення 
 
ЗАТВЕРДЖУЮ 
Зав. кафедри ПЗАС, професор 
                                           С. Голуб  
«___» _______________ 2026 року 
 
З А В Д А Н Н Я 
НА КВАЛІФІКАЦІЙНУ РОБОТУ СТУДЕНТУ 
Михаль Ростислав Володимирович 
(прізвище, ім’я, по батькові) 
1. Тему проекту (роботи) Програмне забезпечення YourHealth під платформу iOS  
Керівник проекту (роботи) Метелап Володимир Володимирович к.т.н. доцент  
                      (прізвище, ім’я , по батькові, науковий ступінь, вчене звання) 
Затверджені наказом Черкаського державного технологічного університету від «06» 05 
2026 року №123/03-03 
2.Строк подання студентом проекту (роботи) ____ червня 2026 
3. Вхідні дані до проекту (роботи) технології та інструментарій розробки ПЗ 
4. Зміст розрахунково-пояснювальної записки (перелік питань, які потрібно розробити) 
Вступ; Розділ 1 Існуючі методи та засоби розв’язання поставлених завдань; Розділ 2 
впровадження результатів дослідження у практику проектування програмного 
забезпечення інформаційних систем; Розділ 3 Розробка та тестування програмного 
забезпечення; Висновок; Список використаних джерел; Додатки. 
5. Перелік графічного матеріалу (з точним зазначенням обов’язкових робіт проекту; 
Додаток Г – Презентаційний матеріал. 
6. Консультанти розділів роботи 
Прізвище, ініціали та посади Підпис, дата 
Розділ 
консультанта Завдання видав Завдання прийняв 
1    
2    
7.Дата видачі завдання ___ лютий 2026 р. 
 
 
КАЛЕНДАРНИЙ ПЛАН 
Строк виконання етапів 
№ 
Назва етапів випускної роботи кваліфікаційної Примітки 
п/п 
роботи 
1 Постановка задачі 5.05.2026 виконано 
2 Підготовка завдання 4.05.2026 виконано 
3 Погодження завдання 4.05.2026 виконано 
4 Затвердження завдання 5.05.2026 виконано 
 Основна стадія   
1 Підбір матеріалів 2.05.2026 виконано 
2 Аналіз шляхів вирішення поставленої виконано 
 4.05.2026 
задачі
3 Розрахунок основних параметрів роботи 5.05.2026 виконано 
4 Вибір кінцевого варіанту проектного виконано 
 8.05.2026 
рішення
5 Оформлення первісної редакції роботи 7.05.2026 виконано 
 Заключна стадія   
1 Узгодження прийнятих проектних виконано 
18.05.2026 
рішень з керівником 
2 Оформлення пояснювальної записки виконано 
18.05.2026 
роботи в кінцевій редакції 
3 Попередній захист роботи 22.05.2026 виконано 
4 Затвердження роботи 05.06.2026  
5 Рецензування роботи 10.06.2026  
6 Захист роботи 12.06.2026  
 
 
Студент _____________________  ___Михаль Р. В. 
  (підпис)   (прізвище та ініціали) 
 
Керівник роботи _____________________  ___Метелап В.В. 
  (підпис)   (прізвище та ініціали) 
 
 
АНОТАЦІЯ 
Кваліфікаційна робота бакалавра на тему «Програмне забезпечення 
YourHealth під платформу iOS” для моніторингу стану здоровʼя під мобільну 
платформу iOS» містить ____ сторінок, _____ таблиць, ______ рисунків, 
список використаних джерел  з ________ найменувань, _____додатків. 
Актуальність теми належить до спеціальності «Інженерія програмного 
забезпечення» та зумовлена зростанням попиту на мобільні програмні 
рішення для підтримки фізичного і психічного здоров’я користувачів в 
умовах цифрової трансформації суспільства. Підвищений рівень стресу, 
малорухливий спосіб життя та інформаційне перевантаження формують 
потребу в інструментах для відстеження показників здоров’я, аналізу їх змін і 
встановлення персональних цілей. Незважаючи на значну кількість доступних 
застосунків, більшість із них не забезпечують комплексного підходу або 
мають складний інтерфейс. 
Метою кваліфікаційної роботи є розробка iOS-застосунку для 
моніторингу активності користувача, який забезпечує зручний доступ до 
даних про стан здоров’я та їх аналіз. 
Основними завданнями під час проєктування програмного продукту є 
аналіз вимог, розробка архітектури та інтерфейсу, реалізація основної 
функціональності, забезпечення тестування та документування системи. 
Об’єктом дослідження є процеси збору, обробки та візуалізації даних 
про фізичну активність користувача в iOS-застосунках. 
Предметом розробки є методи та засоби створення iOS-застосунку для 
збору, обробки та візуалізації даних про фізичну активність користувача, 
зокрема архітектура програмного забезпечення, алгоритми обробки 
інформації та інтерфейс користувача. 
Вирішено наступні поставлені задачі: 
• розроблено архітектуру мобільного застосунку для iOS на основі SwiftUI та 
підходу MVVM; 
• реалізовано інтеграцію з Apple HealthKit для отримання даних про кроки, 
дистанцію та активні калорії; 
• створено зручний інтерфейс для перегляду щоденної та загальної активності 
користувача; 
• забезпечено локальне збереження налаштувань та протестовано основну 
функціональність застосунку. 
Практичне значення отриманих результатів полягає в розробці 
програмного забезпечення для моніторингу фізичної активності, яке 
доповнює стандартний застосунок Apple Health. YourHealth забезпечує 
контроль стану здоров’я, відстеження активності та персональних цілей 
завдяки сучасному інтерфейсу й покращеній взаємодії з користувачем. 
Ключові слова: МОБІЛЬНИЙ ДОДАТОК, IOS, ЗДОРОВ’Я, Активність 
користувача, SWIFT, SWIFTUI, HEALTHKIT, СТАТИСТИКА, ІНТЕРФЕЙС 
КОРИСТУВАЧА, ТЕСТУВАННЯ.  
 
 
ANNOTATION 
 
The bachelor's qualification work titled “Development of “YourHealth” 
Software for Health Monitoring in the iOS Mobile Platform" contains ___ pages, 
__ tables, ___figures, a list of references with __ sources, and __ appendices.  
The relevance of the topic is associated with the field of Software 
Engineering and is determined by the growing demand for mobile software 
solutions aimed at supporting users’ physical and mental health in the context of the 
digital transformation of society. Increased stress levels, sedentary lifestyles, and 
information overload create a need for tools that enable users to track health 
indicators, analyze their changes, and set personal goals. Despite the large number 
of available applications in this area, most of them either do not provide a 
comprehensive approach or have overly complex user interfaces. 
The purpose of the qualification thesis is to develop an iOS application for 
monitoring users’ physical activity, providing convenient access to health-related 
data and its analysis. 
The main objectives of the software design process include requirements 
analysis, architecture and user interface design, implementation of core 
functionality, testing, and system documentation. 
The object of research is the processes of collecting, processing, and 
visualizing user physical activity data in iOS applications. 
The subject of development is the methods and tools used to create an iOS 
application for collecting, processing, and visualizing physical activity data, 
including software architecture, information processing algorithms, and user 
interface design. 
The following tasks were accomplished: 
• the architecture of a mobile iOS application was developed based on SwiftUI and 
the MVVM architectural approach;  
• integration with Apple HealthKit was implemented to retrieve data on steps, 
distance, and active calories; 
• a user-friendly interface was created for viewing daily and overall user activity; 
• local storage of settings was implemented, and the core functionality of the 
application was tested. 
The practical significance of the obtained results lies in the development of 
software for monitoring physical activity that complements the standard Apple 
Health application. YourHealth provides health monitoring, activity tracking, and 
personal goal management through a modern user interface and improved user 
interaction. 
 
Keywords: MOBILE APPLICATION, IOS, HEALTH, PHYSICAL ACTIVITY, 
SWIFT, SWIFTUI, HEALTHKIT, STATISTICS, USER INTERFACE, TESTING. 
 
 
 
 
  
 
 
 
 ЧДТУ 262355.001 ПЗ 
ВСТУП 
 Актуальність теми відноситься до спеціальності Інженерія 
програмного забезпечення та визначається зростанням попиту на програмні 
рішення для мобільних пристроїв, які сприяють підтримці фізичного та 
психічного здоров'я користувачів в умовах цифрової трансформації 
суспільства. Підвищений рівень стресу, малорухливий спосіб життя та 
інформаційне перевантаження формують потребу в інструментах, що 
дозволяють ефективно відстежувати індивідуальні показники здоров'я, 
аналізувати динаміку змін та встановлювати персональні цілі. Незважаючи на 
велику кількість доступних застосунків у цій сфері, більшість із них або не 
забезпечують комплексного підходу, або мають надмірно складний 
інтерфейс. 
 Проблема полягає у відсутності універсального та водночас простого у 
використанні інструменту для відстеження показників здоров’я, зокрема сну, 
настрою, водного балансу та інших параметрів, без перевантаження 
інтерфейсу або нав’язливих механізмів трекінгу. У відповідь на цю потребу 
було розроблено мобільний застосунок «YourHealth» для платформи iOS, 
який об’єднує функції моніторингу стану здоров’я, постановки цілей та 
аналізу прогресу в єдиному середовищі з урахуванням сучасних принципів 
UX/UI-дизайну. 
 Метою дипломної кваліфікаційної роботи є створення 
персоналізованого iOS-застосунку, що надає користувачу можливість: 
• вести облік власних показників здоров’я; 
• встановлювати індивідуальні цілі та відстежувати їх виконання; 
• аналізувати прогрес за допомогою графічного та інтерактивного 
інтерфейсу; 
• налаштовувати зовнішній вигляд застосунку відповідно до власних 
вподобань. 
  9 
 ЧДТУ 262355.001 ПЗ 
 Завдання роботи: виконати аналіз існуючих програмних рішень та 
технологій розробки застосунків для моніторингу здоров'я; розробити 
архітектуру застосунку з використанням патерну MVVM; обрати технології 
реалізації, зокрема SwiftUI для інтерфейсу та Firebase для зберігання даних і 
авторизації; реалізувати базові функції введення, збереження та відображення 
даних; провести тестування застосунку щодо відповідності функціональним 
вимогам та зручності використання. 
 Об’єктом дослідження є процес розробки програмного забезпечення у 
вигляді мобільного застосунку для iOS із використанням хмарних технологій 
для обліку показників здоров’я користувача. 
 Предметом дослідження є методи інженерії програмного забезпечення 
— проєктування архітектури за патерном MVVM, розробка користувацького 
інтерфейсу та організація зберігання даних — для реалізації функцій 
моніторингу стану здоров'я, постановки цілей і візуалізації аналітичних даних 
у мобільному застосунку. 
 Методи проєктування та реалізації: 
 Мова програмування Swift із використанням фреймворку SwiftUI для 
створення інтерфейсу користувача; 
застосування Firebase (Authentication, Firestore) для роботи з даними; 
архітектурний підхід MVVM для розділення логіки застосунку; 
використання UML-діаграм для моделювання структури та поведінки системи 
(діаграми компонентів, розгортання, послідовностей, діяльності та скінчених 
автоматів). 
 Опис отриманих результатів: 
Розроблено мобільний застосунок «YourHealth» для платформи iOS, який 
забезпечує користувачеві можливість відстеження власних показників 
здоров’я, створення персональних цілей, перегляду прогресу у вигляді 
графіків та налаштування інтерфейсу. Застосунок реалізовано з 
використанням SwiftUI та Firebase, що дозволило забезпечити авторизацію, 
  10 
 ЧДТУ 262355.001 ПЗ 
введення, обробку та візуалізацію даних у зручному форматі. 
 Практичне значення отриманих результатів: 
Розроблене програмне забезпечення може використовуватись широким колом 
користувачів як інструмент персонального моніторингу стану здоров’я. Його 
використання сприяє формуванню здорових звичок, покращенню контролю 
фізичної активності, зменшенню фрагментації даних та забезпеченню 
комплексного підходу до самоконтролю. Додаток також має потенціал для 
подальшого розвитку, зокрема шляхом інтеграції з Apple HealthKit, 
впровадження системи рекомендацій та медичних підказок на основі 
введених даних. 
  
  11 
 ЧДТУ 262355.001 ПЗ 
РОЗДІЛ 1. ІСНУЮЧІ МЕТОДИ ТА ЗАСОБИ РОЗВ’ЯЗАННЯ 
ПОСТАВЛЕНИХ ЗАВДАНЬ 
 1.1. Огляд інструментарію проектування програмного забезпечення 
 Розробка мобільного застосунку для моніторингу стану здоров'я 
потребує обґрунтованого вибору архітектурного підходу, платформи 
реалізації та технологій зберігання даних, що впливають на якість, 
підтримуваність і масштабованість програмного продукту. 
 Серед архітектурних шаблонів проектування мобільних застосунків 
поширеними є MVC (Model-View-Controller), MVP (Model-View-Presenter) та 
MVVM (Model-View-ViewModel). У MVC логіка взаємодії між моделлю та 
представленням покладається на контролер, що за зростання складності 
застосунку часто призводить до його надмірного навантаження. MVP 
виносить цю логіку в окремий компонент-презентер, підвищуючи 
тестованість коду, проте потребує явної синхронізації презентера з 
елементами інтерфейсу. MVVM додатково реалізує механізм прив'язки даних 
(data binding), за якого ViewModel автоматично відображає зміни стану моделі 
без прямих посилань на View, що забезпечує чіткий розподіл відповідальності 
та спрощує модульне тестування. 
 Для зберігання та синхронізації даних користувача розглянуто хмарні 
платформи Backend-as-a-Service — Firebase, Supabase, AWS Amplify. Firebase 
надає вбудовані механізми автентифікації, хмарну базу даних Firestore з 
підтримкою синхронізації в реальному часі та безкоштовний тарифний план 
для розробки й тестування застосунків. 
На основі проведеного огляду для реалізації застосунку обрано архітектурний 
шаблон MVVM, платформу iOS із використанням SwiftUI та хмарне сховище 
Firebase для авторизації й зберігання даних користувачів. 
 1.2 Огляд iOS застосунків для організації часу та планування задач   
  12 
 ЧДТУ 262355.001 ПЗ 
 Мобільні застосунки для моніторингу стану здоров’я є важливою 
складовою цифрових інструментів сучасного користувача. Вони дозволяють 
структурувати особисті дані, автоматизувати відстеження активності та 
забезпечують швидкий доступ до інформації у будь-який час. Серед 
найпоширеніших рішень у цій сфері можна виділити:  
• Apple Health - централізована система збирання даних про здоров’я в 
екосистемі Apple. Вона автоматично агрегує інформацію про фізичну 
активність, сон, пульс та інші медичні показники за наявності сумісних 
пристроїв. 
Рисунок 1.1 - Вигляд iOS – додатку Apple Health 
  13 
 ЧДТУ 262355.001 ПЗ 
 
• Google Fit — аналог Apple Health для Android-платформи. 
Розроблений у співпраці зі Всесвітньою організацією охорони здоров’я 
та Американською кардіологічною асоціацією. 
Рисунок 1.2 - Вигляд додатку Google Fit 
 
• Samsung Health - фірмовий застосунок компанії Samsung, 
орієнтований на користувачів пристроїв Galaxy. Підтримує додаткові 
функції, зокрема вимірювання рівня стресу, насичення крові киснем та 
  14 
 ЧДТУ 262355.001 ПЗ 
різні режими тренувань. 
 
Рисунок 1.3 - Вигляд додатку Samsung Health 
 
• FitBit — це як екосистема так і додаток, що синхронізується з фітнес-
браслетами бренду. Розширений функціонал аналізу сну, активності та 
стресу.  
 Кожен із наведених застосунків має власні сильні сторони та 
функціональні особливості. Водночас більшість із них зосереджена 
переважно на зборі базових даних і базовому моніторингу активності, 
залишаючи менш розвиненими можливості глибокого аналізу, 
довгострокового прогнозування та персоналізованих рекомендацій. Саме ці 
аспекти стали основою концепції розроблюваного застосунку, який 
  15 
 ЧДТУ 262355.001 ПЗ 
спрямований на більш індивідуалізований підхід до контролю здоров’я. 
Рисунок 1.4 – Вигляд додатку FitBit 
 
 1.3. Використання сучасних технологій для розв’язання 
поставленної задачі 
 Для реалізації мобільного застосунку YourHealth використано сучасні 
технології платформи iOS, що забезпечують високу продуктивність, 
стабільність роботи та зручність використання.  
1 Frontend та інтерфейс користувача: (прибрати крапки після 
нумерованого списку) 
Swift та SwiftUI використовуються для розробки інтерфейсу застосунку. 
Декларативний підхід SwiftUI дозволяє створювати сучасні користувацькі 
інтерфейси, спрощує підтримку програмного коду та забезпечує швидке 
внесення змін у процесі розробки. 
  16 
 ЧДТУ 262355.001 ПЗ 
2 Отримання даних про здоров’я:  
Apple HealthKit використовується для доступу до даних про показники 
активності користувача. За допомогою фреймворку застосунок отримує 
інформацію про кількість кроків, пройдену дистанцію та витрачені активні 
калорії, що дозволяє формувати статистику активності. 
3 Архітектура застосунку: 
Для організації програмного коду використовується архітектурний патерн 
MVVM (Model-View-ViewModel), який забезпечує розділення бізнес-логіки, 
моделей даних та інтерфейсу користувача. Це підвищує підтримуваність 
проєкту та спрощує його подальший розвиток. 
4 Зберігання даних: 
Налаштування користувача зберігаються локально на пристрої, що дозволяє 
використовувати застосунок без підключення до зовнішніх серверів та 
додаткових сервісів. 
1.3.2 Виклики і обмеження існуючих рішень.  
1 Обмеження персоналізації: Більшість популярних застосунків для 
моніторингу здоров’я, зокрема Apple Health, Google Fit, Fitbit та 
Samsung Health, незважаючи на широкий набір функцій, мають певні 
обмеження щодо адаптації інтерфейсу та налаштування функціоналу 
під потреби конкретного користувача. Зокрема, не завжди існує 
можливість відображати лише ті показники, які є пріоритетними для 
людини. Крім того, частина розширених можливостей та 
аналітичних інструментів часто доступна лише в межах платних 
підписок. 
2 Продуктивність і швидкодія: Окремі застосунки можуть 
демонструвати зниження швидкодії під час роботи з великими 
обсягами накопичених даних. Це особливо помітно у випадках 
тривалого використання, коли система повинна обробляти значну 
історію активності користувача. Затримки під час оновлення 
  17 
 ЧДТУ 262355.001 ПЗ 
інформації або пошуку даних можуть негативно впливати на 
зручність використання. 
3 Обмеження інтеграцій: Незважаючи на підтримку різноманітних 
пристроїв, таких як смартгодинники, фітнес-трекери та інші сенсори, 
інтеграція між різними джерелами даних не завжди є повною. У 
деяких випадках інформація може відображатися некоректно або 
окремі пристрої можуть не підтримуватися системою. 
4 Якість мобільного досвіду: Системні застосунки, такі як Apple 
Health, мають перевагу завдяки глибокій інтеграції з операційною 
системою. Водночас сторонні рішення не завжди забезпечують 
однаковий рівень зручності та інтуїтивності інтерфейсу. Для 
користувача важливим є швидкий доступ до необхідної інформації 
без зайвих дій та перевантаження елементами керування. 
5 Відсутність прогнозування та «розумних» рекомендацій: Значна 
частина сучасних застосунків виконує переважно функцію збору та 
відображення даних. При цьому можливості аналізу довгострокових 
тенденцій або формування персоналізованих рекомендацій 
залишаються обмеженими. 
6 Обмежена масштабованість: Багатофункціональні рішення, які 
працюють із великою кількістю різнорідних даних, можуть 
стикатися зі складнощами під час подальшого розширення 
функціональності та забезпечення стабільної роботи на різних 
пристроях. 
 Зазначені обмеження створюють передумови для розробки більш 
зручного та персоналізованого інструменту моніторингу здоров’я. Застосунок 
YourHealth, реалізований із використанням SwiftUI та Apple HealthKit, 
розробляється з урахуванням виявлених недоліків існуючих рішень і 
спрямований на забезпечення простого, зрозумілого та ефективного 
контролю активності користувача. 
  18 
 ЧДТУ 262355.001 ПЗ 
 
ВИСНОВКИ ДО ПЕРШОГО РОЗДІЛУ
 У першому розділі було проведено аналіз сучасних підходів до 
моніторингу здоров’я та активності користувачів за допомогою мобільних 
застосунків. Розглянуто найбільш поширені рішення, серед яких Apple Health, 
Google Fit, Samsung Health та Fitbit, а також проаналізовано їхні 
функціональні можливості, переваги та недоліки. 
 За результатами аналізу визначено основні проблеми існуючих 
застосунків, серед яких обмежені можливості персоналізації, недостатній 
рівень аналітичних можливостей, складності інтеграції окремих пристроїв та 
відсутність повноцінного індивідуального підходу до користувача. Також 
виявлено певні труднощі, пов’язані з продуктивністю при роботі з великими 
обсягами даних і зручністю користувацького інтерфейсу. 
 У розділі обґрунтовано доцільність використання сучасного 
технологічного стеку, що включає SwiftUI для побудови інтерфейсу 
користувача, HealthKit для отримання даних про активність користувачів та 
архітектурний підхід MVVM для організації програмного коду. Використання 
зазначених технологій забезпечує високу продуктивність застосунку, 
зручність підтримки та можливість подальшого розвитку проєкту. 
 На основі проведеного дослідження сформовано концепцію створення 
iOS-застосунку YourHealth, орієнтованого на моніторинг активності 
користувача. Запропоноване рішення враховує виявлені недоліки наявних 
аналогів та спрямоване на забезпечення простого, зрозумілого й сучасного 
користувацького досвіду.  
  
  19 
 ЧДТУ 262355.001 ПЗ 
РОЗДІЛ 2 ВПРОВАДЖЕННЯ РЕЗУЛЬТАТІВ ДОСЛІДЖЕНЬ У 
ПРАКТИКУ ПРОЕКТУВАННЯ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ 
ІНФОРМАЦІЙНИХ СИСТЕМ 
 
 2.1 Моделювання предметної області
 Моделювання предметної області є невідʼємним кроком у процесі 
створення програмних продуктів — воно дає змогу формалізувати розуміння 
того, як працює система, встановити головні об'єкти, їхні атрибути та 
взаємодію між ними. В рамках цієї роботи було розроблено iOS-застосунок 
YourHealth, призначений для контролю за здоров'ям користувача, 
встановлення особистих орієнтирів та моніторингу їх виконання. 
 Серед ключових складових предметної галузі — збір персональних 
health-показників (тривалість сну, кількість випитої води, емоційний стан, 
рухова активність), налаштування індивідуальних цілей, наочне відображення 
динаміки за обраний період, а також збереження даних із можливістю 
подальшої синхронізації. Відмінною рисою застосунку є персоналізованість 
— інтерфейс підлаштовується під конкретного користувача, не нав'язуючи 
готових шаблонів для відстеження. 
 Моделювання ставило за мету побудувати логічну схему роботи 
застосунку, що охоплює профіль користувача, health-метрики, цілі та 
механізми аналітичної обробки інформації. Проведена робота заклала 
підґрунтя для подальшого проектування архітектури, дала змогу чітко 
окреслити функціональні блоки та гарантувати внутрішню несуперечливість 
системи.
 
2.1.1 Предметна область моделювання. Модель предметної області. 
Словник предметної області 
 Предметна область YourHealth включає реєстрацію особистих health-
даних, фіксацію показників фізичної активності, психоемоційного стану, сну 
  20 
 ЧДТУ 262355.001 ПЗ 
та водного балансу, постановку цілей, генерацію статистичних звітів і зручне 
представлення інформації у вигляді графіків та дашбордів. Застосунок 
передбачає ручне внесення даних, їх збереження безпосередньо на пристрої з 
перспективою хмарного резервування, а також актуалізацію інтерфейсу в 
режимі реального часу. Передбачено перегляд прогресу за довільні часові 
відрізки, побудову зведеної аналітики та гнучке налаштування функцій під 
потреби конкретної людини. 
 Значну увагу приділено простоті навігації, логічній структурі екранів та 
швидкому виходу на ключові функції — все це спрямовано на зменшення 
розумового навантаження й покращення загального досвіду взаємодії з 
додатком. Модульна архітектура відкриває можливість безболісного 
розширення набору відстежуваних показників, підключення сторонніх 
сервісів (наприклад, HealthKit) та нарощування функціоналу відповідно до 
нових вимог і сценаріїв. 
Рисунок 2.1 – Модель предметної області застосунку “YourHealth” 
 
Модель предметної області застосунку охоплює головні складові системи: 
профіль користувача, health-метрику, персональну ціль, фіксацію активності, 
аналітичний модуль та зв'язки між ними. Усі компоненти функціонують у 
  21 
 ЧДТУ 262355.001 ПЗ 
межах клієнт-серверної взаємодії, де локальна частина реалізована засобами 
SwiftUI, а хмарна інфраструктура забезпечує зберігання та синхронізацію 
даних. Інтерфейс побудовано на базі SwiftUI, що гарантує адаптивність та 
природність взаємодії з користувачем. 
Словник предметної області 
• користувач — зареєстрована особа, яка працює з додатком: вносить 
дані про здоров'я, визначає цілі та аналізує власну статистику; 
• показник здоров'я — окремий запис конкретного параметра (сон, 
настрій, вода, активність тощо) із зазначенням дати та відповідного 
значення; 
• запис активності — внесення користувачем числового або якісного 
значення певного показника за конкретний день; 
• ціль — індивідуальний орієнтир, сформований користувачем 
(наприклад, «випити 2 л води»), що містить опис, одиницю виміру та 
стан виконання; 
• аналітика — компонент системи, що збирає й узагальнює дані за 
заданий проміжок часу (день, тиждень, місяць) та відображає їх у 
вигляді графічних звітів; 
• дашборд — головний екран застосунку з актуальними показниками та 
їх візуалізацією, доступний після входу в систему; 
• SwiftUI — Apple-фреймворк для декларативної побудови інтерфейсів 
iOS-застосунків, застосований для створення адаптивного UI; 
• Firebase Firestore — документоорієнтована хмарна база даних для 
збереження записів активності, цілей та профільних даних; 
• MVVM — архітектурний патерн (Model-View-ViewModel), що 
забезпечує чітке розмежування між даними, бізнес-логікою та 
інтерфейсом для зручності підтримки й тестування; 
• Glassmorphism — візуальний стиль із напівпрозорими шарами, що 
надає інтерфейсу ефект матового скла та підвищує естетичність 
  22 
 ЧДТУ 262355.001 ПЗ 
сприйняття. 
2.1.2 Елементи моделювання предметної області 
 У цьому підрозділі наведено розгорнутий опис базових сутностей, що 
формують концептуальну модель застосунку, із переліком їхніх атрибутів та 
зв'язків. Чітке розуміння цих сутностей є передумовою побудови гнучкої та 
масштабованої архітектури, що гарантує стабільну роботу iOS-застосунку 
YourHealth на основі SwiftUI. 
1. Користувач (User) 
Опис: Фізична особа, яка користується застосунком — проходить 
автентифікацію, вносить health-дані, формулює цілі та переглядає власну 
аналітику. 
Атрибути: 
•  user_id — унікальний ідентифікатор у системі; 
• email — електронна адреса, пов'язана з обліковим записом; 
• registration_date — дата реєстрації в системі; 
• last_login — час останнього сеансу роботи з додатком. 
2. Показник здоров’я (HealthEntry) 
Опис: Запис, що відображає фізичний або психологічний стан користувача за 
певну дату. 
Атрибути: 
• entry_id — унікальний ідентифікатор запису; 
• user_id — прив'язка до конкретного користувача; 
• entry_type — категорія показника (сон, настрій, вода, активність тощо); 
• value — чисельне або текстове значення параметра; 
• timestamp — дата й час фіксації запису. 
3. Ціль (Goal) 
Опис: Персональне завдання, яке користувач ставить перед собою для 
формування корисної звички або отримання конкретного результату. 
  23 
 ЧДТУ 262355.001 ПЗ 
Атрибути: 
• goal_id — унікальний ідентифікатор цілі; 
• user_id — власник цілі; 
• title — назва цілі (наприклад, «5 000 кроків»); 
• target_value — бажаний результат; 
• current_value — поточний прогрес; 
• status — стан виконання (active, completed, failed); 
• created_at — дата постановки цілі. 
4. Аналітика (AnalyticsResult) 
Опис: Зведені дані, що обчислюються на основі накопичених записів і 
використовуються для побудови графіків та аналітичних звітів. 
Атрибути: 
• user_id — ідентифікатор власника даних; 
• period — обраний часовий діапазон (день, тиждень, місяць); 
• data_set — агреговані значення за відповідним типом показника; 
• insights — інтерпретовані висновки (наприклад, «покращення сну на 
20%»). 
5. Інтерфейс (DashboardView) 
Опис: Центральний екран застосунку, що відображає поточні дані 
користувача, графіки динаміки та актуальні цілі. 
Атрибути: 
• visible_entries — останні зафіксовані записи; 
• active_goals — перелік цілей у процесі виконання; 
• chart_data — набір даних для побудови візуалізацій. 
Взаємозв'язки між об'єктами: 
1. Користувач (User) ↔ Показники здоров’я (HealthEntry) 
• Один користувач може мати необмежену кількість health-записів; 
• кожен запис належить виключно одному користувачу. 
Взаємозв'язок: 1 користувач → багато запитів (One-to-Many). 
  24 
 ЧДТУ 262355.001 ПЗ 
 2. Запит (Request) ↔ Цілі (Goal) 
• Один користувач може сформулювати довільну кількість цілей; 
• кожна ціль закріплена за конкретним користувачем. 
Взаємозв'язок: 1 користувач → багато цілей (One-to-Many) 
3. Користувач (User) ↔ Аналітика (AnalyticsResult) 
• На основі записів кожного користувача формується відповідний 
аналітичний звіт; 
• аналітика будується динамічно під обраний період. 
Взаємозв'язок: 1 користувач → 1 набір аналітики за період (One-to-One per 
Period) 
4. Показники здоров’я (HealthEntry) ↔ Аналітика (AnalyticsResult) 
• Аналітичні результати обчислюються на підставі сукупності 
записів певного типу за заданий проміжок; 
• кожен запис може входити до агрегованої вибірки. 
Взаємозв'язок: багато записів → одна аналітика (Many-to-One) 
5. Цілі (Goal) ↔ Показники здоров’я (HealthEntry) 
• Кожна ціль прив'язана до певного типу показника (вода, кроки 
тощо); 
• ступінь досягнення визначається через аналіз відповідних 
записів. 
Взаємозв'язок: 1 ціль → багато записів відповідного типу (One-to-Many, 
фільтрований) 
6. Цілі (Goal) ↔ Статистика (AnalyticsResult) 
• Прогрес кожної цілі відображається на дашборді поруч із 
відповідними аналітичними даними; 
• виконання оцінюється у відсотках від цільового значення. 
Взаємозв'язок: 1 ціль → 1 аналітика цілі (One-to-One) 
2.1.3 Робоча область моделювання 
  25 
 ЧДТУ 262355.001 ПЗ 
 Робоча область моделювання застосунку YourHealth включає 
сукупність технічних і логічних рішень, необхідних для забезпечення 
коректної, надійної та зручної роботи з програмним продуктом. Ключовими 
складовими є декларативний UI на SwiftUI, архітектура MVVM та локальне 
збереження даних із перспективою хмарної синхронізації. 
 Принципово важливим є розподіл відповідальностей між рівнями 
системи: модель відповідає за структуру даних, ViewModel — за їх обробку й 
актуалізацію стану, а View — за візуальне представлення та реагування на дії 
користувача. Реактивний механізм SwiftUI забезпечує автоматичне оновлення 
інтерфейсу при зміні даних у ViewModel, що підвищує передбачуваність і 
стабільність системи. 
 Окрім цього, впроваджено структуровану модель роботи з даними: 
кожен health-запис проходить валідацію перед збереженням, що убезпечує від 
некоректних значень і гарантує цілісність інформації. Аналітичний модуль 
агрегує записи та виводить результати у графічному вигляді, спрощуючи 
сприйняття прогресу користувачем. 
 Для формалізації логіки та структури системи розроблено комплект 
UML-діаграм: 
• Діаграма класів — відображає основні сутності, їхні атрибути та 
зв'язки між об’єктами; 
• Діаграма прецедентів — описує типові сценарії взаємодії 
користувача з функціоналом застосунку; 
• Діаграма компонентів — ілюструє архітектурну будову 
клієнтської частини та її зовнішні залежності; 
• Діаграма діяльності — відтворює послідовність дій при внесенні 
показників, перегляді аналітики та редагуванні цілей; 
• Діаграма послідовності — показує взаємодію між View, 
ViewModel і сховищем даних у процесі запиту й оновлення інформації; 
• Скінчений автомат — описує можливі стани цілі (створено → 
  26 
 ЧДТУ 262355.001 ПЗ 
активна → досягнута або скасована). 
 Загалом модельна частина проєкту формує цілісне уявлення про логічну 
й структурну організацію YourHealth, спрощує процеси розробки, тестування 
та супроводу, а також слугує повноцінною технічною документацією 
внутрішніх механізмів системи. 
2.2 Формування та аналіз вимог 
 У цьому розділі розглядається процес визначення та аналізу вимог до 
мобільного застосунку YourHealth — один із найважливіших етапів у 
проєктуванні програмного продукту. Саме вимоги окреслюють, які завдання 
має вирішувати система, який функціонал вона надає користувачу та якими 
принципами керується при роботі з даними. Грамотно сформульовані 
функціональні та нефункціональні вимоги є основою для створення 
надійного, ефективного та зручного інструменту персонального моніторингу 
здоров'я, орієнтованого на індивідуальні потреби. 
2.2.1 Предметна область моделювання. Модель предметної області. 
Словник предметної області 
Первинні вимоги визначаються виходячи із загального призначення системи 
та кола задач, які вона покликана вирішувати. Для застосунку YourHealth вони 
такі: 
• система має надавати зручний інструментарій для фіксації 
персональних health-показників (сон, активність, настрій, гідратація 
тощо); 
• користувач повинен мати змогу встановлювати особисті цілі та 
відстежувати прогрес у їх досягненні; 
• інтерфейс має бути простим, адаптивним, без перевантаження 
елементами; 
• усі дані повинні зберігатися у хмарному сховищі з можливістю доступу 
з різних пристроїв; 
  27 
 ЧДТУ 262355.001 ПЗ 
• система повинна забезпечити візуальну аналітику у вигляді графіків, 
що показують динаміку змін. 
Детальні вимоги конкретизують реалізацію окремих функціональних 
компонентів у межах SwiftUI та відповідної бізнес-логіки: 
• система має підтримувати ручне внесення health-показників із 
вказанням дати та значення; 
• користувач повинен отримувати актуальний дашборд із динамічно 
оновлюваними даними; 
• при виконанні цілі система має повідомляти користувача (наприклад, 
через анімацію або зміну статусу); 
• дані мають зберігатися локально без втрати інформації при 
перезапуску застосунку; 
• додаток має функціонувати у світлому режимі з glassmorphism-
дизайном. 
Вимоги замовника – визначають очікувані можливості системи з точки зору 
кінцевого користувача: 
• підтримка ручного введення показників здоров'я із зазначенням дати та 
відповідного значення; 
• наявність динамічного дашборду з актуальними даними; 
• сповіщення про досягнення цілі через анімацію або зміну позначки 
статусу; 
• надійне збереження даних без їх втрати; 
• світлий інтерфейс у стилі glassmorphism. 
Вимоги розробника – ґрунтуються на технічних аспектах побудови 
архітектури застосунку: 
• використання SwiftUI як основного фреймворку для побудови 
інтерфейсу; 
• локальне збереження даних із перспективою інтеграції Firebase 
Firestore; 
  28 
 ЧДТУ 262355.001 ПЗ 
• організація логіки за патерном MVVM; 
• конфіденційність — усі дані зберігаються виключно в межах 
приватного облікового запису без публічного доступу; 
• реактивне оновлення інтерфейсу при зміні стану ViewModel; 
• модульна структура проєкту з можливістю масштабування у 
майбутньому. 
Функціональні вимоги – визначають конкретний функціонал, який має бути 
реалізований у застосунку: 
• створення, редагування та видалення цілей (назва, значення, тип); 
• збереження та зчитування даних; 
• перегляд прогресу через дашборд і статистичний екран; 
• графіки динаміки за день, тиждень та місяць; 
• обробка плейлистів – поетапне завантаження треків; 
• сповіщення користувача при досягненні встановлених цілей. 
Нефункціональні вимоги – стосуються якісних характеристик роботи 
застосунку: 
• Продуктивність: оновлення інтерфейсу після внесення даних — не 
довше 300 мс; 
• Безпека: захист персональних даних, шифрування збережених записів; 
• Надійність: збереження даних при повторному запуску або в умовах 
нестабільного з'єднання; 
• Масштабованість: можливість розширення набору показників і 
функцій без кардинальної перебудови архітектури; 
• Зручність: адаптивний інтерфейс під різні розміри екранів, підтримка 
виключно світлого режиму, стиль glassmorphism. 
2.2.2 Елементи моделювання предметної області 
 Діаграма прецедентів — одна з ключових UML-діаграм, що 
застосовується для опису функціональних вимог з позиції взаємодії системи з 
  29 
 ЧДТУ 262355.001 ПЗ 
користувачем. У контексті YourHealth вона дає змогу наочно відобразити всі 
можливі сценарії використання застосунку. 
 Діаграма показує, яким чином користувач (актор) взаємодіє з системою: 
реєструється, вносить health-показники, формулює особисті цілі, переглядає 
аналітику тощо. Це допомагає окреслити обсяг функціоналу та встановити 
межі відповідальності системи щодо кожного сценарію. 
Ключовими елементами діаграми є: 
• Актори — основним актором системи є Користувач, який взаємодіє з 
усіма головними функціями застосунку. У подальших версіях можливе 
додавання інших ролей, однак у базовій реалізації діє лише один актор; 
• Прецеденти (випадки використання) — функції, доступні користувачу: 
реєстрація та авторизація, внесення показників, постановка цілей, 
перегляд прогресу, отримання аналітики тощо; 
• Зв'язки — лінії між актором і прецедентами, що відображають напрями 
взаємодії користувача із системою. 
 Діаграма прецедентів є зручним інструментом на початковому етапі 
проєктування, оскільки дозволяє чітко зафіксувати вимоги до системи та 
очікувану поведінку з точки зору користувача. 
 Нижче наведено перелік основних прецедентів, що відображають 
функціональні можливості застосунку YourHealth: 
1. Реєстрація та вхід у систему 
Актори: Користувач. 
Опис: Користувач створює обліковий запис або входить у свій профіль через 
email. 
Ключові кроки взаємодії: 
1. Користувач відкриває застосунок. 
2. Обирає «Sign Up» або «Login». 
3. Вводить адресу електронної пошти та пароль. 
4. Натискає кнопку підтвердження. 
  30 
 ЧДТУ 262355.001 ПЗ 
5. У разі успіху потрапляє на головний екран. 
Результат: користувач авторизується в системі та отримує доступ до 
персональних даних. 
Нижче наведено перелік основних прецендентів, що відображають 
функціональні можливості мобільного застосунку YourHealth: 
2. Реєстрація та вхід у систему 
Актори: Користувач. 
Опис: Користувач реєструє новий обліковий запис або здійснює вхід до 
наявного профілю за допомогою електронної пошти. 
Кроки користувача: 
1. Запускає застосунок на пристрої. 
2. Обирає опцію “Sign Up” або “Login”. 
3. Заповнює поля електронної адреси та пароля. 
4. Підтверджує введені дані натисканням відповідної кнопки. 
5. За умови успішної перевірки переходить до головного екрану. 
6. Отримує повний доступ до персонального профілю та збереження даних 
Опис Прецедентів 
2. Додавання показника здоров’я 
Актори: Користувач. 
Опис: Користувач самостійно вносить новий запис про стан свого здоров'я. 
Кроки користувача: 
1. На головному екрані обирає опцію «Додати запис». 
2. Вибирає категорію показника (вода, настрій, сон, активність). 
3. Задає числове значення та дату запису. 
4. Підтверджує збереження даних. 
Результат: запис зберігається в системі та з'являється у дашборді й 
аналітичному розділі. 
3. Створення особистої цілі 
Актори: Користувач. 
  31 
 ЧДТУ 262355.001 ПЗ 
Опис: Користувач формулює нову персональну ціль для відстеження 
прогресу. 
 
Результат: користувач успішно проходить автентифікацію та отримує доступ 
до особистого кабінету. 
Рисунок 2.2 – Діаграма прецедентів iOS-додатку 
  32 
 ЧДТУ 262355.001 ПЗ 
Кроки користувача: 
1. Переходить до розділу «Цілі». 
2. Натискає кнопку «Створити ціль». 
3. Заповнює поля назви, типу та цільового значення. 
4. Зберігає створену ціль. 
Результат: ціль додається до системи та стає доступною для відстеження 
прогресу. 
4. Отримання сповіщення про досягнення цілі 
Актори: Користувач. 
Опис: Система автоматично повідомляє користувача в момент виконання 
встановленої цілі. 
Кроки користувача: 
1. Система регулярно отримує оновлені показники здоровʼя. 
2. Система відстежує та аналізує поточний прогрес цілі. 
3. Після досягнення порогового значення — формується відповідне 
повідомлення або анімація. 
Результат: користувач отримує сповіщення про успішне виконання цілі. 
5. Відображення помилки введення 
Актори: Користувач. 
Опис: Користувач вводить некоректне значення показника (наприклад, 
від'ємне число або значення, що виходить за допустимі межі). 
Кроки користувача: 
1. Користувач вручну вводить дані у відповідне поле. 
2. Система виконує валідацію введених значень. 
3. У разі виявлення помилки — виводиться пояснювальне 
повідомлення. 
Результат: користувач отримує інформацію про некоректне значення та має 
змогу його виправити. 
  33 
 ЧДТУ 262355.001 ПЗ 
2.3 Проектування логічної структури програмного комплексу 
 Проєктування логічної структури програмного комплексу є одним із 
визначальних етапів розробки, на якому окреслюються основні функціональні 
складові системи, їхні завдання, роль в архітектурі та характер взаємодії між 
ними. На цьому етапі формується абстрактна модель програмного 
забезпечення, що описує логіку обробки даних, потоки інформації та 
механізми взаємодії між модулями — без прив'язки до конкретної мови 
програмування чи технічних деталей реалізації. 
 Основна мета логічного проєктування полягає у побудові узагальненої 
структури, що слугує фундаментом для подальшого фізичного проєктування 
та безпосередньої реалізації. Така модель дає чітке уявлення про 
функціональні можливості системи, дозволяє виявити потенційні слабкі місця 
ще до початку написання коду та допомагає зосередитися на логіці роботи 
програми в цілому. 
 Окрім цього, продумана логічна структура суттєво спрощує процес 
тестування — вона дає змогу будувати модульні та інтеграційні тести на 
основі вже визначених функціональних одиниць. Добре спроєктована 
архітектура також полегшує подальше обслуговування та розширення 
системи, що є особливо важливим для проєктів із тривалим циклом 
експлуатації або запланованим нарощуванням функціоналу. 
 Таким чином, логічне проєктування виконує роль сполучної ланки між 
аналізом вимог і технічною реалізацією — забезпечуючи підґрунтя для 
якісної, структурованої та гнучкої архітектури програмного забезпечення. 
Опис кожної таблиці з атрибутами: 
1. User (Користувач) 
Містить базові відомості про зареєстрованого користувача застосунку: 
• user_id: string — унікальний ідентифікатор облікового запису 
користувача; 
  34 
 ЧДТУ 262355.001 ПЗ 
• email: string — адреса електронної пошти, прив'язана до профілю; 
• registration_date: datetime — дата й час створення облікового запису; 
• last_login: datetime — дата й час останнього сеансу в застосунку. 
 
Рисунок 2.3 – Спрощена діаграма класів додатку здоровʼя 
1 Health Entry (Показник здоровʼя) 
Відображає окремий запис про самопочуття або фізичну активність 
користувача: 
• entry_id: string — унікальний ідентифікатор конкретного запису; 
• user_id: string — посилання на користувача, якому належить цей запис; 
• type: string — категорія показника (наприклад: sleep, mood, water, 
activity); 
• value: float — числове або умовне значення параметра (наприклад, 
кількість годин сну); 
  35 
 ЧДТУ 262355.001 ПЗ 
• timestamp: datetime — дата й час фіксації запису. 
Рисунок 2.4 – Діаграма класів додатку здоровʼя 
 
2 Goal (Ціль) 
Зберігає дані про персональні цілі, які користувач визначає для себе: 
• goal_id: string — унікальний ідентифікатор цілі; 
• user_id: string — посилання на користувача, якому належить ціль; 
• title: string — назва цілі; 
• type: string — категорія пов'язаного показника (наприклад: danskvand); 
• target_value: float — бажане цільове значення; 
• status: string — поточний стан виконання (наприклад: active, completed, 
failed); 
• created_at: datetime — дата постановки цілі. 
  36 
 ЧДТУ 262355.001 ПЗ 
3 AnalyticsResult (Аналітика) 
Слугує для побудови статистичних звітів на основі накопичених записів 
користувача: 
• analytics_id: string — унікальний ідентифікатор аналітичного блоку; 
• user_id: string — посилання на користувача, якому належать дані; 
• period: string — часовий діапазон вибірки (day, week, month); 
• data: map<string, float> — агреговані значення в розрізі типів 
показників; 
• generated_at: datetime — дата й час формування аналітичного звіту. 
4 Зв’язки між таблицями: 
• Один User може мати довільну кількість записів HealthEntry — зв'язок 
One-to-Many; 
• Один User може створити необмежену кількість Goal — зв'язок One-
to-Many; 
• Кожен Goal може бути пов'язаний із множиною HealthEntry за 
відповідним типом показника — фільтрований зв'язок Many-to-Many 
(через поле типу); 
• Кожен User має один AnalyticsResult для кожного окремого періоду 
— зв'язок One-to-One per Period; 
• AnalyticsResult обчислюється на підставі сукупності записів 
HealthEntry — зв'язок Many-to-One. 
2.3.2 Діаграма пакетів 
 Логічна структура мобільного застосунку YourHealth організована у 
вигляді чітко розмежованих модулів, кожен із яких відповідає за певну 
функціональну ділянку системи. Такий підхід забезпечує розподіл 
відповідальностей між компонентами застосунку — ключовий принцип 
побудови якісної, зручної в обслуговуванні та масштабованої програмної 
системи.
 
  37 
 ЧДТУ 262355.001 ПЗ 
Рисунок 2.5 – Діаграма пакетів додатку здоровʼя 
Застосунок побудований за патерном MVVM (Model-View-ViewModel), який 
дозволяє чітко відокремити: 
• Model — роботу зі структурами даних (показники здоров'я, цілі, 
аналітика); 
• ViewModel — бізнес-логіку, обробку введень та керування 
станом інтерфейсу; 
  38 
 ЧДТУ 262355.001 ПЗ 
• View — побудову користувацького інтерфейсу засобами SwiftUI. 
 Кожен модуль виконує конкретно визначену функцію — збереження 
даних, генерація графіків, валідація введених значень або керування статусом 
цілей.  Це спрощує орієнтування в структурі проєкту, прискорює 
внесення змін і полегшує модульне тестування та налагодження. 
 Така організація логічної структури забезпечує гнучкість, повторне 
використання коду та створює передумови для подальшого розвитку системи 
— зокрема, інтеграції з Apple HealthKit або додавання нових типів показників. 
1. Пакет app 
Файл:  main.swift 
Призначення: Точка входу до застосунку. Ініціалізує робоче середовище, 
налаштовує стартові екрани та виконує початкову перевірку авторизації. 
Зв’язки: 
• Звертається до сервісу автентифікації (AuthManager). 
• Завантажує головний екран (DashboardView). 
• Ініціалізує менеджер даних (HealthDataManager). 
2. Пакет features 
Файли: 
• LoginView.swift, RegistrationView.swift, AuthManager.swift — 
реєстрація, вхід та вихід користувача; 
• HealthDataManager.swift, ActivityTracker.swift, GoalManager.swift 
— збір, обробка та збереження health-даних і активності; 
• DashboardView.swift, StatisticsView.swift, SettingsView.swift — 
відображення інформації та налаштування застосунку. 
3. Пакет config 
Файл: config.swift — конфігурація застосунку: параметри HealthKit, інтервали 
оновлення, ключі API (за потреби), параметри інтерфейсу (теми, локалізація). 
Призначення: зберігає налаштування, необхідні для запуску та коректної 
роботи застосунку. 
  39 
 ЧДТУ 262355.001 ПЗ 
Зв’язки: 
• використовується під час ініціалізації для завантаження 
конфігураційних параметрів. 
4. Пакет utils 
Допоміжні класи та функції: 
• Форматування дат, часу 
• Конвертація одиниць (кроки та калорії) 
• Логування 
• Валідація введених даних 
Загальний принцип взаємодії: 
1. Користувач запускає застосунок → main.swift ініціалізує всі сервіси 
та відкриває LoginView або DashboardView (якщо сесія активна). 
2. AuthManager виконує логіку реєстрації та входу. 
3. Після автентифікації HealthDataManager запитує дозвіл на доступ до 
HealthKit і розпочинає збір даних. 
4. ActivityTracker збирає й опрацьовує дані про активність, які 
передаються до GoalManager для контролю виконання цілей. 
5. UI-компоненти (Dashboard, Statistics) представляють інформацію у 
вигляді графіків, списків та статистики. 
6. Дані зберігаються локально через DataPersistenceService; за потреби 
синхронізуються із зовнішнім сховищем через NetworkService. 
2.4 Архітектурне проектування 
 Архітектурне проектування застосунку YourHealth передбачає 
побудову структурної моделі, що визначає логічні компоненти системи, їхні 
функціональні обов'язки та характер взаємодії між ними. Це дає змогу 
організувати розробку таким чином, щоб гарантувати масштабованість, 
гнучкість і стабільність роботи застосунку в умовах розширення функціоналу. 
 Основою архітектурного рішення обрано патерн MVVM (Model-View-
  40 
 ЧДТУ 262355.001 ПЗ 
ViewModel) — оптимальний варіант для iOS-застосунків на базі SwiftUI. Він 
забезпечує чіткий розподіл відповідальностей: 
• Model — відповідає за роботу з даними, їх збереження та обробку; 
• View — UI-компоненти, що відображають інформацію користувачу; 
• ViewModel — проміжний шар, що обробляє бізнес-логіку, готує дані 
для відображення та реагує на дії користувача. 
Архітектура також передбачає набір сервісів для взаємодії із зовнішніми 
ресурсами — Apple HealthKit, системою локального збереження даних (Core 
Data або Realm) та механізмами сповіщень. 
 Взаємодія між компонентами реалізована через чітко визначені 
інтерфейси та протоколи, що забезпечує високу модульність і можливість 
заміни окремих частин без впливу на решту системи. 
 Такий підхід сприяє: 
• підвищенню якості коду та спрощенню тестування; 
• легкому масштабуванню та впровадженню нових функцій; 
• зниженню технічного боргу та зручності супроводу. 
 Для графічного представлення архітектури розроблено комплект UML-
діаграм, що ілюструють структуру застосунку, послідовність взаємодій і 
життєві цикли ключових об'єктів. 
 Загалом архітектурне проектування YourHealth формує надійне 
підґрунтя для розробки, тестування та експлуатації, що відповідає як 
функціональним, так і нефункціональним вимогам. 
2.4.1 Діаграма компонентів 
 Аналіз ключових структурних елементів архітектури мобільного 
застосунку YourHealth охоплює розгляд основних модулів, що формують 
цілісну функціональну систему. Компонентна архітектура побудована 
відповідно до принципів модульності, розподілу відповідальностей і 
гнучкості, що спрощує масштабування та підтримку застосунку. 
  41 
 ЧДТУ 262355.001 ПЗ 
 Система організована у кілька логічних рівнів: інтерфейс користувача 
(UI), бізнес-логіка (ViewModels та менеджери), сервіси доступу до системних 
ресурсів і сховища даних. 
1. User Interface (UI): 
• Опис: Графічний інтерфейс, реалізований засобами SwiftUI. 
• Функції: відображення health-даних, графіків і цілей; надання форм для 
реєстрації, авторизації та введення параметрів; взаємодія з ViewModel 
через data-binding. 
2. ViewModels (MVVM посередники): 
• Опис: Проміжний шар між UI та бізнес-логікою, що готує дані для 
відображення та обробляє події користувача. 
• Функції: отримання даних із моделей і сервісів; реакція на взаємодії 
користувача (натискання, оновлення); валідація введених значень. 
3. HealthDataManager: 
• Опис: Відповідає за збір та обробку health-даних користувача. 
• Функції: запит доступу до HealthKit, отримання й агрегація показників 
активності, передача даних до ViewModel. 
4. GoalManager: 
• Опис: Відповідає за керування персональними цілями користувача. 
• Функції: додавання та редагування цілей (наприклад, пройти 8500 
кроків), відстеження прогресу, генерація звітів і нагадувань. 
5. DataPersistenceService 
• Опис: Сервіс локального збереження даних. 
• Функції: робота з Core Data або Realm, кешування статистики, цілей і 
налаштувань, локальне зберігання історії активності. 
6. NotificationService 
• Опис: Компонент для керування локальними сповіщеннями. 
• Функції: надсилання нагадувань про активність, гідратацію та 
виконання цілей; планування повторюваних нотифікацій. 
  42 
 ЧДТУ 262355.001 ПЗ 
7. External Interfaces (Apple HealthKit, System APIs) 
• Опис: Інтерфейс взаємодії з системними ресурсами iOS. 
• Функції: надання доступу до health-даних, робота з фоновими задачами 
та системними правами. 
8. AuthManager 
• Опис: Модуль автентифікації та керування сесіями. 
• Функції: реєстрація нового користувача, вхід і вихід із системи, 
збереження токенів сесій у Keychain. 
Зв'язки між компонентами: 
• UI ↔ ViewModels; 
• ViewModels ↔ HealthDataManager / GoalManager / AuthManager; 
• HealthDataManager ↔ HealthKit; 
• GoalManager ↔ DataPersistenceService; 
• AuthManager ↔ Keychain; 
• NotificationService ↔ iOS Notification Framework. 
2.4.2 Розгортання програмної системи на апаратних засобах. Діаграма 
розгортання 
Опис розгортання програмної системи на апаратних засобах: 
 Застосунок YourHealth розгортається як мобільний iOS-продукт, що 
взаємодіє з хмарною інфраструктурою для збереження даних, автентифікації 
користувачів та формування аналітики. Архітектура розгортання охоплює 
клієнтську частину — iOS-застосунок — та серверні компоненти, розміщені 
у хмарному середовищі. 
1. Клієнтський пристрій: 
• Призначення: Запуск мобільного застосунку, збір і відображення 
даних, безпосередня взаємодія з користувачем. 
• Програмне забезпечення: iOS (SwiftUI), HealthKit API. 
2. Apple HealthKit: 
 
  43 
 ЧДТУ 262355.001 ПЗ 
 
Рисунок 2.6 – Діаграма компонентів додатку здоровʼя 
• Призначення: Локальний доступ до медичних і фітнес-показників, 
збережених на пристрої. 
  44 
 ЧДТУ 262355.001 ПЗ 
• Програмне забезпечення: Вбудований системний фреймворк iOS. 
3. Хмарний сервер (Backend): 
• Призначення: ЗЗберігання профілів користувачів, синхронізація 
даних між пристроями, обробка аналітики та керування сесіями. 
• Програмне забезпечення: Swift сервер. 
5. CI/CD система (наприклад, GitHub Actions):  
• Призначення: Автоматизація процесів збірки, тестування та 
публікації застосунку. 
• Функції: Автоматична генерація IPA-файлів, запуск юніт-тестів, 
публікація у TestFlight або App Store після внесення змін до 
репозиторію. 
6. Секрети і конфігурації:  
• Збереження: API-ключі, токени безпеки та параметри доступу до 
серверів зберігаються у захищених сховищах (Apple Keychain, 
GitHub Secrets). 
7. Локальне сховище: 
• Призначення: Тимчасове кешування даних користувача 
безпосередньо на пристрої (Core Data, Realm). 
Взаємодія між компонентами: 
• Користувач працює з застосунком на iPhone або iPad — вносить дані та 
переглядає статистику. 
• Застосунок звертається до HealthKit API для читання та запису 
медичних показників. 
• Дані передаються на хмарний сервер для резервного збереження та 
аналітичної обробки. 
• Сервер опрацьовує вхідні запити, зберігає профілі та підтверджує 
автентифікацію сесій. 
• CI/CD система автоматично оновлює тестові та продакшн-збірки 
застосунку після кожного коміту до репозиторію.
  45 
 ЧДТУ 262355.001 ПЗ 
 
Рисунок 2.7 – Діаграма розгортання додатку здоровʼя 
 
 2.5 Моделювання поведінки системи 
 Діаграма діяльності відображає логіку функціонування мобільного 
застосунку YourHealth — від моменту запуску до оновлення health-даних в 
інтерфейсі. Вона охоплює ключові процеси: автентифікацію, зчитування 
даних із HealthKit, відображення статистики та взаємодію з сервером. 
2.5.1 Діаграма діяльності 
Опис діаграми діяльності: 
1. Запуск взаємодії: 
  46 
 ЧДТУ 262355.001 ПЗ 
• Користувач відкриває YourHealth на iPhone. 
• Система перевіряє наявність активної сесії (локальна сесія або 
вхід через email/Apple ID). 
2. Авторизація користувача: 
• Якщо активної сесії немає — відкривається екран входу. 
• Користувач проходить автентифікацію (локально або через 
хмарний сервіс). 
• Після успішного входу здійснюється перехід на головний екран 
застосунку. 
3. Запит дозволу до HealthKit: 
• Застосунок запитує доступ до медичних даних (кроки, сон, вага, 
серцевий ритм тощо). 
• Якщо користувач надає дозвіл — дані зчитуються через HealthKit 
API. 
• Якщо у доступі відмовлено — застосунок відображає інструкцію 
щодо активації відповідних дозволів. 
4. Зчитування даних: 
• Система отримує необхідні типи показників (кількість кроків за 
день, середній пульс, тривалість сну тощо). 
• У фоновому режимі може ініціюватися синхронізація з сервером. 
5. Візуалізація: 
• Отримані дані обробляються та приводяться до потрібного 
формату. 
• Інтерфейс оновлюється: відображаються графіки, індикатори та 
аналітичні звіти. 
• Користувач отримує персоналізовану статистику на головному 
екрані. 
6. Збереження та синхронізація: 
• Локальна база даних оновлюється (Core Data). 
  47 
 ЧДТУ 262355.001 ПЗ 
• За наявності інтернет-з'єднання виконується синхронізація з 
хмарним сервером для резервного копіювання або аналітичної 
обробки. 
7. Завершення або фоновий режим: 
• Застосунок згортається або переходить у фоновий режим. 
• Стан поточної сесії та всі дані зберігаються. 
Основні етапи взаємодії описані нижче: 
1. Запуск та автентифікація 
• Користувач → застосунок: відкриває мобільний застосунок на 
пристрої; 
• Застосунок → Firebase Authentication: надсилає запит на перевірку 
статусу авторизації; 
• Firebase → застосунок: у разі підтвердження відкриває доступ до 
основного інтерфейсу. 
2. Введення показника здоров’я 
• Користувач → інтерфейс: обирає «Додати запис», вказує тип 
показника (наприклад, «сон») та вводить значення; 
• View → ViewModel: передає введені користувачем дані; 
• ViewModel → Firebase Firestore: надсилає запит на збереження 
запису; 
• Firestore → ViewModel: повертає підтвердження успішного 
запису; 
• ViewModel → View: оновлює стан інтерфейсу. 
3. Оновлення статистики 
• ViewModel → Firestore: формує запит на отримання записів за 
обраний часовий період; 
• Firestore → ViewModel: повертає масив відповідних даних; 
• ViewModel → модуль аналітики: опрацьовує отримані дані та 
формує аналітичний результат; 
  48 
 ЧДТУ 262355.001 ПЗ 
• View → ViewModel: відображає оновлені графіки та діаграми. 
4. Створення та контроль цілей 
• Користувач → View: формулює нову ціль (наприклад, «1,5 л води 
щодня»); 
• View → ViewModel → Firestore: передає та зберігає ціль у 
хмарному сховищі; 
• Periodically ViewModel → Firestore: виконує регулярну перевірку 
поточного прогресу; 
• ViewModel → View: у разі досягнення цілі — сповіщає 
користувача через анімацію або повідомлення. 
5. Синхронізація між пристроями 
• Firebase Firestore → застосунок: автоматично синхронізує 
актуальні дані під час кожного запуску; 
• Firebase → локальний інтерфейс: забезпечує відображення 
коректних даних незалежно від використовуваного пристрою. 
6. Помилки та обробка винятків 
• ViewModel → View: при виникненні помилки (некоректне 
значення або збій мережевого з'єднання) формує відповідне 
повідомлення; 
• View → користувач: інформує про необхідність повторної спроби 
або виправлення введених даних. 
2.5.3 Діаграма комунікації 
Основні етапи взаємодії: 
1. Введення даних користувачем 
Мета: Отримати від користувача інформацію про стан здоров'я для подальшої 
обробки.  
 
  49 
 ЧДТУ 262355.001 ПЗ 
 
Рисунок 2.8 – Діаграма діяльності додатку здоровʼя 
  50 
 ЧДТУ 262355.001 ПЗ 
2.5.2 Діаграма послідовності 
Рисунок 2.9 – Діаграма послідовності додатку здоровʼя 
Далі наведені ключові кроки взаємодії: 
1.Користувач запускає застосунок і переходить до екрану додавання 
запису. 
2.Вибирає категорію показника (сон, настрій, вода, активність 
тощо). 
3.Вводить числове значення та підтверджує його. 
4.View передає введені дані до ViewModel. 
5.ViewModel перевіряє коректність отриманих значень. 
6.За умови успішної валідації — надсилає дані до Firebase Firestore. 
7.Після підтвердження збереження інтерфейс оновлюється. 
2. Збереження даних у хмарі (Firestore) 
Мета: Надійно зберегти health-дані користувача у Firestore. 
  51 
 ЧДТУ 262355.001 ПЗ 
Ключові кроки взаємодії: 
1.ViewModel формує структуру документа (HealthEntry). 
2.Firestore SDK передає дані до відповідної колекції (entries/). 
3.Система отримує підтвердження збереження або повідомлення 
про помилку. 
4.У разі успіху — запис додається до локального масиву; у разі збою 
— відображається відповідне повідомлення. 
3. Генерація аналітики 
Мета: Сформувати статистику за обраний часовий діапазон. 
Далі наведені ключові кроки взаємодії: 
1.Користувач задає часовий діапазон (день, тиждень або місяць). 
2.ViewModel надсилає запит на вибірку записів із CoreData. 
3.Отримані дані розподіляються за типами та агрегуються. 
4.Результати передаються аналітичному модулю для побудови 
графіків. 
5.Інтерфейс оновлюється з відображенням візуальної статистики. 
4. Створення цілі користувачем 
Мета: Додати персональну ціль та відстежувати її виконання. 
Ключові кроки взаємодії: 
1.Користувач переходить до розділу «Цілі» → «Додати». 
2.Заповнює поля назви, типу показника та цільового значення. 
3.View передає введені дані до ViewModel. 
4.ViewModel зберігає ціль у Firestore (goals/). 
5.Система регулярно аналізує поточний прогрес і оновлює статус 
цілі. 
5. Виведення повідомлень про досягнення або помилки 
Мета: інформувати користувача про результат виконаних дій або виниклі 
помилки. 
Далі наведені ключові кроки взаємодії: 
  52 
 ЧДТУ 262355.001 ПЗ 
1.Успішна дія: після виконання логіки ViewModel надсилає сигнал 
на оновлення UI → View демонструє анімацію або інформаційне 
повідомлення. 
2.Помилка: у разі виключення — ViewModel формує опис проблеми 
→ View відображає повідомлення про помилку (наприклад, 
«некоректне значення» або «відсутнє з'єднання»). 
6. Синхронізація та оновлення 
Мета: Підтримувати актуальність даних на всіх пристроях користувача. 
Ключові кроки взаємодії: 
1.Після входу ViewModel виконує початкову синхронізацію з 
Firestore. 
2.Будь-які зміни в базі даних відображаються у View через механізм 
@Published або Combine. 
3.Інтерфейс оновлюється в реальному часі без необхідності 
перезапуску застосунку. 
Рисунок 2.10 – Діаграма комунікації додатку здоровʼя 
2.5.4 Діаграма скінченого автомату 
Опис основних компонентів діаграми взаємодії: 
1. Користувач — взаємодіє з інтерфейсом застосунку: вносить дані, 
створює цілі, переглядає аналітику. 
2. Інтерфейс (SwiftUI View) — отримує введення від користувача та 
  53 
 ЧДТУ 262355.001 ПЗ 
відображає результати обробки. 
3. ViewModel — виконує бізнес-логіку, перевіряє валідність даних і 
керує станами інтерфейсу. 
4. Firebase Firestore — хмарна база даних для зберігання health-
показників, цілей та аналітики. 
5. Auth-сервіс — відповідає за автентифікацію користувача та 
збереження активних сесій. 
6. Сховище користувача (Cloud Storage / Firestore) — зберігає 
персональні дані локально або у хмарі. 
 
 Основні сценарії взаємодії відображено на діаграмі скінченного 
автомата, яка ілюструє послідовність переходів між станами застосунку 
залежно від дій користувача. Зокрема, показано стани очікування введення, 
обробки інформації, збереження записів, формування аналітики та 
сповіщення про виконання цілей.  
 Також враховано сценарії обробки помилок (втрата з'єднання, 
некоректне введення) і повторних взаємодій після завершення попередніх 
операцій. Діаграма дає чітке уявлення про логіку поведінки застосунку та 
можливі шляхи розвитку сценаріїв як при штатному, так і при нештатному 
використанні: 
1. Очікування дій користувача 
Процес: ViewModel перебуває у режимі очікування — готовий до обробки 
будь-якої взаємодії: входу, реєстрації, додавання показника або створення 
цілі. 
2. Аутентифікація користувача 
Процес: користувач вводить email/пароль. 
1. Користувач вводить email і пароль. 
2. AuthService перевіряє надані облікові дані. 
3. У разі успіху — перехід до стану «Завантаження даних». 
  54 
 ЧДТУ 262355.001 ПЗ 
3. Завантаження даних користувача 
Процес: система отримує з Firestore наявні цілі, health-показники та аналітику. 
1. Успішне завершення → перехід до стану «Головний інтерфейс». 
4. Додавання нового запису (показника здоров’я) 
Процес: 
1. Користувач вносить новий показник (вода, тренування тощо). 
2. ViewModel перевіряє валідність → передає дані до Firestore. 
3. Успіх → стан «Дані оновлені», після чого виконується повторна 
синхронізація. 
5. Створення або редагування цілі 
Процес: 
1. Користувач створює ціль → ViewModel зберігає її у Firestore. 
2. Система відстежує поточний прогрес виконання. 
3. Якщо ціль досягнута — перехід до стану «Ціль виконано». 
6. Генерація аналітики 
Процес: 
1. ViewModel запитує всі записи певного типу за обраний часовий 
період. 
2. Аналітичний модуль формує статистику → стан «Готово до 
перегляду». 
3. Користувач отримує доступ до діаграм і графіків. 
7. Обробка помилки 
Процес:  
1. У разі виникнення помилки (некоректне значення або втрата 
з'єднання) → ViewModel формує відповідне повідомлення. 
2. Перехід до стану «Очікування повторного введення». 
8. Завершення сесії 
Процес: 
1. Користувач натискає «Вийти». 
  55 
 ЧДТУ 262355.001 ПЗ 
2. Система очищує локальний стан застосунку та повертається до 
стану «Очікування дій користувача». 
 
Рисунок 2.11 – Діаграма скінченого автомату додатку здоровʼя
 
 
  56 
 ЧДТУ 262355.001 ПЗ 
ВИСНОВКИ ДО ДРУГОГО РОЗДІЛУ 
 У другому розділі кваліфікаційної роботи виконано комплексне 
проєктування мобільного застосунку YourHealth — інструменту 
персоналізованого відстеження здоров'я, фізичної активності та цілей 
користувача на платформі iOS. Ретельно опрацьовано предметну область: 
виокремлено ключові сутності системи (користувач, показник здоров'я, ціль, 
аналітика), визначено їхні атрибути та логічні зв'язки, що склали підґрунтя 
для формування архітектури застосунку. 
 Систематизовано та формалізовано функціональні й нефункціональні 
вимоги — як з позиції кінцевого користувача, так і з технічної точки зору 
розробника. Розроблено повний комплект UML-діаграм (прецедентів, класів, 
компонентів, діяльності, послідовності, скінченного автомата), які наочно 
відображають структуру системи, логіку її роботи та типові сценарії 
використання. 
 Побудовано логічну структуру застосунку на основі патерну MVVM із 
чітким розмежуванням відповідальностей між компонентами, що забезпечує 
масштабованість, стабільність і простоту подальшого супроводу. Окрему 
увагу приділено сценаріям взаємодії користувача з інтерфейсом, механізмам 
обробки введених даних, формуванню статистичних звітів та зручному 
представленню результатів. 
 Таким чином, у межах другого розділу закладено повноцінну 
концептуальну та архітектурну базу для програмної реалізації застосунку 
YourHealth, що створює передумови для переходу до етапів безпосередньої 
розробки, тестування та впровадження системи.
 
 
 
  
  57 
 ЧДТУ 262355.001 ПЗ 
РОЗДІЛ 3 РОЗРОБКА ТА ТЕСТУВАННЯ ПРОГРАМНОГО 
ЗАБЕЗПЕЧЕННЯ 
3.1 Розробка програмного комплексу 
 Розробка мобільного застосунку YourHealth стала центральним етапом 
виконання кваліфікаційного проєкту. На цій стадії результати аналізу 
предметної області, сформульовані вимоги та логічна структура системи були 
втілені у повноцінний програмний продукт для платформи iOS.   
 Головною метою стало створення зручного, стабільного та гнучкого 
інструменту для щоденного контролю за здоров'ям, активністю та особистими 
цілями користувача — з можливістю персоналізації та без зайвого 
перевантаження інтерфейсу. 
 Застосунок реалізовано мовою Swift із використанням фреймворку 
SwiftUI для побудови UI та хмарної платформи Firebase для автентифікації, 
збереження й синхронізації даних. В основу архітектури покладено патерн 
MVVM (Model–View–ViewModel), що забезпечує чітке розмежування між 
логікою, інтерфейсом і обробкою даних. 
 Особливу увагу приділено реактивності інтерфейсу, використанню 
плавних анімацій, стилю glassmorphism, а також комфорту щоденного 
використання — без нав'язливих сповіщень і складних налаштувань.  
  Застосунок підтримує виключно світлу тему, що відповідає 
концепції легкого та прозорого дизайну. 
 Основні компоненти системи: 
• SwiftUI View — реалізує візуальний інтерфейс користувача; 
• ViewModel — обробляє бізнес-логіку та керує станом інтерфейсу; 
• Firebase Authentication — забезпечує захищену реєстрацію та вхід до 
системи; 
• Firestore Database — зберігає health-записи, цілі та історичні дані 
користувача; 
• Аналітичний модуль — формує статистику та графіки прогресу; 
  58 
 ЧДТУ 262355.001 ПЗ 
• Цільовий модуль — відстежує виконання персональних цілей; 
• Система повідомлень — інформує користувача про помилки, 
досягнення або зміну стану. 
3.1.1 Обґрунтування вибору засобів реалізації 
 Вибір технологічного стеку для YourHealth визначався потребою у 
високій продуктивності, реактивній взаємодії з користувачем, хмарному 
збереженні та синхронізації даних, а також простоті супроводу й можливості 
масштабування. З огляду на ці вимоги прийнято рішення розробляти 
застосунок під iOS із використанням Swift та SwiftUI, а для бекенду і 
зберігання даних — Firebase. 
 SwiftUI обрано як сучасний декларативний фреймворк для побудови 
інтерфейсів, що забезпечує високу швидкодію та глибоку інтеграцію з 
реактивними механізмами (@State, @ObservedObject, Combine тощо). Його 
застосування дозволяє створити динамічний і плавний UI у стилі 
glassmorphism, що відповідає загальній дизайн-концепції застосунку. 
 Для збереження та синхронізації даних обрано Firebase Firestore — 
хмарну NoSQL-базу даних із підтримкою роботи в реальному часі та 
автоматичною міжпристрійною синхронізацією. Автентифікацію реалізовано 
через Firebase Authentication, що дозволяє швидко впровадити захищений вхід 
за допомогою email і пароля та зручно керувати сесіями. 
 Структуру застосунку побудовано за патерном MVVM, який забезпечує 
розділення логіки та інтерфейсу, спрощуючи тестування, супровід і 
масштабування проєкту. Реактивна взаємодія між ViewModel і View дає змогу 
інтерфейсу миттєво реагувати на зміни даних, забезпечуючи сучасний 
користувацький досвід. 
 Хмарна інфраструктура Firebase повністю усуває потребу в окремому 
серверному хостингу — база даних, автентифікація та сховище об'єднані в 
єдину екосистему з високою надійністю та мінімальними витратами на 
  59 
 ЧДТУ 262355.001 ПЗ 
обслуговування. Це дозволяє зосередити зусилля на логіці застосунку, а не на 
конфігурації серверного середовища. 
 Таким чином, обраний технологічний стек повністю відповідає вимогам 
до продуктивності, гнучкості, зручності розробки та подальшого 
масштабування YourHealth. 
3.1.2 Опис структурної (функціональної) схеми 
 На рисунку 3.1 представлено структурну схему мобільного застосунку 
YourHealth, а на рисунку 3.2 — функціональну модель його взаємодії з 
користувачем та хмарною інфраструктурою Firebase. Обидві діаграми 
відображають основні етапи обробки даних — від введення health-показника 
до генерації аналітики та збереження інформації у хмарі. 
 Користувач взаємодіє з інтерфейсом на базі SwiftUI, вносячи нові дані 
(кількість випитої води, тривалість сну, настрій тощо). Ці дані передаються до 
ViewModel, яка виконує базову валідацію та формує запит до Firebase 
Firestore. Після успішного збереження інтерфейс оновлюється в режимі 
реального часу, а при досягненні встановленої цілі — система сповіщає 
користувача через анімацію або повідомлення. 
 Функціональна діаграма ілюструє процес обробки даних: ViewModel 
формує структуру запису, зберігає її у Firestore та ініціює обчислення 
статистики при переході користувача до розділу аналітики. Аналітичний 
модуль агрегує дані за обраний період (день, тиждень, місяць) і повертає 
результати до ViewModel, яка оновлює графіки та діаграми в інтерфейсі. 
 Упродовж усього циклу взаємодії користувач отримує миттєвий 
зворотний зв'язок — як при успішних діях (збереження запису, виконання 
цілі), так і в разі виникнення помилок (некоректне значення, збій мережевого 
з'єднання). Така архітектура забезпечує зручну, надійну та персоналізовану 
взаємодію навіть в умовах нестабільного з'єднання або підвищеного 
навантаження.
 
  60 
 ЧДТУ 262355.001 ПЗ 
 
Рисунок 3.1 – Структурна схема застосунку здоровʼя
 
  61 
 ЧДТУ 262355.001 ПЗ 
Рисунок 3.2 – Функціональна схема 
  62 
 ЧДТУ 262355.001 ПЗ 
3.1.3 Опис логічної схеми системи 
 
 Логічна схема застосунку YourHealth ґрунтується на принципах 
модульності, реактивної взаємодії та ізольованої обробки користувацьких дій, 
що дозволяє уникнути конфліктів станів інтерфейсу, дублювання збережених 
даних або втрати інформації. Структура системи охоплює кілька послідовних 
логічних етапів: 
1. Ініціалізація застосунку. При запуску система перевіряє статус 
авторизації через Firebase Authentication. За наявності активної сесії 
завантажуються дані користувача з Firestore, налаштовується 
середовище ViewModel і синхронізується поточний стан інтерфейсу. 
2. Обробка дій користувача. Користувач взаємодіє з UI на базі SwiftUI 
— вносить health-показники, формулює цілі, переглядає статистику. 
Введені дані надходять до ViewModel, де проходять валідацію та 
готуються до передачі у Firestore. Обробка кожної дії є незалежною 
— введення даних, аналітика та оновлення інтерфейсу не блокують 
одне одного. 
3. Збереження даних у FireStore. Після успішної валідації ViewModel 
ініціює асинхронний запис даних до Firebase Firestore. По 
завершенні операції локальний стан ViewModel оновлюється, що 
забезпечує негайне відображення змін у інтерфейсі. 
4. Формування аналітики. При переході користувача до розділу 
«Аналітика» або відкритті дашборду система формує агреговану 
статистику з Firestore за обраний часовий діапазон (день, тиждень, 
місяць). Результати обчислень передаються до інтерфейсу у вигляді 
графіків і діаграм. 
5. Інформування користувача. Система відображає повідомлення або 
анімаційні індикатори — зокрема, при виконанні цілі, некоректному 
введенні значень або відсутності мережевого з'єднання. Сповіщення 
реалізовано без блокування основного потоку UI. 
6. Завершення циклу. Після опрацювання дії застосунок повертається 
  63 
 ЧДТУ 262355.001 ПЗ 
до стану очікування нової взаємодії. Усі зміни синхронізуються в 
режимі реального часу, а оновлення даних із Firestore можуть 
автоматично ініціювати перерисовку інтерфейсу через реактивні 
прив'язки (@Published, @ObservedObject). 
3.1.4 Розробка бази даних 
У процесі створення мобільного застосунку YourHealth прийнято 
рішення відмовитися від класичної серверної СУБД на користь комбінованого 
підходу з локальним та хмарним збереженням даних. Це рішення 
обґрунтовано рядом технічних і функціональних міркувань. 
Відсутність потреби у власній серверній СУБД. 
YourHealth оперує персональними даними користувача, які 
зберігаються безпосередньо на пристрої та у хмарних сервісах Firebase. 
Показники активності, health-параметри та індивідуальні цілі 
синхронізуються з Firebase Firestore, що забезпечує надійне збереження без 
необхідності розгортати власну інфраструктуру баз даних. 
Локальне та тимчасове збереження даних 
• Для оперативної обробки інформації застосовується локальне 
кешування на пристрої (Core Data або Realm), що дозволяє працювати без 
постійного звернення до хмарного сховища та забезпечує підтримку 
офлайн-режиму. 
Локальне кешування для швидкої роботи 
• Дані користувачів зберігаються у зашифрованому вигляді і 
передаються між клієнтом та сервером через захищені канали. Відсутність 
централізованої СУБД знижує ризики витоку персональної інформації, що 
є критично важливим для додатка у сфері здоров’я. 
 
 
  64 
 ЧДТУ 262355.001 ПЗ 
Рисунок 3.3 – Блок-схема логічної роботи системи. 
  65 
 ЧДТУ 262355.001 ПЗ 
Простота розгортання та масштабування. 
• Готова хмарна екосистема Firebase суттєво спрощує архітектуру й 
дозволяє масштабувати застосунок без адміністрування власної серверної 
інфраструктури. 
 Таким чином, архітектура YourHealth поєднує локальне та хмарне 
збереження даних, забезпечуючи високу безпеку, продуктивність і зручність 
використання. Розгортання класичної СУБД у цьому проєкті є недоцільним, 
оскільки наявні сервіси повністю задовольняють усі вимоги. 
3.1.5 Розробка інтерфейсу користувача 
 При розробці YourHealth значну увагу приділено створенню зручного, 
інтуїтивного та сучасного інтерфейсу, що відповідає кращим практикам 
UX/UI-дизайну для мобільних застосунків у сфері здоров'я. 
1. Використання нативних компонентів платформи iOS 
 Застосунок побудовано на базі SwiftUI — фреймворку з декларативним 
підходом до опису інтерфейсу та широким набором нативних UI-компонентів. 
  Це дозволило створити швидкий, плавний та адаптивний UI, що 
автоматично підлаштовується під різні розміри екранів і підтримує виключно 
світлий режим відображення. 
2. Основні елементи інтерфейсу 
• Головний екран із ключовими health-показниками та даними про 
активність користувача; 
• Екрани моніторингу для детального перегляду окремих 
параметрів (кроки, сон, пульс тощо); 
• Екрани налаштувань і цілей для персоналізації застосунку та 
постановки індивідуальних завдань; 
• Діалогові повідомлення та підказки для ефективної взаємодії з 
функціоналом. 
3. Переваги розробки власного інтерфейсу 
  66 
 ЧДТУ 262355.001 ПЗ 
• Максимальна адаптація під потреби користувача — інтерфейс 
розроблено з урахуванням специфіки health-моніторингу, що 
забезпечує швидкий доступ до важливої інформації; 
• Висока продуктивність і плавність — SwiftUI забезпечує 
оптимальне використання ресурсів пристрою та миттєвий 
відгук; 
• Гнучкість і масштабованість — інтерфейс легко розширювати 
новими функціями та адаптувати під оновлені вимоги. 
 Окрему увагу приділено доступності інтерфейсу для користувачів із 
різними фізичними можливостями, а також захисту персональних даних у 
процесі роботи з застосунком. 
 
3.1.6 Опис розробки програмних компонентів 
 Мобільний застосунок YourHealth реалізовано з дотриманням 
принципів модульності, розподілу відповідальностей і повторного 
використання коду.    Такий підхід забезпечує надійність, 
гнучкість і масштабованість продукту, а також спрощує його супровід і 
подальший розвиток. 
Основні компоненти програмної системи: 
1. Модуль інтерфейсу користувача (UI Layer) 
Побудований на основі SwiftUI, цей модуль відповідає за: 
• формування основних екранів (Dashboard, Activity, Goals, Profile); 
• адаптивні layout-структури для різних розмірів екранів; 
• відображення поточних health-параметрів (кроки, калорії, сон, пульс 
тощо); 
• інтерактивні елементи для постановки цілей, введення даних і 
перегляду рекомендацій. 
Інтерфейс витримано у стилі glassmorphism, що надає застосунку сучасного 
вигляду, характерного для екосистеми Apple. 
  67 
 ЧДТУ 262355.001 ПЗ 
2. Модуль бізнес-логіки (ViewModel / Logic Layer) 
Забезпечує обробку даних і взаємодію між інтерфейсом і моделлю: 
• реалізація патерну MVVM; 
• керування станом користувача, його активностями та цілями; 
• обробка введених значень (вага, пульс, настрій тощо); 
• перевірка цільових значень і оновлення статусів виконання. 
3. Модуль зберігання даних (StorageManager) 
Відповідає за: 
• взаємодію з Firebase Firestore; 
• синхронізацію даних у режимі реального часу; 
• збереження історії показників та досягнень користувача; 
• локальне кешування через UserDefaults або Core Data для офлайн-
доступу. 
4. Модуль аутентифікації (AuthManager) 
Реалізовано засобами Firebase Authentication. Забезпечує: 
• реєстрацію нових користувачів (email + пароль); 
• вхід і вихід із системи; 
• підтримку активних сесій; 
• захист персональних даних через валідацію та шифрування. 
5. Модуль інтеграції з Apple Health (HealthKitManager) 
Відповідає за обмін даними з системними сенсорами iPhone та Apple Watch: 
• зчитування кількості кроків, частоти пульсу та показників сну; 
• запис змін із HealthKit; 
• перевірку наявності дозволів на доступ до медичних даних. 
6. Модуль аналітики та рекомендацій (AnalyticsEngine) 
Надає персоналізовану статистику та поради на основі зібраних даних: 
• аналіз прогресу виконання цілей; 
• відображення статистики у вигляді графіків; 
• формування мотиваційних повідомлень і рекомендацій для 
  68 
 ЧДТУ 262355.001 ПЗ 
покращення стану здоров'я. 
7. Модуль конфігурації та середовища (ConfigManager) 
Забезпечує: 
• налаштування параметрів для різних середовищ (debug, release); 
• безпечне зберігання API-ключів (Xcode Secrets, .plist); 
• централізоване керування глобальними змінними та ендпоінтами. 
8. Хмарне середовище розгортання (Firebase Console) 
Засобами Firebase реалізовано: 
• хостинг бази даних і сервісів авторизації; 
• моніторинг активності застосунку; 
• підтримку push-повідомлень для мотивації користувача; 
• масштабоване середовище з високим рівнем надійності. 
 Усі компоненти чітко розмежовані за зонами відповідальності, що 
спрощує внесення змін, проведення модульного тестування та нарощування 
функціоналу — наприклад, додавання трекінгу води або підтримки 
ментального самопочуття. 
3.2 Тестування системи 
 Тестування є невід'ємним етапом розробки програмного забезпечення, 
що безпосередньо визначає якість кінцевого продукту. Його мета — виявити 
й усунути дефекти, перевірити відповідність реалізованого функціоналу 
вимогам, а також підтвердити стабільність і надійність застосунку в реальних 
умовах експлуатації. 
 Основні цілі тестування: 
1. Перевірка функціональності — підтвердити коректну роботу всіх 
компонентів застосунку (реєстрація, вхід, відстеження показників, 
збереження даних, інтеграція з Apple HealthKit тощо) відповідно до 
специфікацій; 
2. Оцінка продуктивності — перевірити швидкість завантаження 
  69 
 ЧДТУ 262355.001 ПЗ 
екранів, обробки даних і синхронізації з Firebase та HealthKit, а 
також стабільність роботи на різних пристроях; 
3. Перевірка безпеки — оцінити надійність системи авторизації, 
шифрування даних, обмеження доступу до конфіденційної 
інформації та захищеність передачі даних по мережі. 
 
 Об'єктом тестування виступає мобільний застосунок YourHealth, що 
реалізує персональний моніторинг здоров'я, ведення індивідуальних цілей, 
синхронізацію з Apple HealthKit та взаємодію з хмарною базою даних Firebase. 
 Тестування проводилося поетапно — на кожному кроці визначався 
обсяг перевірок, обиралась відповідна стратегія та формувався набір тестових 
сценаріїв. Після кожного етапу здійснювався аналіз результатів, виявлені 
дефекти усувалися, а система проходила повторну перевірку для 
підтвердження коректності внесених змін. 
3.2.1 Модульне тестування 
Обсяг тестування 
 Модульне тестування охоплює перевірку окремих логічних одиниць 
системи YourHealth — функцій, класів і структур, відповідальних за 
збереження, обробку та відображення даних. Тестуванню підлягали такі 
компоненти: 
• AuthManager — перевірялась коректність обробки реєстрації та входу, 
валідація полів, реакція на некоректні дані (недійсний email, короткий 
пароль), а також робота механізму сесій; 
• HealthDataManager — тестувались правильність запису і зчитування 
health-даних, обробка граничних випадків (відсутність дозволів, 
нульові значення, повторне оновлення); 
• StatisticsCalculator — перевірялась точність математичних обчислень і 
коректність обробки порожніх або неповних наборів даних; 
  70 
 ЧДТУ 262355.001 ПЗ 
• NotificationScheduler — тестувалась логіка формування локальних 
push-повідомлень, їх повторення, скасування та часові залежності. 
Стратегія тестування 
 Для ізоляції перевірок від зовнішніх залежностей (Firebase, HealthKit) 
застосовувались тестові дані та фіктивні об'єкти (моки). Це дало змогу 
оцінити логіку кожного модуля незалежно від сторонніх API та системних 
служб. 
 Окремо перевірялась здатність застосунку коректно обробляти 
виняткові ситуації без збоїв і порушень загальної логіки. Усі критичні 
помилки логуються, а користувач отримує зрозуміле повідомлення про суть 
проблеми. 
 Проведені перевірки дозволили всебічно оцінити надійність і 
функціональну цілісність застосунку YourHealth ще до інтеграції з реальними 
сервісами. 
Тестові випадки 
Тестовий випадок модульного тестування №1 
Таблиця 3.1 
  
Тест-кейс № 1
  
Опис Створення нової цілі з відстеження кількості кроків
 
Передумови Користувач увійшов до системи та має доступ до розділу 
 
«Цілі»
 
Кроки Перейти до екрану «Мої цілі».  
Натиснути «Додати ціль».  
Заповнити поле назви значенням «10 000 кроків щодня».  
Очікуваний Ціль зберігається у Firebase або локальному сховищі. 
 
результат
Вона відображається у переліку активних цілей. 
 
Застосунок розпочинає відстеження її виконання.
 
  
  71 
 ЧДТУ 262355.001 ПЗ 
Продовження таблиці 3.1 
Фактичний Ціль успішно збережено та відображено на головному 
 
результат
екрані. 
Прогрес виконання оновлюється відповідно до поточної 
 
кількості кроків.
  
Пройдено Так
 
Тестовий випадок модульного тестування №2 
Таблиця 3.2 
  
Тест-кейс № 2
 
Опис Спроба додати нову ціль під час активного збереження 
 
попередньої
 
Передумови Користувач ініціював збереження цілі, проте операція 
 
запису до Firebase ще не завершена
 
Кроки Ввести ціль «8 годин сну щодня» та натиснути «Зберегти». 
До завершення збереження одразу ввести нову ціль «Пити 2 
 
літри води» та повторно натиснути «Зберегти».
Очікуваний Застосунок виводить повідомлення: «Зачекайте, попередню 
 
результат
операцію ще не завершено.» 
 
Нова ціль не додається до завершення обробки першої.
Фактичний Повідомлення відображено, друга дія не виконана до 
  
результат завершення першої.
  
Пройдено Так
 
 
Тестовий випадок модульного тестування №3
Таблиця 3.3 
  72 
 ЧДТУ 262355.001 ПЗ 
  
Тест-кейс № 3
  
Опис Додавання нової цілі в умовах відсутності інтернет-з'єднання
 
Передумови Користувач авторизований, однак пристрій перебуває в офлайн-
 
режимі
 
Кроки Вимкнути інтернет (Wi-Fi або мобільні дані).  
Відкрити екран «Мої цілі». 
Натиснути «Додати ціль».  
 
Ввести назву «Проходити 5 км на день» та натиснути «Зберегти».
Очікуваний Застосунок відображає повідомлення: «Відсутнє з'єднання з 
 
результат інтернетом. Дані буде синхронізовано пізніше.»  
Ціль зберігається локально в кеші. 
Після відновлення з'єднання - автоматично синхронізується з 
 
Firebase.
Фактичний Повідомлення про відсутність інтернету відображено.  
 
результат Ціль збережено в локальну пам'ять. Після відновлення з'єднання 
 
— синхронізовано з Firebase.
  
Пройдено Так
 
Тестовий випадок модульного тестування №4 
Таблиця 3.4 
  
Тест-кейс № 4
 
Опис Спроба зберегти ціль із некоректною назвою (порожній рядок 
 
або недозволені символи)
  
Передумови Користувач перебуває на екрані додавання нової цілі
 
  73 
 ЧДТУ 262355.001 ПЗ 
Продовження таблиці 3.4 
 
Кроки 1. Відкрити форму додавання цілі.  
Ввести порожній рядок або текст із недозволеними символами 
(наприклад, «!_=+»).  
 
Натиснути «Зберегти».
Очікуваний Відображається повідомлення: «Некоректне значення цілі. Будь 
 
результат ласка, введіть коректний текст». 
 
Ціль не зберігається.
Фактичний Повідомлення про некоректність введення відображено.  
  
результат Ціль не додано до списку.
  
Пройдено Так
 
Тестовий випадок модульного тестування №5 
Таблиця 3.5 
  
Тест-кейс № 5
  
Опис Перегляд статистики за відсутності збережених даних
 
Передумови Користувач не має жодного збереженого запису активності, сну 
 
або інших показників
 
Кроки Увійти до застосунку.  
2. Перейти на вкладку «Статистика».  
3. Обрати тип даних, наприклад «Сон». 
Очікуваний Застосунок виводить повідомлення: «Немає даних для 
 
результат відображення.»  
 
Графіки та числові значення не відображаються.
 
 
  74 
 ЧДТУ 262355.001 ПЗ 
 Продовження таблиці 3.5 
Фактичний Повідомлення «Немає даних для відображення» з’явилось. 
  
результат Графіки не побудовано.
  
Пройдено Так
 
Аналіз проведеного тестування 
 На цьому етапі виконано комплексну перевірку ключових 
функціональних модулів застосунку YourHealth: внесення та збереження 
health-показників, створення й відображення цілей, побудови статистичних 
звітів, а також реакції системи на нештатні ситуації — відсутність інтернет-
з'єднання або некоректне введення даних. 
 Перед початком тестування визначено обсяг перевірки, сформовано 
загальну стратегію, підібрано методи модульного та інтеграційного 
тестування, а також підготовлено набір тест-кейсів, що охоплюють найбільш 
типові сценарії використання системи. Окрему увагу приділено перевірці 
стабільності застосунку в умовах підвищеного навантаження, повторних 
запитів і втрати зв'язку із зовнішніми сервісами (Firebase, HealthKit). 
3.2.2 Інтеграційне тестування 
Обсяг тестування 
 Інтеграційне тестування охопило перевірку взаємодії між основними 
модулями застосунку YourHealth: збереження даних, керування цілями, 
синхронізація з Firebase, взаємодія з HealthKit, відображення статистики та 
обробка виняткових ситуацій. Метою етапу було підтвердити коректну 
спільну роботу всіх складових системи — UI, бізнес-логіки, локального й 
хмарного сховища та сторонніх API. 
 Перевірено такі функції: 
• автентифікація користувача; 
• додавання нової цілі (наприклад, «випивати 2 літри води щодня»); 
  75 
 ЧДТУ 262355.001 ПЗ 
• збереження щоденних результатів (тривалість сну, кількість випитої 
води, активність користувача); 
• перегляд статистики за кожним із відстежуваних показників; 
• поведінка системи за відсутності інтернет-з'єднання; 
• відкладене збереження даних та їх синхронізація після відновлення 
зв'язку; 
• відображення повідомлень про помилки та валідація користувацького 
введення. 
Стратегія тестування 
 Для інтеграційного тестування застосовано стратегію Big Bang 
Integration Testing. У її межах усі модулі застосунку (інтерфейс, логіка 
введення, модулі цілей, Firebase-сервіси, синхронізація з HealthKit) 
об'єднувались одночасно, після чого проводилось комплексне тестування 
системи як єдиного цілого. 
 
Тестові випадки 
Тестовий випадок інтеграційного тестування №1 
Таблиця 3.6 
  
Тест-кейс №1 1
  
Опис Запуск та ініціалізація застосунку
 
Передумови Застосунок встановлено на пристрої, користувач авторизований, 
 
інтернет-з'єднання активне
 
Кроки 1. Відкрити застосунок YourHealth. 
 
Зачекати на завершення початкового завантаження.
 
 
 
 
  76 
 ЧДТУ 262355.001 ПЗ 
Продовження таблиці 3.6 
Очікуваний Відображається головний екран або персоналізоване привітання 
 
результат (наприклад, «Привіт, [ім’я]!»). 
 
Застосунок готовий до роботи.
Фактичний Привітання відображено, головний екран завантажено без 
  
результат помилок.
  
Пройдено Так
 
 
 
Тестовий випадок інтеграційного тестування №2
 
Таблиця 3.7 
  
Тест-кейс №2 2
  
Опис Створення нової цілі
  
Передумови Застосунок запущено, користувач авторизований
Перейти до розділу «Мої цілі».  
 Натиснути «Додати ціль». 
Кроки
Ввести текст «Щодня проходити 5 км». 
 
Натиснути «Зберегти».
 Ціль зберігається та з'являється у переліку цілей. 
Очікуваний результат  
Виводиться підтвердження («Ціль додано успішно»).
 Ціль збережено. 
Фактичний результат  
Повідомлення про успішне додавання відображено.
  
Пройдено Так
  77 
 ЧДТУ 262355.001 ПЗ 
Тестовий випадок інтеграційного тестування №3 
Таблиця 3.8 
 
Тест-кейс 3
 
№3
  
Опис Зчитування даних активності з HealthKit
 
Передумови Застосунок має дозвіл на доступ до HealthKit, користувач 
 
попередньо зафіксував фізичну активність
 
Кроки Відкрити застосунок YourHealth. 
Перейти на вкладку «Активність». 
Зачекати на автоматичну синхронізацію або натиснути 
 
«Оновити дані».
Очікуваний Застосунок отримує актуальні дані з HealthKit (кількість 
 
результат кроків, витрачені калорії тощо).  
 
Інформація оновлюється на екрані статистики.
Фактичний Дані синхронізовано з HealthKit.  
  
результат Показники активності оновлено та відображено в інтерфейсі.
  
Пройдено Так
 
Тестовий випадок інтеграційного тестування №4 
Таблиця 3.9 
  
Тест-кейс № 4
  
Опис Обробка кількох записів активності за один день
 
Передумови Користувач має кілька записів активності у HealthKit або внесених 
 
вручну
 
  78 
 ЧДТУ 262355.001 ПЗ 
Продовження таблиці 3.9 
 
Кроки Запустити застосунок YourHealth. 
Перейти до розділу «Активність». 
Ініціювати синхронізацію з HealthKit або додати вручну кілька 
 
записів (наприклад, «Піша прогулянка», «Біг», «Розтяжка»).
Очікуваний Застосунок послідовно обробляє всі записи активності.  
 
результат Дані коректно зберігаються та відображаються у щоденній 
 
статистиці.
 
Фактичний Всі активності оброблено та відображено в інтерфейсі.
 
результат
  
Пройдено Так
 
Тестовий випадок інтеграційного тестування №5 
Таблиця 3.10
 
  
Тест-кейс № 5
 
Опис Обробка повторного запиту на збереження під час активного 
 
процесу
 
Передумови Застосунок виконує збереження даних користувача (активності 
 
або цілі)
 
Кроки Ініціювати збереження даних (наприклад, натиснути «Зберегти 
ціль»).  
 
До завершення операції повторно натиснути «Зберегти».
Очікуваний Відображається повідомлення: «Будь ласка, зачекайте на 
 
результат завершення поточного процесу.»  
 
Повторний запит ігнорується або ставиться в чергу.
 
  79 
 ЧДТУ 262355.001 ПЗ 
Продовження таблиці 3.10 
Фактичний Повідомлення відображено. 
  
результат Дублювання обробки не відбувається.
  
Пройдено Так
 
Тестовий випадок інтеграційного тестування №6 
Таблиця 3.11 
  
Тест-кейс № 6
 
Опис Сповіщення про початок обробки наступного запиту після 
 
завершення попереднього
 
Передумови Поточний процес збереження або синхронізації завершено, новий 
 
запит перебуває в черзі
 
Кроки Дочекатися завершення поточної операції збереження.  
Ініціювати наступний запит (наприклад, додавання цілі або 
оновлення даних). 
 
Перевірити повідомлення, що відображається користувачу.
Очікуваний Відображається повідомлення: «Починаємо обробку наступного 
  
результат запиту…» або інше підтвердження старту операції.
Фактичний Система працює коректно, повідомлення відображається 
  
результат своєчасно, процеси виконуються послідовно.
  
Пройдено Так
 
Аналіз проведеного тестування 
 Усі заплановані тести було виконано успішно, а отримані результати 
повністю відповідали очікуваним значенням. Це підтверджує коректну 
взаємодію всіх компонентів застосунку YourHealth під час його роботи. 
  80 
 ЧДТУ 262355.001 ПЗ 
Відсутність помилок та збоїв свідчить про стабільність реалізованої 
архітектури та правильність інтеграції модулів. 
 Отже, інтеграційне тестування за стратегією Big Bang завершено 
успішно. Необхідності у виправленні помилок не виявлено, тому повторні 
ітерації тестування не проводилися. Це дозволяє зробити висновок, що 
застосунок готовий до подальшого використання. 
3.2.3 Системне тестування 
Обсяг тестування 
 Системне тестування охоплює весь функціонал застосунку YourHealth 
після об’єднання його основних компонентів, що дає змогу оцінити роботу 
системи в цілому. Основна мета цього етапу полягає у перевірці відповідності 
реалізованого програмного продукту функціональним та нефункціональним 
вимогам, а також у виявленні можливих помилок, що виникають під час 
взаємодії окремих частин системи. 
 У процесі тестування перевіряється взаємодія між інтерфейсом 
користувача iOS-застосунку, модулем обробки даних та інтеграцією з Apple 
HealthKit, який використовується для отримання інформації про фізичну 
активність користувача. Окрему увагу приділено коректності відображення та 
оновлення статистичних даних. 
Стратегія тестування 
 Для перевірки коректності та стабільності роботи застосунку 
використовуються сценарії, що імітують дії користувача в реальних умовах. 
Зокрема, тестуються процеси отримання даних із HealthKit, їх обробки та 
відображення в інтерфейсі застосунку, а також оновлення статистики 
активності. 
 Сценарії тестування включають перегляд щоденної активності, 
оновлення даних після зміни інформації в системі HealthKit та перевірку 
коректності відображення графічних елементів інтерфейсу (кілець 
  81 
 ЧДТУ 262355.001 ПЗ 
активності). 
Для перевірки узгодженості роботи компонентів використовуються сценарії, 
що моделюють типову поведінку користувача, наприклад перегляд 
статистики активності за день або тиждень. Це дозволяє переконатися, що всі 
частини системи працюють як єдине ціле без конфліктів між модулями. 
Тестові випадки 
Тестовий випадок системного тестування №1 
Таблиця 3.12 
  
Тест-кейс № 1
 
Опис Перевірка швидкості отримання та відображення даних фізичної 
 
активності з Apple HealthKit.
 
Передумови Додаток YourHealth запущено, користувач надав доступ до 
 
HealthKit.
 
Кроки Відкрити головний екран застосунку. 
 
Дочекатися завантаження даних про фізичну активність.
Очікуваний Інформація про кроки, дистанцію та активні калорії 
  
результат відображається не довше ніж за 2 секунди.
 
Фактичний Дані відображаються приблизно за 1,5 секунди.
 
результат
  
Пройдено Так
 
Тестовий випадок системного тестування №2 
Таблиця 3.13 
  
Тест-кейс № 2
 
 
  82 
 ЧДТУ 262355.001 ПЗ 
Продовження таблиці 3.13 
 
Опис Перевірка швидкодії при оновленні великого обсягу даних 
 
активності.
 
Передумови Додаток YourHealth запущено, у HealthKit наявна історія 
 
активності користувача.
 
Кроки Виконати оновлення даних фізичної активності. 
 
Дочекатися завершення обробки отриманої інформації.
Очікуваний Оновлення та відображення даних виконується не довше ніж 
  
результат за 8 секунд.
 
Фактичний Операція завершується приблизно за 5 секунд.
 
результат
  
Пройдено Так
 
Тестовий випадок системного тестування №3 
Таблиця 3.14 
  
Тест-кейс №3 3
  
Опис Перевірка взаємодії між застосунком YourHealth та Apple HeathKit
  
Передумови Додаток запущено, доступ до HealthKit надано.
 
Кроки Відкрити екран активності. 
Ініціювати отримання даних із HealthKit. 
 
Перевірити відображення отриманої інформації.
Очікуваний Дані успішно отримуються з HealthKit; 
 
результат Інформація коректно обробляється застосунком; 
 
Показники відображаються в інтерфейсі користувача.
 
 
 
  83 
 ЧДТУ 262355.001 ПЗ 
Продовження таблиці 3.14 
 
Фактичний Дані успішно отримано та відображено.
 
результат
  
Пройдено Так
 
Аналіз проведеного тестування 
 За результатами системного тестування підтверджено відповідність 
функціональності застосунку YourHealth визначеним вимогам. Застосунок 
стабільно взаємодіє з Apple HealthKit, коректно отримує та відображає дані 
про фізичну активність користувача. Усі тестові сценарії були виконані 
успішно, що підтверджує надійність роботи системи та коректність 
реалізованої функціональності в умовах реального використання. 
3.2.4 Приймальне тестування 
Обсяг тестування 
 Приймальне тестування охоплює всі функціональні та нефункціональні 
вимоги додатку YourHealth, що були визначені у розділі формування вимог за 
допомогою діаграм прецедентів та текстових описів. Метою тестування є 
підтвердження відповідності розробленого продукту всім визначеним бізнес-
вимогам, а також готовність продукту до експлуатації кінцевими 
користувачами. 
Стратегія тестування 
 Для перевірки працездатності застосунку використовуються сценарії, 
що моделюють реальні дії користувача під час роботи із системою. 
Тестування спрямоване на оцінку коректності взаємодії між окремими 
модулями застосунку та перевірку стабільності роботи після інтеграції всіх 
компонентів. 
 Основними сценаріями перевірки є отримання даних із Apple HealthKit, 
оновлення статистики активності, відображення інформації в інтерфейсі 
користувача та перевірка коректності роботи графічних елементів. Також 
  84 
 ЧДТУ 262355.001 ПЗ 
виконується тестування поведінки застосунку за відсутності доступу до даних 
HealthKit або при відсутності інформації про фізичну активність користувача. 
Проведення тестування 
Перелік основних вимог для перевірки включає: 
Для користувача: 
• Ключові кроки взаємодії:коректне отримання даних про фізичну 
активність із Apple HealthKit; 
• Ключові кроки взаємодії:правильне відображення показників кроків, 
дистанції та активних калорій; 
• Ключові кроки взаємодії:коректне відображення кілець активності; 
• Ключові кроки взаємодії:стабільна робота інтерфейсу користувача; 
• Ключові кроки взаємодії:коректне оновлення даних після повторного 
завантаження застосунку. 
Для розробника (через адміністративний доступ або внутрішню 
перевірку логів): 
• Ключові кроки взаємодії:перевірка коректності обробки даних, 
отриманих із HealthKit; 
• Ключові кроки взаємодії:перевірка поведінки застосунку у випадку 
відсутності дозволу на доступ до HealthKit; 
• Ключові кроки взаємодії:тестування роботи застосунку при 
відсутності даних про активність; 
• Ключові кроки взаємодії:перевірка коректності взаємодії між 
компонентами архітектури MVVM. 
На основі зазначених вимог розроблено набір тестових випадків та проведено 
перевірку основних сценаріїв використання застосунку YourHealth (таблиці 
3.15–3.20).
 
Тестовий випадок приймального тестування №1 
Таблиця 3.15 
  85 
 ЧДТУ 262355.001 ПЗ 
  
Тест-кейс № 1
  
Опис Отримання даних про фізичну активність із Apple HealthKit.
 
Кроки Запустити застосунок YourHealth. 
Надати доступ до Apple HealthKit (якщо це перший запуск). 
 
Відкрити головний екран застосунку.
Очікуваний Дані про кроки, дистанцію та активні калорії успішно 
 
результат завантажуються з HealthKit. 
 
Показники коректно відображаються в інтерфейсі застосунку.
  
Пройдено Так
 
Тестовий випадок приймального тестування №2 
Таблиця 3.16 
  
Тест-кейс № 2
  
Опис Оновлення даних фізичної активності.
 
Кроки Відкрити застосунок. 
 
Ініціювати оновлення статистики активності.
Очікуваний Застосунок повторно отримує актуальні дані з HealthKit. 
  
результат Інформація на екрані оновлюється без помилок.
  
Пройдено Так
 
Тестовий випадок приймального тестування №3 
Таблиця 3.17 
  
Тест-кейс № 3
  
Опис Перевірка відображення кілець активності.
 
  86 
 ЧДТУ 262355.001 ПЗ 
Продовження таблиці 3.17 
 
Кроки Відкрити головний екран застосунку. 
 
Переглянути блок із кільцями активності.
Очікуваний Кільця активності відображаються коректно. 
  
результат Значення відповідають отриманим даним із HealthKit.
  
Пройдено Так
 
Тестовий випадок приймального тестування №4 
Таблиця 3.18 
  
Тест-кейс № 4
 
Опис Поведінка застосунку при відсутності дозволу на доступ до 
 
HealthKit.
 
Кроки Заборонити доступ до HealthKit у налаштуваннях iOS. 
 
Запустити застосунок.
Очікуваний Застосунок повідомляє про відсутність необхідних дозволів. 
  
результат Аварійне завершення роботи відсутнє.
  
Пройдено Так
 
Тестовий випадок приймального тестування №5 
Таблиця 3.19
 
  
Тест-кейс № 5
  
Опис Перевірка роботи застосунку за відсутності даних про активність.
 
Кроки Використати пристрій без записів про фізичну активність. 
 
Відкрити застосунок.
 
 
 
 
  87 
 ЧДТУ 262355.001 ПЗ 
Продовження таблиці 3.19 
Очікуваний Інтерфейс відображається коректно. 
 
результат Застосунок показує нульові значення або відповідне інформаційне 
 
повідомлення.
  
Пройдено Так
 
Тестовий випадок приймального тестування №6 
Таблиця 3.20 
  
Тест-кейс № 6
 
Опис Перевірка стабільності роботи при багаторазовому оновленні 
 
даних.
 
Кроки Послідовно декілька разів виконати оновлення статистики. 
 
Перевірити відображення інформації після кожного оновлення.
Очікуваний Дані відображаються коректно після кожного оновлення. 
  
результат Помилки, зависання та дублювання інформації відсутні.
  
Пройдено Так
 
Аналіз проведеного тестування 
На основі функціональних вимог, визначених під час проєктування 
застосунку YourHealth, було сформовано набір тестових сценаріїв для 
перевірки коректності роботи системи. У результаті виконання всіх 
передбачених тестових випадків підтверджено працездатність основних 
функцій застосунку та їх відповідність поставленим вимогам. 
Проведене приймальне тестування показало, що застосунок стабільно 
отримує дані з Apple HealthKit, коректно відображає інформацію про фізичну 
активність користувача та забезпечує належний рівень зручності 
використання. Усі тестові сценарії були виконані успішно, тому приймальне 
тестування вважається завершеним, а програмний продукт готовим до 
  88 
 ЧДТУ 262355.001 ПЗ 
практичного використання. 
3.3 Приклади впровадженого програмного комплексу 
У даному підрозділі наведено приклади роботи мобільного застосунку 
YourHealth. Продемонстровано основні сценарії взаємодії користувача із 
системою, зокрема перегляд статистики фізичної активності, отримання 
даних із Apple HealthKit, відображення кілець активності, перегляд тренувань 
та обробку можливих помилок під час отримання інформації. Наведені 
ілюстрації дозволяють оцінити функціональні можливості застосунку, 
зручність його використання та відповідність поставленим вимогам. 
3.3.1 Опис функціоналу користувача додатку здоровʼя  
Після запуску мобільного застосунку YourHealth користувач переходить на 
головний екран системи (Рисунок. 3.4), де відображається інформація про 
фізичну активність, отримана з Apple HealthKit. Основним призначенням 
застосунку є надання користувачу зручного інструменту для перегляду 
показників активності та візуалізації статистичних даних у зрозумілому 
форматі. 
 У верхній частині екрана відображається привітання користувача та 
поточна дата. Центральну частину інтерфейсу займають кільця активності, 
виконані в стилі Apple Fitness, які демонструють прогрес користувача за 
основними показниками активності. Нижче розташовується інформація про 
нещодавні тренування та додаткові статистичні показники. 
 Помилка отримання даних може виникати у випадках, коли застосунок 
не має доступу до Apple HealthKit або необхідна інформація відсутня на 
пристрої користувача. У такій ситуації система відображає відповідне 
повідомлення про помилку або інформацію про відсутність доступних даних. 
 У цьому випадку окремі елементи інтерфейсу можуть відображатися 
порожніми до моменту успішного отримання даних.
 
  89 
 ЧДТУ 262355.001 ПЗ 
 
Рисунок 3.4 – Головна сторінка 
3.3.2 Розгортання системи 
У процесі розробки мобільного застосунку YourHealth використовувалася 
система контролю версій GitHub, яка забезпечувала централізоване 
зберігання програмного коду, керування змінами та спрощення командної 
роботи над проєктом.
 
  90 
 ЧДТУ 262355.001 ПЗ 
Рисунок 3.5 – Помилка фетчу даних головної сторінки 
Процес розгортання та підготовки програмного забезпечення до 
використання включав такі етапи: 
• розміщення та зберігання вихідного коду в репозиторії GitHub; 
• збірку програмного продукту в середовищі розробки Xcode; 
• встановлення застосунку на тестові пристрої для перевірки 
працездатності та коректності функціонування; 
• налаштування та перевірку взаємодії з фреймворком Apple HealthKit; 
• тестування правильності відображення статистичних показників, 
елементів інтерфейсу та навігації між екранами. 
  91 
 ЧДТУ 262355.001 ПЗ 
 
Рисунок 3.6 – Повідомлення про обробку попереднього запиту 
Оскільки застосунок функціонує локально на мобільному пристрої 
користувача та використовує Apple HealthKit як основне джерело даних про 
фізичну активність, необхідність у розгортанні окремої серверної 
інфраструктури відсутня. Такий підхід дозволяє спростити структуру 
програмного забезпечення, зменшити витрати на його підтримку та 
забезпечити високу швидкість роботи застосунку.  
 
  92 
 ЧДТУ 262355.001 ПЗ 
ВИСНОВКИ ДО ТРЕТЬОГО РОЗДІЛУ 
 У третьому розділі розглянуто процес розробки та тестування 
мобільного застосунку YourHealth, призначеного для моніторингу та 
візуалізації даних про фізичну активність користувача. Описано архітектуру 
програмного забезпечення, структуру основних компонентів системи та 
особливості реалізації користувацького інтерфейсу засобами SwiftUI із 
використанням архітектурного підходу MVVM. 
 Окрему увагу приділено інтеграції з фреймворком Apple HealthKit, який 
забезпечує отримання даних про фізичну активність користувача та їх 
подальше відображення у зручному й зрозумілому вигляді. 
 У межах розділу проведено модульне, інтеграційне, системне та 
приймальне тестування застосунку. Результати тестування підтвердили 
коректність реалізованої функціональності, стабільність роботи програмного 
забезпечення та його відповідність визначеним вимогам. 
 Отримані результати свідчать про успішне виконання поставлених 
завдань. Розроблений застосунок забезпечує користувачу зручний доступ до 
інформації про фізичну активність, надає можливість перегляду основних 
показників здоров’я та може використовуватися як інструмент для щоденного 
контролю особистої активності. 
 
  
  93 
 ЧДТУ 262355.001 ПЗ 
ЗАГАЛЬНІ ВИСНОВКИ 
 У кваліфікаційній роботі детально висвітлено процес проєктування, 
розробки та тестування мобільного застосунку YourHealth для iOS, 
призначеного для персонального відстеження здоров'я, фізичної активності та 
цілей користувача. Обґрунтовано вибір технологічного стеку (SwiftUI, 
Firebase), реалізовано архітектуру системи на базі патерну MVVM, а також 
описано функціональну, структурну та логічну моделі застосунку. Особливу 
увагу приділено інтеграції з Firebase — зокрема, механізму автентифікації, 
опрацюванню health-записів та візуалізації аналітичних даних. 
 Реалізовано збереження інформації у хмарному середовищі Firebase, що 
забезпечує міжпристрійну синхронізацію, постійний доступ до даних та 
захист персональної інформації користувача. Відмова від локальних баз даних 
дозволила спростити клієнтську частину без жодних втрат у 
функціональності, зберігши при цьому швидкий відгук інтерфейсу та його 
адаптивність. 
Проведено комплексне тестування програмного забезпечення, що охопило 
модульний, інтеграційний, системний та приймальний рівні перевірки.  
   Отримані результати підтвердили коректність реалізованої 
логіки, відповідність функціоналу сформульованим вимогам, а також 
надійність і стабільність роботи застосунку на пристроях з iOS 18 і новіше. 
Усі ключові сценарії використання було успішно відпрацьовано без 
виявлення критичних дефектів. 
 Таким чином, реалізований мобільний застосунок YourHealth повною 
мірою відповідає визначеним цілям роботи, є технічно завершеним, зручним 
у використанні та придатним до практичного впровадження. 
  94 
 ЧДТУ 262355.001 ПЗ 
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ 
1. Apple Developer Documentation. URL: https://developer.apple.com/documentation/ 
2. The Swift Programming Language Documentation. URL: https://docs.swift.org/swift-
book/documentation/the-swift-programming-language/ 
3. SwiftUI Documentation. URL: https://developer.apple.com/documentation/swiftui/ 
4. Firebase Documentation. URL: https://firebase.google.com/docs  
5. Firebase Authentication Documentation. URL: https://firebase.google.com/docs/auth 
6. Firebase Storage Documentation. URL: https://firebase.google.com/docs/storage 
7. Charts: iOS Charts Library. URL: https://github.com/ChartsOrg/Charts 
8. Medium. URL: https://medium.com/  
9. Stack Overflow. URL: https://stackoverflow.com/ 
10. Human Interface Guidelines. URL: https://developer.apple.com/design/human-interface-
guidelines/ 
11. SF Symbols Documentation. URL: https://developer.apple.com/sf-symbols 
12. Firebase Security Rules Documentation. URL: https://firebase.google.com/docs/rules 
13. SwiftUI App Architecture and Best Practices. URL: 
https://developer.apple.com/documentation/swiftui  
14. Clean Architecture in iOS Applications. URL: https://www.raywenderlich.com  
15. C4 Model for Software Architecture. URL: https://c4model.com  
16. Software Architecture Diagrams (C4 Model Guide). URL: 
https://www.infoq.com/articles/C4-architecture-model/ 
17. Mobile App Architecture Principles and Best Practices. URL: 
https://learn.microsoft.com/en-us/azure/architecture/ 
18. Build real-time apps and services with gRPC and Swift. 
URL:https://developer.apple.com/videos/play/wwdc2026/265/ 
  98 
ДОДАТОК А 
 
 
ЗАТВЕРДЖЕНО: 
Зав. кафедрою ПЗАС, професор 
_________________ Голуб С.В. 
“____” ______________ 2026 р. 
 
 
 
 
«Додаток для операційної системи iOS “YourHealth”» 
 
 
 
 
Специфікація 
482.ЧДТУ 262355.001 
Листів 2 
 
 
 
 
Розробник ________________ Михаль Р. В 
Керівник ________________ Метелап В. В. 
 
2026 
 ЧДТУ 262355.001  
Позначення Найменування Примітка 
Документація 
  
482.ЧДТУ 262355.12 01 Текст програми 
 
482.ЧДТУ 262355.34 01 Інструкція користувачеві 
 
482.ЧДТУ 262355.90 01 Графічні матеріали 
 
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 
 
  100 
ДОДАТОК Б 
 
 
 
 
 
 
 
 
«Додаток для операційної системи iOS “YourHealth”» 
 
 
 
 
 
 
 
Текст програми 
482.ЧДТУ 2621355.12.01 
Листів 23 
 
 
 
 
Розробник ________________ Михаль Р. В. 
 
 
2026 
482.ЧДТУ 262355.12 01 
HealthManager.swift: 
 
// 
//  HealthManager.swift 
//  YourHealth 
// 
//  Created by Ross Mykhal on 12/05/2026. 
// 
 
import Foundation 
import HealthKit 
 
extension Date { 
    static var startOfDay: Date { 
        let calendar =  Calendar.current 
        return calendar.startOfDay(for: Date()) 
    } 
     
    static var startOfWeek: Date { 
        let calendar = Calendar.current 
        var components =  calendar.dateComponents([.yearForWeekOfYear, 
.weekOfYear], from: Date()) 
        components.weekday = 2 
        return calendar.date(from: components) ?? Date() 
    } 
     
    func fetchMonthStartAndEndDate() -> (Date, Date) { 
        let calendar = Calendar.current 
        let startDateComponent = calendar.dateComponents([.year, .month], from: 
calendar.startOfDay(for: self)) 
        let startDate = calendar.date(from: startDateComponent) ?? self 
         
        let endDate = calendar.date(byAdding: DateComponents(month: 1, day: -1), 
to: startDate) ?? self 
        return (startDate, endDate) 
    } 
     
    func formatWorkoutDate() -> String { 
        let formatter = DateFormatter() 
        formatter.dateFormat = "MM d" 
        return formatter.string(from: self) 
    } 
} 
  102 
482.ЧДТУ 262355.12 01 
 
extension Double { 
    func formattedNumberString() -> String { 
        let formatter = NumberFormatter() 
        formatter.numberStyle = .decimal 
        formatter.maximumFractionDigits = 0 
         
        return formatter.string(from: NSNumber(value: self)) ?? "0" 
    } 
} 
 
class HealthManager { 
     
    static let shared =  HealthManager() 
    let healthStore = HKHealthStore() 
     
    private init() { 
 
        Task{ 
            do{ 
                try await requestHealthKitAccess() 
            } catch { 
                print(error.localizedDescription) 
            } 
        } 
    } 
     
    func requestHealthKitAccess() async throws { 
        let calories = HKQuantityType(.activeEnergyBurned) 
        let exercise = HKQuantityType(.appleExerciseTime) 
        let stand = HKCategoryType(.appleStandHour) 
        let steps = HKQuantityType(.stepCount) 
        let healthTypes: Set =  [calories, exercise, stand, steps] 
 
 
        try await healthStore.requestAuthorization(toShare: [], read: healthTypes) 
    } 
 
     
    func fetchTodayCaloriesBurned(completion: @escaping(Result<Double, 
Error>) -> Void) { 
        let calories = HKQuantityType(.activeEnergyBurned) 
  103 
482.ЧДТУ 262355.12 01 
        let predicate =  HKQuery.predicateForSamples(withStart: .startOfDay, end: 
Date()) 
        let query =  HKStatisticsQuery(quantityType: calories, 
quantitySamplePredicate: predicate) {_, results, error in 
            guard let quantity =  results?.sumQuantity(), error == nil else { 
                completion(.failure(NSError())) 
                return 
            } 
             
            let calorieCount =  quantity.doubleValue(for: .kilocalorie()) 
            completion(.success(calorieCount)) 
        } 
         
        healthStore.execute(query) 
    } 
     
    func fetchTodayExerciseTime(completion: @escaping(Result<Double, Error>) 
-> Void) { 
        let exercise = HKQuantityType(.appleExerciseTime) 
        let predicate =  HKQuery.predicateForSamples(withStart: .startOfDay, end: 
Date()) 
        let query =  HKStatisticsQuery(quantityType: exercise, 
quantitySamplePredicate: predicate) {_, results, error in 
            guard let quantity =  results?.sumQuantity(), error == nil else { 
                completion(.failure(NSError())) 
                return 
            } 
             
            let exerciseCount =  quantity.doubleValue(for: .kilocalorie()) 
            completion(.success(exerciseCount)) 
        } 
         
        healthStore.execute(query) 
    } 
     
    func fetchTodayStandHours(completion: @escaping (Result<Int, Error>) -> 
Void) { 
        let stand = HKCategoryType(.appleStandHour) 
        let predicate = HKQuery.predicateForSamples(withStart: .startOfDay, end: 
Date()) 
        let query = HKSampleQuery(sampleType: stand, predicate: predicate, limit: 
HKObjectQueryNoLimit, sortDescriptors: nil) { _, results, error in 
            guard let samples = results as? [HKCategorySample], error == nil else { 
  104 
482.ЧДТУ 262355.12 01 
                completion(.failure(URLError(.badURL))) 
                return 
            } 
 
            let standCount = samples.filter { $0.value == 
HKCategoryValueAppleStandHour.stood.rawValue }.count 
            completion(.success(standCount)) 
        } 
 
        healthStore.execute(query) 
    } 
     
    //MARK Fitness Activity 
    func fetchTodaySteps(completion: @escaping(Result<Activity, Error>) -> 
Void) { 
        let steps =  HKQuantityType(.stepCount) 
        let predicate = HKQuery.predicateForSamples(withStart: .startOfDay, end: 
Date()) 
        let query =  HKStatisticsQuery(quantityType: steps, 
quantitySamplePredicate: predicate) { _, results, error in 
            guard let quantity =  results?.sumQuantity(), error == nil else { 
                completion(.failure(NSError())) 
                return 
            } 
             
            let steps = quantity.doubleValue(for: .count()) 
            let activity =  Activity(id: 0, title: "Today Steps", subtitle: "Goal: 800", 
image: "figure.walk", tintColor: .green, amount: steps.formattedNumberString()) 
            completion(.success(activity)) 
        } 
         
        healthStore.execute(query) 
    } 
     
     
    func fetchCurrentWeekWorkoutStats(completion: @escaping 
(Result<[Activity], Error>) -> Void) { 
        let workouts = HKSampleType.workoutType() 
        let predicate = HKQuery.predicateForSamples(withStart: .startOfWeek, end: 
Date()) 
        let query = HKSampleQuery(sampleType: workouts, predicate: predicate, 
limit: HKObjectQueryNoLimit, sortDescriptors: nil) {[weak self] _, results, error 
in 
  105 
482.ЧДТУ 262355.12 01 
            guard let workouts =  results as? [HKWorkout], error ==  nil else { 
                completion(.failure(NSError())) 
                return 
            } 
             
            var runningCount: Int = 0 
            var strengthCount: Int = 0 
            var soccerCount: Int = 0 
            var basketballCount: Int = 0 
            var stairsCount: Int = 0 
            var kickBoxingCount: Int = 0 
             
         
            for workout in workouts { 
                let duration = Int(workout.duration)/60 
                if workout.workoutActivityType == .running { 
                    runningCount += duration 
                }else if workout.workoutActivityType == .traditionalStrengthTraining { 
                    strengthCount  += duration 
                } else if workout.workoutActivityType == .soccer { 
                    soccerCount += duration 
                } else if workout.workoutActivityType == .basketball { 
                    basketballCount += duration 
                } else if workout.workoutActivityType == .kickboxing { 
                    kickBoxingCount += duration 
                } 
            } 
             
            completion(.success(self?.generateActivitiesFromDurations(running: 
runningCount, strength: strengthCount, soccer: soccerCount, basketball: 
basketballCount, stairs: stairsCount, kickboxing: kickBoxingCount) ?? [])) 
        } 
        healthStore.execute(query) 
    } 
     
    func generateActivitiesFromDurations(running: Int, strength: Int, soccer: Int, 
basketball: Int, stairs: Int, kickboxing: Int) -> [Activity] { 
        return [ 
            Activity(id: 1, title: "Running", subtitle: "This week", image: "figure.run", 
tintColor: .green, amount: "\(running)"), 
            Activity(id: 2, title: "Strength Training", subtitle: "This week", image: 
"dumbell", tintColor: .blue, amount: "\(strength)"), 
  106 
482.ЧДТУ 262355.12 01 
            Activity(id: 3, title: "Soccer", subtitle: "This week", image: "figure.soccer", 
tintColor: .indigo, amount: "\(soccer)"), 
            Activity(id: 4, title: "Basketball", subtitle: "This week", image: 
"figure.basketball", tintColor: .red, amount: "\(basketball)"), 
            Activity(id: 5, title: "Stairstepper", subtitle: "This week", image: 
"figure.stairs", tintColor: .brown, amount: "\(stairs)"), 
            Activity(id: 6, title: "Kickboxing", subtitle: "This week", image: 
"figure.kickboxing", tintColor: .cyan, amount: "\(kickboxing)"), 
 
 
 
        ] 
    } 
     
    // MARK: Recent Workouts 
    func fetchWorkoutsForMonth(month: Date, completion: @escaping 
(Result<[Workout], Error>) -> Void) { 
        // Example start and end dates for the given month 
        let calendar = Calendar.current 
        guard let startDate = calendar.date(from: calendar.dateComponents([.year, 
.month], from: month)), 
              let endDate = calendar.date(byAdding: .month, value: 1, to: startDate) 
else { 
            completion(.failure(URLError(.badURL))) 
            return 
        } 
         
        let workoutsType = HKSampleType.workoutType() 
        let predicate = HKQuery.predicateForSamples(withStart: startDate, end: 
endDate, options: .strictStartDate) 
        let sortDescriptor = NSSortDescriptor(key: 
HKSampleSortIdentifierStartDate, ascending: false) 
         
        let query = HKSampleQuery(sampleType: workoutsType, predicate: 
predicate, limit: 10, sortDescriptors: [sortDescriptor]) { _, results, error in 
            if let error = error { 
                completion(.failure(error)) 
                return 
            } 
             
            guard let hkWorkouts = results as? [HKWorkout] else { 
                completion(.failure(URLError(.cannotDecodeRawData))) 
                return 
  107 
482.ЧДТУ 262355.12 01 
            } 
             
            let workoutArray = hkWorkouts.map { workout in 
                Workout( 
                    id: nil, title: workout.workoutActivityType.name, 
                    image: workout.workoutActivityType.image, 
                    tintColor: workout.workoutActivityType.randomColor, 
                    duration: "\(Int(workout.duration) / 60)", // Convert seconds to 
minutes 
                    date: workout.startDate.formatWorkoutDate(), 
                    calories: workout.totalEnergyBurned?.doubleValue(for: 
HKUnit.kilocalorie()).formattedNumberString() ?? "0" 
                ) 
            } 
             
            completion(.success(workoutArray)) 
        } 
         
        HKHealthStore().execute(query) 
    } 
     
 
     
 
 
} 
 
extension HealthManager { 
    struct YearChartDataResult { 
        let ytd: [DailyStepModel] 
        let onYear: [DailyStepModel] 
         
    } 
    func fetchYTDOneYearChartData(completion: @escaping 
(Result<YearChartDataResult, Error>) -> Void) { 
//        let steps = HKQuantityType(.stepCount) 
        guard let steps = HKQuantityType.quantityType(forIdentifier: .stepCount) 
else { 
               completion(.failure(NSError(domain: "HealthManager", code: 0, 
userInfo: [NSLocalizedDescriptionKey: "Could not create step count type"]))) 
               return 
           } 
        let calendar = Calendar.current 
  108 
482.ЧДТУ 262355.12 01 
         
        var oneYearMonths = [DailyStepModel]() 
        var ytdMonths = [DailyStepModel]() 
         
        for i in 0...11 { 
            let month = calendar.date(byAdding: .month, value: -i, to: Date()) ?? 
Date() 
            let (startOfMonth, endOfMonth) = month.fetchMonthStartAndEndDate() 
            let predicate = HKQuery.predicateForSamples(withStart: startOfMonth, 
end: endOfMonth) 
            let query = HKStatisticsQuery(quantityType: steps, 
quantitySamplePredicate: predicate) {_, results, 
                error in 
                guard let quantity = results?.sumQuantity(), error == nil else { 
                    completion(.failure(URLError(.badURL))) 
                    return 
                } 
                 
                let stepCount = Int(quantity.doubleValue(for: HKUnit.count())) 
                 
                if i == 0 { 
                    oneYearMonths.append(DailyStepModel(date: month, count: 
Int(stepCount))) 
                    ytdMonths.append(DailyStepModel(date: month, count: 
Int(stepCount))) 
                } else { 
                    oneYearMonths.append(DailyStepModel(date: month, count: 
Int(stepCount))) 
                    if calendar.component(.year, from: month) == 
calendar.component(.year, from: Date()) { 
                        ytdMonths.append(DailyStepModel(date: month, count: 
Int(stepCount))) 
 
                    } 
                } 
                if i == 11 { 
                    completion(.success(YearChartDataResult(ytd: ytdMonths, onYear: 
oneYearMonths))) 
                } 
            } 
            healthStore.execute(query) 
        } 
    } 
  109 
482.ЧДТУ 262355.12 01 
} 
 
 
HomeViewModel.swift: 
 
// 
//  HomeViewModel.swift 
//  YourHealth 
// 
//  Created by Ross Mykhal on 12/05/2026. 
// 
 
import SwiftUI 
 
 
class HomeViewModel: ObservableObject { 
    let healthManager = HealthManager.shared 
    @Published var calories: Int =  123 
    @Published var exercise: Int =  23 
    @Published var stand: Int =  300 
 
    @Published var activities = [Activity]() 
    @Published var workouts = 
    [ 
       Workout(id: 0, title: "Running", image: "figure.run", tintColor: .cyan, 
duration: "51", date: "Aug 1", calories: "512"), 
       Workout(id: 1, title: "Strength Training", image: "figure.run", tintColor: 
.green, duration: "51", date: "Aug 11", calories: "512"), 
       Workout(id: 2, title: "Jumping", image: "figure.run", tintColor: .yellow, 
duration: "5", date: "Aug 21", calories: "512"), 
       Workout(id: 3, title: "Planking", image: "figure.run", tintColor: .red, duration: 
"10", date: "Aug 1", calories: "512") 
    ] 
    /*[Workout]()*/ 
 
    var mockActivities =  [ 
        Activity(id: 0, title: "Today steps", subtitle: "Goal 12,000", image: 
"figure.walk", tintColor: .green, amount: "8990"), 
        Activity(id: 1, title: "Today calories", subtitle: "Goal 10,000", image: 
"figure.walk", tintColor: .red, amount: "15500"), 
        Activity(id: 2, title: "Running", subtitle: "This week", image: "figure.walk", 
tintColor: .blue, amount: "60 minutes"), 
  110 
482.ЧДТУ 262355.12 01 
        Activity(id: 3, title: "Weight Lifting", subtitle: "This week", image: 
"figure.walk", tintColor: .orange, amount: "20 minutes"), 
 
    ] 
     
    var mockWorkouts 
     =  [ 
        Workout(id: 0, title: "Running", image: "figure.run", tintColor: .cyan, 
duration: "51", date: "Aug 1", calories: "512"), 
        Workout(id: 1, title: "Strength Training", image: "figure.run", tintColor: 
.green, duration: "51", date: "Aug 11", calories: "512"), 
        Workout(id: 2, title: "Jumping", image: "figure.run", tintColor: .yellow, 
duration: "5", date: "Aug 21", calories: "512"), 
        Workout(id: 3, title: "Planking", image: "figure.run", tintColor: .red, duration: 
"10", date: "Aug 1", calories: "512") 
     ] 
     
    init() { 
        Task { 
            do { 
                try await healthManager.requestHealthKitAccess() 
                fetchTodayCalories() 
                fetchTodayExerciseTime() 
                fetchTodayStandHours() 
                fetchTodaySteps() 
                fetchRecentWorkouts() 
 
            } 
        } 
         
//         
//        healthManager.fetchTodayStandHours {result in 
//            switch result{ 
//            case .success(let success): 
//                print(success) 
//            case .failure(let failure): 
//                print(failure.localizedDescription) 
//            } 
//        } 
    } 
     
    func fetchTodayCalories() { 
        healthManager.fetchTodayCaloriesBurned { [weak self] result in 
  111 
482.ЧДТУ 262355.12 01 
            switch result { 
            case .success(let calories): 
                DispatchQueue.main.async { 
                    guard let self = self else { return } 
                    self.calories = Int(calories) 
                    let activity = Activity( 
                        id: 1, 
                        title: "Calories Burned", 
                        subtitle: "today", 
                        image: "flame", 
                        tintColor: .red, 
                        amount: calories.formattedNumberString() 
                    ) 
                    // If you want to add the activity to your activities array 
                    // self.activities.append(activity) 
                } 
            case .failure(let error): 
                // More comprehensive error handling 
//                print("Failed to fetch calories: \(error)") 
                 
                // Optional: More detailed logging 
                if let localizedError = error as? LocalizedError { 
                    print("Localized description: \(localizedError.localizedDescription)") 
                } 
                 
                // Optional: Handle specific error types if applicable 
                // switch error { 
                //     case SomeSpecificErrorType: 
                //         // Handle specific error 
                //     default: 
                //         break 
                // } 
            } 
        } 
    } 
     
     
    func fetchTodayExerciseTime() { 
        healthManager.fetchTodayExerciseTime { result in 
            switch result { 
            case .success(let exercise): 
                DispatchQueue.main.async { 
                    self.exercise = Int(exercise) 
  112 
482.ЧДТУ 262355.12 01 
                } 
            case .failure(let failure): 
//                print(failure.localizedDescription) 
                print("failed to fetch exercise time") 
 
            } 
        } 
    } 
     
    func fetchTodayStandHours(){ 
        healthManager.fetchTodayStandHours {result in 
            switch result{ 
            case .success(let hours): 
                DispatchQueue.main.async { 
                    self.stand = Int(hours) 
                } 
            case .failure(let failure): 
                print(failure.localizedDescription) 
            } 
        } 
    } 
     
    //MARK: Fitness Activity 
    func fetchTodaySteps() { 
        healthManager.fetchTodaySteps { 
            result in 
            switch result { 
            case .success(let activity): 
                DispatchQueue.main.async { 
//                    self.activities.append(activity) 
                    self.activities = [ 
                                      activity, 
                                      Activity(id: 2, title: "Steps", subtitle: "Goal 12,000", 
image: "figure.walk", tintColor: .green, amount: "10,000"), 
                                      Activity(id: 3, title: "Distance", subtitle: "Today", image: 
"figure.walk", tintColor: .blue, amount: "5 km") 
                                  ] 
                } 
                 
                 
            case .failure(let failure): 
//                print(failure.localizedDescription) 
                print("failed to fetch today steps") 
  113 
482.ЧДТУ 262355.12 01 
            } 
        } 
    } 
     
     
    //MARK: Fetch Recent Workouts 
 
    func fetchRecentWorkouts() { 
        healthManager.fetchWorkoutsForMonth(month: Date()) { result in 
            switch result{ 
            case .success(let workouts): 
                DispatchQueue.main.async { 
                    self.workouts =  Array(workouts.prefix(4))                } 
            case .failure(let failure): 
//                print(failure.localizedDescription) 
                print("Failed to fetch recent workouts") 
            } 
        } 
    } 
     
 
} 
 
 
HomeView.swift: 
 
// 
//  HomeView.swift 
//  YourHealth 
// 
//  Created by Ross Mykhal on 12/05/2026. 
// 
 
import SwiftUI 
 
 
struct HomeView: View { 
    @StateObject var viewModel =  HomeViewModel() 
    @State private var circleProgress: Int = 100 
     
     
    var body: some View { 
        NavigationView { 
  114 
482.ЧДТУ 262355.12 01 
            ScrollView(showsIndicators: false) { 
                VStack(alignment: .leading){ 
                    Text("Welcome") 
                        .font(.largeTitle) 
                        .padding() 
 
                     
                    HStack{ 
                        Spacer() 
                         
                        VStack{ 
                            VStack(alignment: .leading, spacing: 8) { 
                                Text("Calories") 
                                    .font(.callout) 
                                    .bold() 
                                    .foregroundColor(.red) 
                                 
                                Text("\(viewModel.calories) kcal") 
                                    .bold() 
                            }.padding(.bottom) 
                             
                            VStack(alignment: .leading, spacing: 8) { 
                                Text("Active") 
                                    .font(.callout) 
                                    .bold() 
                                    .foregroundColor(.green) 
                                 
                                Text("\(viewModel.exercise)mins") 
                                    .bold() 
                            }.padding(.bottom) 
                             
                            VStack(alignment: .leading, spacing: 8) { 
                                Text("Stand") 
                                    .font(.callout) 
                                    .bold() 
                                    .foregroundColor(.blue) 
                                 
                                Text("\(viewModel.stand) hours") 
                                    .bold() 
                            } 
 
                        } 
                        Spacer() 
  115 
482.ЧДТУ 262355.12 01 
                        ZStack{ 
                            ProgressCricleView(progress: $viewModel.calories, goal: 600, 
color: .red) 
                            ProgressCricleView(progress: $viewModel.exercise, goal: 60, 
color: .green).padding(.all, 20) 
                            ProgressCricleView(progress: $viewModel.stand, goal: 12, 
color: .blue).padding(.all, 40) 
 
                        }.padding(.horizontal) 
                         
                        Spacer() 
                    }.padding() 
                     
                    HStack{ 
                        Text("Fitness Activity") 
                            .font(.title2) 
                         
                        Spacer() 
                         
                        Button{ 
                            print("show more") 
                        } label: { 
                            Text("Show more") 
                                .padding(.all, 10) 
                                .foregroundColor(.white) 
                                .background(.blue) 
                                .cornerRadius(20) 
                        } 
                    }.padding(.horizontal) 
                     
                    if viewModel.activities.isEmpty { 
                        VStack { 
                            Image(systemName: "figure.walk") 
                                .resizable() 
                                .aspectRatio(contentMode: .fit) 
                                .frame(width: 100, height: 100) 
                                .foregroundColor(.gray) 
                             
                            Text("No fitness activities today") 
                                .font(.headline) 
                                .foregroundColor(.gray) 
                             
                            Text("Keep moving to track your progress!") 
  116 
482.ЧДТУ 262355.12 01 
                                .font(.subheadline) 
                                .foregroundColor(.secondary) 
                        } 
                        .frame(maxWidth: .infinity) 
                        .padding() 
//                        LazyVGrid(columns: Array(repeating: GridItem(spacing: 20), 
count: 2)){ 
//                            ForEach(viewModel.mockActivities, id: \.id) { activity in 
//                                ActivityCard(activity: activity) 
//                            } 
//                        }.padding() 
                    } else { 
                        LazyVGrid(columns: Array(repeating: GridItem(spacing: 20), 
count: 2)){ 
                            ForEach(viewModel.activities, id: \.id) { activity in 
                                ActivityCard(activity: activity) 
                            } 
                        } 
                    } 
                     
                    HStack{ 
                        Text("Recent Workouts") 
                            .font(.title2) 
                         
                        Spacer() 
                         
                        NavigationLink { 
                            EmptyView() 
                        } label: { 
                            Text("Show more") 
                                .padding(.all, 10) 
                                .foregroundColor(.white) 
                                .background(.blue) 
                                .cornerRadius(20) 
 
                        } 
                    }.padding(.horizontal) 
                     
                    LazyVStack{ 
                        ForEach(viewModel.workouts, id: \.id) {workout in 
                            WorkoutCard(workout: workout) 
                        } 
 
  117 
482.ЧДТУ 262355.12 01 
                    } 
 
                } 
            } 
 
        } 
    } 
} 
 
#Preview { 
    HomeView() 
} 
 
 
ChartsViewModel.swift: 
 
// 
//  ChartsViewModel.swift 
//  YourHealth 
// 
//  Created by Ross Mykhal on 14/05/2026. 
// 
 
import Foundation 
 
 
class ChartsViewModel: ObservableObject { 
    @Published var selectedChartType: ChartOptions = .oneWeek 
    @Published var ytdChartData = [DailyStepModel]() 
    @Published var oneYearChartData = [DailyStepModel]() 
     
    @Published var ytdTotal: Int = 0 
       @Published var oneYearTotal: Int = 0 
        
       @Published var ytdAverage: Int = 0 
       @Published var oneYearAverage: Int = 0 
     
    let healthManager = HealthManager.shared 
     
    init() { 
        fetchYTDAndOneYearChartData() 
    } 
     
  118 
482.ЧДТУ 262355.12 01 
    // Mock Data Generation 
    var oneWeekMockData: [DailyStepModel] { 
        (0..<7).map { i in 
            DailyStepModel( 
                date: Calendar.current.date(byAdding: .day, value: -i, to: Date()) ?? 
Date(), 
                count: Int.random(in: 8000...13000) 
            ) 
        } 
    } 
     
    var oneMonthMockData: [DailyStepModel] { 
        (0..<30).map { i in 
            DailyStepModel( 
                date: Calendar.current.date(byAdding: .day, value: -i, to: Date()) ?? 
Date(), 
                count: Int.random(in: 8000...13000) 
            ) 
        } 
    } 
     
    var threeMonthsMockData: [DailyStepModel] { 
        (0..<90).map { i in 
            DailyStepModel( 
                date: Calendar.current.date(byAdding: .day, value: -i, to: Date()) ?? 
Date(), 
                count: Int.random(in: 7000...14000) 
            ) 
        } 
    } 
     
    var oneYearMockData: [DailyStepModel] { 
        (0..<365).map { i in 
            let baseCount = 10000.0 
            let seasonalVariation = sin(Double(i) * .pi / 182.5) * 2000 
            let randomVariation = Double(Int.random(in: -1000...1000)) 
            let trendVariation = Double(i) * 5 
             
            let count = Int(max(baseCount + seasonalVariation + randomVariation + 
trendVariation, 5000)) 
            return DailyStepModel( 
                date: Calendar.current.date(byAdding: .day, value: -i, to: Date()) ?? 
Date(), 
  119 
482.ЧДТУ 262355.12 01 
                count: count 
            ) 
        } 
    } 
    // Computed Properties for Statistics 
    func getTotalSteps(for data: [DailyStepModel]) -> Int { 
        Int(data.reduce(0) { $0 + $1.count }) 
    } 
     
    func getAverageSteps(for data: [DailyStepModel]) -> Int { 
        guard !data.isEmpty else { return 0 } 
        return Int(data.reduce(0) { $0 + $1.count } / Int(data.count)) 
    } 
     
    func getChartData() -> [DailyStepModel] { 
        switch selectedChartType { 
        case .oneWeek: return oneWeekMockData 
        case .oneMonth: return oneMonthMockData 
        case .threeMonths: return threeMonthsMockData 
        case .yearToDate: 
            return ytdChartData.isEmpty ? oneYearMockData : ytdChartData 
        case .oneYear: 
            return oneYearChartData.isEmpty ? oneYearMockData : 
oneYearChartData 
        } 
    } 
     
    func getChartXAxisUnit() -> Calendar.Component { 
        switch selectedChartType { 
        case .oneWeek, .oneMonth, .threeMonths: return .day 
        case .yearToDate, .oneYear: return .month 
        } 
    } 
     
    func fetchYTDAndOneYearChartData() { 
        healthManager.fetchYTDOneYearChartData{[weak self ] result in 
            switch result { 
            case .success(let result): 
                DispatchQueue.main.async { 
                    self?.ytdChartData =  result.ytd 
                    self?.oneYearChartData = result.onYear 
                     
                    self?.ytdTotal = self?.ytdChartData.reduce(0, { $0 + $1.count } ) ?? 0 
  120 
482.ЧДТУ 262355.12 01 
                    self?.oneYearTotal = self?.oneYearChartData.reduce(0, {$0 + 
$1.count}) ?? 0 
                     
                    self?.ytdAverage = (self?.ytdTotal ?? 0) / 
Calendar.current.component(.month, from: Date()) 
                    self?.oneYearAverage =  (self?.ytdTotal ?? 0) / 12 
                     
                } 
            case .failure(let error): 
                print("Error fetching chart data: \(error)") 
                // Optionally set a default value or show an error state 
                 DispatchQueue.main.async { 
                     self?.ytdChartData = [] 
                     self?.oneYearChartData = [] 
                 } 
            } 
        } 
    } 
} 
 
 
ChartsView.swift: 
import SwiftUI 
import Charts 
 
 
 
 
struct ChartsView: View { 
    @StateObject private var viewModel = ChartsViewModel() 
     
    var body: some View { 
        ScrollView { 
            VStack(spacing: 20) { 
                // Header 
                Text("Step Tracking") 
                    .font(.largeTitle) 
                    .fontWeight(.bold) 
                    .frame(maxWidth: .infinity, alignment: .leading) 
                    .padding(.horizontal) 
                 
                // Statistics Row 
                HStack(spacing: 15) { 
  121 
482.ЧДТУ 262355.12 01 
                    StatisticsCardView( 
                        title: "Average", 
                        value: String(viewModel.getAverageSteps(for: 
viewModel.getChartData())) 
                    ) 
                     
                    StatisticsCardView( 
                        title: "Total", 
                        value: String(viewModel.getTotalSteps(for: 
viewModel.getChartData())) 
                    ) 
                } 
                .padding(.horizontal) 
                 
                // Chart 
                Chart { 
                    ForEach(viewModel.getChartData()) { data in 
                        BarMark( 
                            x: .value("Date", data.date, unit: 
viewModel.getChartXAxisUnit()), 
                            y: .value("Steps", data.count) 
                        ) 
                    } 
                } 
                .foregroundColor(.green) 
                .frame(height: 450) 
                .padding(.horizontal) 
                 
                // Period Selector 
                ScrollView(.horizontal, showsIndicators: false) { 
                    HStack(spacing: 10) { 
                        ForEach(ChartOptions.allCases, id: \.rawValue) { option in 
                            Button(action: { 
                                withAnimation { 
                                    viewModel.selectedChartType = option 
                                } 
                            }) { 
                                Text(option.rawValue) 
                                    .foregroundColor(viewModel.selectedChartType == option 
? .white : .green) 
                                    .padding(.horizontal, 15) 
                                    .padding(.vertical, 10) 
  122 
482.ЧДТУ 262355.12 01 
                                    .background(viewModel.selectedChartType == option ? 
Color.green : Color.clear) 
                                    .cornerRadius(10) 
                            } 
                        } 
                    } 
                    .padding(.horizontal) 
                } 
            } 
        } 
    } 
} 
 
 
#Preview { 
    ChartsView() 
} 
 
 
FitnessAppApp.swift: 
 
// 
//  FitnessAppApp.swift 
//  YourHealth 
// 
//  Created by Ross Mykhal on 12/05/2026. 
// 
 
import SwiftUI 
 
@main 
struct FitnessAppApp: App { 
    var body: some Scene { 
        WindowGroup { 
            ContentView() 
        } 
    } 
} 
 
 
  
  123 
482.ЧДТУ 262355.12 01 
FitnessTabView.swift: 
 
// 
//  FitnessTabView.swift 
//  YourHealth 
// 
//  Created by Ross Mykhal on 12/05/2026. 
// 
 
import SwiftUI 
 
struct FitnessTabView: View { 
    @State var selectedTab =  "Home" 
    @State var showTerms =  true 
    @State var username: String? = nil 
     
    init() { 
        let appearance = UITabBarAppearance() 
        appearance.configureWithOpaqueBackground() 
        //Changes the color of the icon to green when a tab is selected 
        appearance.stackedLayoutAppearance.selected.iconColor = .green 
        appearance.stackedLayoutAppearance.selected.titleTextAttributes = 
        [NSAttributedString.Key.foregroundColor: UIColor.green] 
        UITabBar.appearance().scrollEdgeAppearance = appearance 
    } 
     
     
    var body: some View { 
        TabView(selection: $selectedTab) { 
            HomeView() 
                .tag("Home") 
                .tabItem { 
                Image(systemName: "house") 
            } 
             
            ChartsView() 
                .tag("Historic") 
                .tabItem { 
                Image(systemName: "chart.line.uptrend.xyaxis") 
            } 
             
            LeaderboardView(showTerms: $showTerms) 
                .tag("Leaderboard") 
  124 
482.ЧДТУ 262355.12 01 
                .tabItem{ 
                    Image(systemName: "list.bullet") 
                } 
         
        } 
        .onAppear{ 
            showTerms =  username == nil 
        } 
    } 
} 
 
#Preview { 
    FitnessTabView() 
} 
 
 
  125 
ДОДАТОК В 
 
 
 
 
 
 
 
 
«Додаток для операційної системи iOS “YourHealth”» 
 
 
 
 
 
 
 
Інструкція користувачеві 
482.ЧДТУ 262355.34.01 
Листів 9 
 
 
 
 
Розробник ________________ Михаль Р. В. 
 
2026 
482.ЧДТУ 262355.34.01 
Для того аби використовувати застосунок, нам потрібно його відкрити, 
натиснувши на іконку застосунку (Рисунок 1) 
 
Рисунок 1 - вигляд додатку 
Після відкриття застосунку нас зустрічає екран надання дозволу на 
використання даних про рух (див. рис2, Рисунок 3.). Є кнопка надання всіх 
потрібних доступів для повного функціонування застосунку. Після чого ми 
підтверджуємо надання всіх даних. 
  125 
482.ЧДТУ 262355.34.01 
 
 
Рисунок 2 - екран надання доступу фіз. активності застосунку 
  
  126 
482.ЧДТУ 262355.34.01 
 
Рисунок 3 - екран надання доступу фіз. аквтиності після натискання кнопки 
“надати все” 
Після надання доступу до активності нас зустрічає головний екран застосунку, 
на якому видно зручні кільця, які показують прогрес до цілі на день (Рисунок 4).  
Лівіше від кілець розміщена більш детальна інформація про прогрес. Після кілець 
можна побачити сьогоднішню активність та персональні цілі 
 
  127 
482.ЧДТУ 262355.34.01 
Рисунок 4 - головний екран 
 
Прогорнувши нижче відображені недавні тренування та коротка інформація 
про спалені ккал а також тривалість тренування (Рисунок 5).  
  128 
482.ЧДТУ 262355.34.01 
Рисунок 5 - недавня активність 
 
В меню нижче в нас є можливість перейти до графіків, які відображають 
кількість пройдених кроків за певний відрізок часу, який можна вибрати в меню 
нижче (Рисунок 6, рис7, Рисунок 8.) 
 
 
 
 
  129 
482.ЧДТУ 262355.34.01 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Рисунок 6 – графік пройдених кроків за останній тиждень 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Рисунок 7 - графік пройдених кроків за останній місяць 
  130 
482.ЧДТУ 262355.34.01 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Рисунок 8 - кількість пройдених кроків за останній рік 
Також є можливість подивитись статистику інших користувачів, для цього в 
меню застосунку потрібно перейти до лідерборду, ввести своє імʼя та натиснути 
кнопку прийняття політики застосунку (Рисунок 9). Після цих дій, в нас буде 
доступ до лідерборду (Рисунок 10).  
  131 
482.ЧДТУ 262355.34.01 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Рисунок 9 - екран створення імені та доступу до лідерборду 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Рисунок 10 - вигляд лідерборду 
  132 
ДОДАТОК Г 
 
 
 
 
 
 
 
 
 
 
 
«Додаток для операційної системи iOS "YourHealth"» 
 
 
 
 
 
 
 
 
 
 
 
Графічні матеріали 
482.ЧДТУ 262355.90.01 
Листів 15 
 
 
 
 
 
 
 
 
 
Розробник    Михаль Р. В. 
Керівник    Метелап. В. В. 
 
 
 
2026 
 
482.ЧДТУ 262355 90 
01 
 
 
Рис 1 - Перший слайд 
 
 
Рис 2 - актуальність теми 
 135 
 
482.ЧДТУ 262355 90 
01 
 
Рис 3 - мета та завдання 
 
Рис 4 - новизна та практичне значення 
 136 
 
482.ЧДТУ 262355 90 
01 
 
Рис 5 - аналоги 
 
 
Рис 6 - постановка задачі 
 137 
 
482.ЧДТУ 262355 90 
01 
 
Рис 7 - особистий внесок автора 
 
Рис 8 - функціональні вимоги 
 138 
 
482.ЧДТУ 262355 90 
01 
 
Рис 9 - нефункціональні вимоги 
 
Рис 10 - діаграма прцендентів 
 139 
 
482.ЧДТУ 262355 90 
01 
 
Рис 11 - спрощена діаграма класів 
 
Рис 12 - діаграма класів 
 140 
 
482.ЧДТУ 262355 90 
01 
 
Рис 13 - діаграма пакетів 
 
Рис 14 - діаграма компонентів 
 141 
 
482.ЧДТУ 262355 90 
01 
 
Рис 15 - діаграма розгортання 
 
Рис 16 - діаграма діяльності 
 142 
 
482.ЧДТУ 262355 90 
01 
 
Рис 17 - діаграма послідовності 
 
Рис 18 - діаграма комунікації 
 143 
 
482.ЧДТУ 262355 90 
01 
 
Рис 19 - діаграма скінченного автомату 
 
Рис 20 - методи проектування та конструювання 
 144 
 
482.ЧДТУ 262355 90 
01 
 
Рис 21 - стек технологій 
 
Рис 22 - спрощена структурна схема додатку 
 145 
 
482.ЧДТУ 262355 90 
01 
 
Рис 23 - відео 
 
Рис 24 - тестування системи 
 146 
 
482.ЧДТУ 262355 90 
01 
 
Рис 25 - отримані результати 
 
Рис 26 - висновок 
 147 
 
482.ЧДТУ 262355 90 
 01 
 
Рис 27 - Дякую увагу 
 148