TapCub is live — analytics, insights and live chat, free on one platform
Help center

How do I track screen views in my app?

See which screens are tracked automatically on Android, iOS, HarmonyOS, React Native, Flutter and mini programs, add the rest with trackScreen, name screens well, and read the Screens report.

App analytics3 min readLast updated Nov 6, 2026TapCub team

Short 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

PlatformAutomaticYou add
AndroidActivities, on onResumeTapCub.trackScreen("Home") for Fragments, Compose and dialogs
iOSUIKit view controllers, on viewDidAppear (containers and system classes skipped).wcScreen("Checkout") or TapCub.trackScreen("Checkout") for SwiftUI
HarmonyOSrouter pages and Navigation destinationstrackScreen for anything else
React NativeNo<NavigationContainer onStateChange={TapCub.navigationHook} />, or trackScreen without React Navigation
FlutterNoMaterialApp(navigatorObservers: [TapCub.navigatorObserver]); routes need settings.name
Mini programsPage 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 Checkout or ProductDetail, not ProductDetailViewController2.
  • Do not put IDs in names. Product/123 creates 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_leave event. 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
  1. UpdateContent updated
  2. First published

Did this answer your question?

We use your answers to fix and expand this page.

See your data clearly. Find your growth.

Every click, backed by data. Install one line of code and see your first numbers in a minute.

No credit card · Free plans for analytics and chat · Cookieless analytics