Screen View — 移动分析事件,记录应用中每个屏幕的打开。这是page_view在网络端的对应物,针对移动界面导航模型进行了调整。根据Amplitude,2024的数据,Screen View是应用分析中最常见的事件,占所有发送事件的40%。正确的屏幕跟踪实现是分析用户路径和漏斗的基础。
要点
Screen View — 在打开移动应用屏幕时发送的分析事件。该事件包含屏幕名称(screen_name)、类(screen_class)和时间戳。与page_view绑定URL的Web分析不同,在移动应用中,屏幕根据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解决相同的任务 — 记录查看 — 但在不同的环境中。在Web上,URL唯一标识页面,Page View与文档加载绑定。在移动应用中,屏幕是UI状态,不一定对应单独的地址。
另一个区别 — 上下文深度。移动应用中的Screen View包含状态参数:用户是否登录、加载了哪些数据、屏幕是否以编辑模式打开。Web上的Page View很少携带这样的上下文 — 它只记录URL加载的事实。这使得Screen View对产品分析更具信息性,因为每个事件都可以按状态进行细分。
第一个错误 — 在屏幕内的每次状态变化时(切换标签、打开弹出窗口)发送screen_view。Screen View应仅记录到新屏幕的完全过渡,而不是微交互。
第二个错误 — 使用技术类名称代替可读名称。"ProductDetailActivityKt"对分析人员毫无用处 — 请在screen_name中使用"Product Details"。
第三个错误 — 在没有相应字段的情况下发送screen_view。空的screen_name会创建一组无法分组的垃圾记录。始终至少发送screen_name和screen_class,即使在测试屏幕上也是如此。
实现Screen View跟踪取决于导航架构。让我们以Jetpack Compose和SwiftUI为例,了解自动和手动方法。
在NavigationComponent级别使用LifecycleEventObserver。每当用户导航到新路由时,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中,使用内置于每个View中的onAppear修饰符。为了实现自动化,创建了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重复。集中式枚举ScreenName解决了这个问题 — 所有屏幕在一个地方按照统一标准命名。添加新屏幕只需要在枚举中添加新常量,而无需搜索整个代码库。
使用sealed class按功能分组描述screen_name:ProfileScreen.CHANGE_PASSWORD、OrdersScreen.ORDER_HISTORY、CatalogScreen.SEARCH_RESULTS。这简化了分析报告中的过滤。
Screen Flow(或Path Analysis) — 用户经过的屏幕序列的可视化。这是识别导航瓶颈的主要工具。
每个带有previous_screen参数的Screen View创建一个图边:CatalogScreen → ProductDetails → CartScreen。通过聚合所有过渡,构建路径图。基于Screen Flow的三步漏斗显示用户在何处流失。
根据Mixpanel(2024)的数据,Screen Flow分析揭示了多达40%的UX问题,这些问题在分析单个事件时不可见。例如,频繁的ProductDetails → HomeScreen过渡而未购买表明产品价格或描述存在问题。
Drop-off — 用户离开场景的点。如果加载屏幕后有60%的用户离开,问题在于加载速度或动画。如果在Paywall之后 — 在于订阅价格或价值。
Firebase不提供现成的Screen Flow报告,但screen_view数据在BigQuery中可用。创建一个查询,按(previous_screen,screen_name)对过渡进行分组并计算频率。结果是一个过渡矩阵,可以在Looker Studio中可视化为桑基图。
用细分补充Screen Flow:分别针对新用户(前7天)和回访用户。新用户更常在引导屏幕上卡住,有经验的用户更快到达目标操作。比较两个流揭示了适应瓶颈。
选择工具取决于预算、技术栈和所需的详细程度。让我们来看三种流行的解决方案。
Firebase通过每个事件中的screen_view参数自动跟踪屏幕。集成SDK后无需额外代码。限制:screen_name从Activity/ViewController生成,并不总是提供可读的名称。
Amplitude提供内置的Pathfinder — 可视化Screen Flow构建器。支持user property和按群组细分。允许在服务器端重命名屏幕,而无需更改应用程序代码。
Mixpanel提供实时Flows报告。不仅能够显示线性过渡,还能显示分支 — 在特定屏幕之后访问了哪些屏幕。与iOS、Android、Flutter和React Native SDK集成。
每个screen_view事件都是网络数据发送。如果应用在每次切换标签时(每分钟20+次)发送screen_view,就会产生额外负载。优化:缓冲screen_view并每5秒批量发送一次。Firebase自动聚合事件,但自定义SDK可能立即发送每次调用。
衡量跟踪的开销:在每个screen_view中添加时间戳,并计算从onResume到发送的延迟。如果延迟超过100毫秒,跟踪会影响用户体验。使用后台线程进行发送,以免阻塞UI线程。在低端设备上,差异很明显。
常见问题
是的,每个具有自身内容的片段(fragment)都是单独的屏幕。具有三个标签的TabLayout在切换时应发送三个不同的screen_view。例外:没有独立导航的弹出式标签。
screen_class — 类的技术名称(例如"MainActivity"),由开发人员使用。screen_name — 可读名称("主屏幕"),用于报告中。SDK通常自动填写screen_class,screen_name需要手动设置。
在旋转时,设备会重新创建Activity,导致重复的screen_view。使用状态检查:仅在屏幕更改时发送事件,而不是每次ON_RESUME时。Firebase和Amplitude自动去重screen_view。
对于普通应用 — 每个用户每天10–30个screen_view。新闻应用:15–20。游戏:20–40。工具:5–10。如果数量超过100,请检查是否在每次点击时发送屏幕,而不是在完全过渡时。
是的,screen_view是A/B测试中的指标之一。比较A和B变体之间的屏幕查看次数。如果变体B的"Checkout"屏幕收到的screen_view少15%,这是产品卡出现问题的信号。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。