Screen View — событие мобильной аналитики, фиксирующее открытие каждого экрана в приложении. Это аналог page_view для веба, адаптированный под навигационную модель мобильных интерфейсов. По данным Amplitude, 2024, Screen View — самое частое событие в аналитике приложений, составляя до 40% всех отправляемых событий. Правильная реализация screen tracking — основа для анализа пользовательских путей и воронок.
Главное
Screen View — событие аналитики, которое отправляется при открытии экрана мобильного приложения. Событие содержит имя экрана (screen_name), класс (screen_class) и временную метку. В отличие от веб-аналитики, где page_view привязан к URL, в мобильных приложениях экраны идентифицируются по названию Activity, Fragment, ViewController или Custom View.
| Параметр | Тип | Пример |
|---|---|---|
| screen_name | String | "Product Details" |
| screen_class | String | "ProductDetailActivity" |
| previous_screen | String | "CatalogScreen" |
| timestamp | Long | 1719876543000 |
| duration_sec | Int | 45 |
Параметр previous_screen особенно важен: он позволяет восстанавливать последовательность переходов и строить Screen Flow — карту путей пользователя по приложению.
Screen View и Page View решают одну задачу — фиксацию просмотра — но в разных средах. В вебе URL однозначно идентифицирует страницу, и Page View привязан к загрузке документа. В мобильных приложениях экран — это состояние UI, не обязательно соответствующее отдельному адресу.
Ещё одно отличие — глубина контекста. Screen View в мобильном приложении включает параметры состояния: авторизован ли пользователь, какие данные загружены, открыт ли экран в режиме редактирования. Page View в вебе редко несёт такой контекст — он фиксирует только факт загрузки URL. Это делает Screen View более информативным для продуктовой аналитики, так как каждое событие можно сегментировать по состоянию.
Первая ошибка — отправка screen_view при каждом изменении состояния внутри экрана (переключение табов, открытие попапа). Screen View должен фиксировать только полноценный переход на новый экран, а не микровзаимодействия.
Вторая ошибка — использование технического имени класса вместо читаемого названия. "ProductDetailActivityKt" бесполезно для аналитика — используйте "Product Details" в screen_name.
Третья ошибка — отправка screen_view без соответствующих полей. Пустой screen_name создаёт набор мусорных записей, которые невозможно сгруппировать. Всегда передавайте хотя бы screen_name и screen_class, даже на тестовых экранах.
Реализация Screen View tracking зависит от архитектуры навигации. Рассмотрим автоматический и ручной подходы на примере Jetpack Compose и SwiftUI.
Используйте LifecycleEventObserver на уровне NavigationComponent. Каждый раз, когда пользователь переходит на новый роут, срабатывает событие screen_view.
class ScreenTrackingObserver(
private val analytics: AnalyticsProvider
) : LifecycleEventObserver {
override fun onStateChanged(
source: LifecycleOwner,
event: Lifecycle.Event
) {
if (event == Lifecycle.Event.ON_RESUME) {
val route = source.getRouteFromLifecycleOwner()
analytics.logScreenView(
screenName = route.screenName,
screenClass = source.getLocalClassName()
)
}
}
}
// Подключение в NavHost
fun NavBackStackEntry.trackScreenView(analytics: AnalyticsProvider) {
lifecycle.addObserver(ScreenTrackingObserver(analytics))
}
Подход гарантирует, что screen_view отправляется при каждом возвращении экрана на передний план, включая возврат из фона. Lifecycle.Event.ON_RESUME — правильный момент для трекинга, не ON_START и не ON_CREATE.
На SwiftUI используется модификатор onAppear, встроенный в каждый View. Для автоматизации создаётся ViewModifier.
struct ScreenTrackingModifier: ViewModifier {
let screenName: String
func body(content: Content) -> some View {
content.onAppear {
Analytics.shared().logScreenView(
name: screenName,
className: "\(Self.self)"
)
}
}
}
extension View {
func trackScreen(_ name: String) -> some View {
modifier(ScreenTrackingModifier(screenName: name))
}
}
// Использование:
ProductDetailView()
.trackScreen("Product Details")
Модификатор trackScreen добавляется к любому View одной строкой. Это чистое и масштабируемое решение для SwiftUI-проектов.
В проектах с модульной архитектурой каждый модуль может использовать свой нейминг экранов, что приводит к дублированию screen_name. Централизованный enum ScreenName решает проблему — все экраны именуются по единому стандарту в одном месте. Добавление нового экрана требует только новой константы в enum, а не поиска по всему коду.
Используйте sealed class для описания screen_name с группировкой по фичам: ProfileScreen.CHANGE_PASSWORD, OrdersScreen.ORDER_HISTORY, CatalogScreen.SEARCH_RESULTS. Это упрощает фильтрацию в отчётах аналитики.
Screen Flow (или Path Analysis) — визуализация последовательности экранов, которую проходит пользователь. Это основной инструмент для выявления узких мест в навигации.
Каждый Screen View с параметром previous_screen даёт ребро графа: CatalogScreen → ProductDetails → CartScreen. Агрегируя все переходы, строится карта путей. Трёхшаговая воронка на основе Screen Flow показывает, где пользователи отваливаются.
По данным Mixpanel (2024), анализ Screen Flow выявляет до 40% проблем с UX, которые не видны при анализе отдельных событий. Например, частый переход ProductDetails → HomeScreen без покупки указывает на проблему с ценой или описанием товара.
Drop-off — точка, в которой пользователь покидает сценарий. Если после Loading экрана 60% пользователей уходят, проблема в скорости загрузки или анимации. Если после Paywall — в стоимости или ценности подписки.
Firebase не предоставляет готового Screen Flow отчёта, но данные screen_view доступны в BigQuery. Постройте запрос, который группирует переходы по паре (previous_screen, screen_name) и считает частоту. Результат — матрица переходов, которую можно визуализировать в Looker Studio как Sankey-диаграмму.
Дополните Screen Flow сегментацией: отдельно для новых пользователей (первые 7 дней) и для вернувшихся. Новые пользователи чаще застревают на онбординг-экранах, опытные — быстрее доходят до целевых действий. Сравнение двух потоков выявляет узкие места адаптации.
Выбор инструмента для Screen View зависит от бюджета, стека и требуемой детализации. Рассмотрим три популярных решения.
Firebase автоматически отслеживает экраны через параметр screen_view в каждом событии. Не требует дополнительного кода после интеграции SDK. Ограничение: screen_name генерируется из Activity/ViewController, что не всегда даёт читаемые имена.
Amplitude предлагает встроенный Pathfinder — визуальный построитель Screen Flow. Поддерживает user property и сегментацию по когортам. Позволяет переименовывать экраны на стороне сервера без изменений в коде приложения.
Mixpanel предоставляет Flows-отчёт в реальном времени. Умеет показывать не только линейные переходы, но и ветвления — какие экраны посещаются после конкретного. Интегрируется с iOS, Android, Flutter и React Native SDK.
Каждое событие screen_view — это сетевая отправка данных. Если приложение шлёт screen_view на каждом переключении вкладки (20+ за минуту), это создаёт лишнюю нагрузку. Оптимизация: буферизируйте screen_view и отправляйте батчем раз в 5 секунд. Firebase автоматически агрегирует события, но кастомные SDK могут отправлять каждый вызов немедленно.
Измеряйте overhead трекинга: добавьте метку времени в каждый screen_view и считайте задержку от onResume до отправки. Если задержка превышает 100 мс, трекинг влияет на UX. Используйте фоновый поток для отправки, чтобы не блокировать UI-поток. На устройствах низкого сегмента разница заметна.
Часто задаваемые вопросы
Да, каждый фрагмент с собственным контентом — отдельный экран. TabLayout с тремя вкладками должен отправлять три разных screen_view при переключении. Исключение: вкладки-попапы без самостоятельной навигации.
screen_class — техническое имя класса (например, "MainActivity"), используется разработчиками. screen_name — читаемое название ("Главный экран"), используется в отчётах. SDK часто заполняет screen_class автоматически, screen_name нужно задавать вручную.
При повороте устройство пересоздаёт Activity, что вызывает повторный screen_view. Используйте state-проверку: отправляйте событие только при изменении экрана, а не при каждом ON_RESUME. Firebase и Amplitude автоматически дедуплицируют screen_view.
Для среднего приложения — 10–30 screen_view на пользователя в день. Новостные приложения: 15–20. Игры: 20–40. Утилиты: 5–10. Если число превышает 100, проверьте отправку экранов на каждый tap, а не на полноценный переход.
Да, screen_view — один из индикаторов в A/B-тестах. Сравнивайте число просмотров экрана между вариантами A и B. Если на варианте B экран "Checkout" получает на 15% меньше screen_view, это сигнал проблемы в карточке товара.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также