Skip to content

Latest commit

 

History

History
119 lines (89 loc) · 6.13 KB

File metadata and controls

119 lines (89 loc) · 6.13 KB

План внедрения аналитики (простой и расширяемый)

Цель

  • Удобно логировать события в коде.
  • Не зависеть жестко от Firebase: в будущем можно подменить/добавить провайдеры.

Минимальная архитектура

1. AnalyticsEvent (единая модель событий)

  • Один enum с кейсами:
    • screenView(screen: AppScreen)
    • userAction(action: UserAction)
    • appError(kind: AppErrorKind, error: any Error)
  • В enum хранится только бизнес-смысл события, без Firebase API.
  • Вложенный enum UserAction:
    • iconSelected(iconName: String)
    • delete
    • sort
    • itemSaved
    • create
    • edit
  • Вложенный enum AppScreen:
    • root, main, item, more, themeIcon, appData, privacy
  • Вложенный enum AppErrorKind:
    • setIcon, createBackup, restoreBackup, deleteAllData

2. AnalyticsProvider (легкий протокол)

  • Протокол с 1 методом: log(event: AnalyticsEvent).
  • Реализации:
    • FirebaseAnalyticsProvider (основной)
    • NoopAnalyticsProvider (для тестов/превью)

3. AnalyticsService (единая точка входа)

  • Сервис вызывает один или несколько провайдеров.
  • Публичный API: log(_ event: AnalyticsEvent).
  • Без сложной магии и без преждевременной оптимизации.

4. DI через Environment

  • В SwiftUI_DaysApp инжектить AnalyticsService через .environment(...).
  • Во View использовать @Environment(AnalyticsService.self).
  • Во view model передавать AnalyticsService явно через инициализатор (constructor injection) и хранить ссылку на сервис.

5. Общий View-модификатор для трекинга

  • Добавить единый модификатор вида 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.iconSelectediconSelected(iconName: String), обновлён IconViewModel.setIcon() и FirebaseAnalyticsProvider.

События действий пользователя

  • Логировать userAction(.delete) при нажатии кнопки удаления (в MainScreen+ListView).
  • Логировать userAction(.sort) при изменении сортировки списка (в MainScreen, onChange у picker).

Ошибки из try/catch

  • Логировать appError в catch минимум в:
    • ThemeIconScreen+IconViewModel
    • AppDataScreen
  • Для каждого события ошибки передавать:
    • operation (например, set_icon, restore_backup)
    • domain
    • code

Тесты

  • Добавить тесты для 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 события логируются.
  • Тесты аналитики написаны.