More in App analytics
- What is the crash-free rate and where do I see it?
- How do I track app versions?
- How do I install the Android SDK?
- How do I install the iOS SDK?
- How do I add TapCub to a Flutter app?
- How do I add TapCub to a React Native app?
- How do I add TapCub to a HarmonyOS app?
- How do I check daily, weekly and monthly active users of my app?
- All guides in this category
Still have a question?
Could not find it? A person reads every message, usually within a few hours on business days.
Chat with usShort answer
Screen views are recorded as $screen_view events and reported in App analytics › Behavior › Screens & paths. On Android, Activities are tracked automatically; on iOS, UIKit view controllers are tracked automatically. Fragments, Jetpack Compose, dialogs and SwiftUI views need one line: TapCub.trackScreen("Name") (or the .wcScreen("Name") modifier in SwiftUI). React Native and Flutter send screens from the navigation hook or observer.
A screen view is the app equivalent of a pageview: it tells you which screens people open, in what order and how long they stay.
How each platform tracks screens
| Platform | Automatic | You add |
|---|---|---|
| Android | Activities, on onResume | TapCub.trackScreen("Home") for Fragments, Compose and dialogs |
| iOS | UIKit view controllers, on viewDidAppear (containers and system classes skipped) | .wcScreen("Checkout") or TapCub.trackScreen("Checkout") for SwiftUI |
| HarmonyOS | router pages and Navigation destinations | trackScreen for anything else |
| React Native | No | <NavigationContainer onStateChange={TapCub.navigationHook} />, or trackScreen without React Navigation |
| Flutter | No | MaterialApp(navigatorObservers: [TapCub.navigatorObserver]); routes need settings.name |
| Mini programs | Page show and hide ($mp_view_screen) | trackScreen for custom views |
On React Native and Flutter, the same screen name twice in a row is sent only once.
Name screens well
Screen names become the rows of your reports, so choose them deliberately:
- Android: annotate an Activity with
@TapCubScreen("Order"); otherwise the class name is used. - iOS: UIKit names default to the class name; change them through
TapCubScreenNaming. - Use stable, human-readable names such as
CheckoutorProductDetail, notProductDetailViewController2. - Do not put IDs in names.
Product/123creates one row per product; send the ID as a property instead. - Skip screens that add noise, such as splash screens:
TapCub.ignoreScreen(SplashActivity::class.java)on Android,TapCub.ignoreScreen(SplashVC.self)on iOS,TapCub.ignoreScreen('Splash')on HarmonyOS.
To pass extra context, add properties: on Android TapCub.trackScreen("Product", mapOf("product_id" to "sku_42")).
Read the Screens report
App analytics › Behavior › Screens & paths groups views by $screen_name in a Screen column. Each row has:
- Views: number of screen view events.
- Share: views as a share of all views under the current filter.
- People: distinct users or devices, depending on the project's counting mode.
- Average time: taken from the duration on the
$screen_leaveevent. Without a leave event the cell is empty, which is not the same as zero seconds.
The paths part shows neighboring screens within one session, keeping only the heavier flows. For full step-by-step analysis from a start or end screen, use the paths model in behavior analysis: see Analyze user paths. Mini programs show the same report as Pages under Mini program analytics › Pages & events.
FAQ
Why is the Screens table empty? The app sends no $screen_view: screens are in Fragments, Compose or SwiftUI without trackScreen, automatic screen tracking is turned off (autoTrackScreens = false), or on React Native and Flutter the navigation hook or observer is missing.
Why does Flutter send no screens? The route has no settings.name. Unnamed routes are skipped.
Is there a click heatmap for apps? No. Apps and mini programs have no web-style click heatmap; taps are recorded as $app_click events on Android and iOS.
Related
Update history1
- UpdateContent updated
- First published
Did this answer your question?
We use your answers to fix and expand this page.
Couldn’t send. Please try again in a minute.
Thanks for the feedback. We’ll use it to improve this page.You’ve already sent feedback on this page. Thanks.