- Удобно логировать события в коде.
- Не зависеть жестко от Firebase: в будущем можно подменить/добавить провайдеры.
- Один enum с кейсами:
screenView(screen: AppScreen)userAction(action: UserAction)appError(kind: AppErrorKind, error: any Error)
- В enum хранится только бизнес-смысл события, без Firebase API.
- Вложенный enum
UserAction:iconSelected(iconName: String)deletesortitemSavedcreateedit
- Вложенный enum
AppScreen:root,main,item,more,themeIcon,appData,privacy
- Вложенный enum
AppErrorKind:setIcon,createBackup,restoreBackup,deleteAllData
- Протокол с 1 методом:
log(event: AnalyticsEvent). - Реализации:
FirebaseAnalyticsProvider(основной)NoopAnalyticsProvider(для тестов/превью)
- Сервис вызывает один или несколько провайдеров.
- Публичный API:
log(_ event: AnalyticsEvent). - Без сложной магии и без преждевременной оптимизации.
- В
SwiftUI_DaysAppинжектитьAnalyticsServiceчерез.environment(...). - Во View использовать
@Environment(AnalyticsService.self). - Во view model передавать
AnalyticsServiceявно через инициализатор (constructor injection) и хранить ссылку на сервис.
- Добавить единый модификатор вида
trackEvent(...). - Под капотом модификатор берет
AnalyticsServiceизEnvironmentи логирует событие. - Для
screenViewиспользоватьonAppearкак базовый и самый простой вариант. - Если появятся дубли на сложной навигации, добавить легкую защиту от повторного трекинга в самом модификаторе, не меняя экраны.
- Создать
Models/AnalyticsEvent.swift. - Создать
Services/Analytics/AnalyticsProvider.swift. - Создать
Services/Analytics/FirebaseAnalyticsProvider.swift. - Создать
Services/Analytics/NoopAnalyticsProvider.swift. - Создать
Services/Analytics/AnalyticsService.swift. - Создать
Extensions/View+Analytics.swiftс модификаторомtrackEvent(...). - Подключить сервис в
SwiftUI_DaysApp.
- Добавить
screenViewчерез общий модификатор (.trackEvent(...)) на:RootScreen(root)MainScreen(main)ItemScreen(item)MoreScreen(more)ThemeIconScreen(theme_icon)AppDataScreen(app_data)PrivacyScreen(privacy)
- В
ThemeIconScreen/IconViewModelлогироватьuserAction(.iconSelected)приTask { await iconViewModel.setIcon(icon) }. - Передавать название выбранной иконки (например,
iconNameили номерiconNumber) в аналитику.- Изменено:
UserAction.iconSelected→iconSelected(iconName: String), обновлёнIconViewModel.setIcon()иFirebaseAnalyticsProvider.
- Изменено:
- Логировать
userAction(.delete)при нажатии кнопки удаления (вMainScreen+ListView). - Логировать
userAction(.sort)при изменении сортировки списка (вMainScreen,onChangeу picker).
- Логировать
appErrorвcatchминимум в:ThemeIconScreen+IconViewModelAppDataScreen
- Для каждого события ошибки передавать:
operation(например,set_icon,restore_backup)domaincode
- Добавить тесты для
AnalyticsEvent,AnalyticsProviderиAnalyticsService(SwiftUI-DaysTests/AnalyticsServiceTests.swift).
- Не вызывать Firebase API напрямую из экранов.
- Не использовать
params: [String: Any]в публичном API сервиса. - На первом шаге для
screenViewиспользоватьonAppearчерез общий модификатор. - Не добавлять сложную дедупликацию экранов на первом шаге.
- Если появится второй инструмент (например, Amplitude), добавить новый provider без изменения UI-кода.
Environmentиспользовать только во View; для view model — только явный DI сервиса.
- События отправляются через
AnalyticsServiceиз экранов и view model. - Firebase-провайдер работает для
screenView,userAction,appError. - Добавление нового провайдера не требует правок в экранах.
-
iconSelectedпередаёт название иконки в аналитику. -
deleteиsortсобытия логируются. - Тесты аналитики написаны.