Screen View คือเหตุการณ์การวิเคราะห์มือถือที่บันทึกการเปิดแต่ละหน้าจอในแอปพลิเคชัน เป็นสิ่งที่เทียบเท่ากับ page_view สำหรับเว็บ ซึ่งปรับให้เข้ากับรูปแบบการนำทางของอินเทอร์เฟซมือถือ ตามข้อมูลของ Amplitude, 2024 Screen View เป็นเหตุการณ์ที่พบบ่อยที่สุดในการวิเคราะห์แอป โดยคิดเป็นสัดส่วนมากถึง 40% ของเหตุการณ์ทั้งหมดที่ส่ง การดำเนินการติดตามหน้าจออย่างถูกต้องเป็นพื้นฐานสำหรับการวิเคราะห์เส้นทางของผู้ใช้และฟunnel
ประเด็นสำคัญ
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 ขึ้นอยู่กับสถาปัตยกรรมการนำทาง มาดูวิธีการแบบอัตโนมัติและแบบด้วยตนเองโดยใช้ Jetpack Compose และ SwiftUI เป็นตัวอย่าง
ใช้ LifecycleEventObserver ที่ระดับ NavigationComponent ทุกครั้งที่ผู้ใช้ไปยัง route ใหม่ เหตุการณ์ 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 (หรือการวิเคราะห์เส้นทาง) คือการแสดงภาพลำดับของหน้าจอที่ผู้ใช้ผ่าน เป็นเครื่องมือหลักในการระบุคอขวดในการนำทาง
Screen View แต่ละรายการที่มีพารามิเตอร์ previous_screen ให้ขอบของกราฟ: CatalogScreen → ProductDetails → CartScreen โดยการรวมการเปลี่ยนทั้งหมด จะสร้างแผนที่เส้นทาง ฟunnel สามขั้นตอน ที่อิงตาม Screen Flow แสดงว่าผู้ใช้ออกจากที่ใด
ตามข้อมูลของ Mixpanel (2024) การวิเคราะห์ Screen Flow เผยให้เห็นปัญหา UX มากถึง 40% ที่ไม่สามารถมองเห็นได้เมื่อวิเคราะห์เหตุการณ์แต่ละรายการ ตัวอย่างเช่น การเปลี่ยน ProductDetails → HomeScreen บ่อยครั้งโดยไม่มีการซื้อบ่งชี้ปัญหากับราคาหรือคำอธิบายสินค้า
Drop-off คือจุดที่ผู้ใช้ออกจากสถานการณ์ หาก 60% ของผู้ใช้ออกจากหลังหน้าจอโหลด ปัญหาอยู่ที่ความเร็วในการโหลดหรือแอนิเมชัน หากหลังจาก Paywall — อยู่ในต้นทุนหรือมูลค่าของการสมัครรับข้อมูล
Firebase ไม่มีรายงาน Screen Flow สำเร็จรูป แต่ข้อมูล screen_view พร้อมใช้งานใน BigQuery สร้างคำค้นหาที่จัดกลุ่มการเปลี่ยนตามคู่ (previous_screen, screen_name) และนับความถี่ ผลลัพธ์คือเมทริกซ์การเปลี่ยนที่สามารถแสดงเป็นภาพใน Looker Studio เป็นแผนภาพ Sankey
เสริม Screen Flow ด้วยการแบ่งกลุ่ม: แยกสำหรับผู้ใช้ใหม่ (7 วันแรก) และผู้ใช้ที่กลับมา ผู้ใช้ใหม่มักติดอยู่บนหน้าจอ onboarding ในขณะที่ผู้ใช้ที่มีประสบการณ์ไปถึงการกระทำเป้าหมายได้เร็วกว่า การเปรียบเทียบสองโฟลว์เผยให้เห็นคอขวดในการปรับตัว
การเลือกเครื่องมือ สำหรับการวิเคราะห์ Screen View ขึ้นอยู่กับงบประมาณ สแต็ก และระดับรายละเอียดที่ต้องการ มาดูสามโซลูชันยอดนิยม
Firebase ติดตามหน้าจอโดยอัตโนมัติผ่านพารามิเตอร์ screen_view ในทุกเหตุการณ์ ไม่ต้องใช้โค้ดเพิ่มเติมหลังจากการรวม SDK ข้อจำกัด: screen_name ถูกสร้างจาก Activity/ViewController ซึ่งไม่ได้ให้ชื่อที่อ่านได้เสมอไป
Amplitude มี Pathfinder ในตัว — ตัวสร้าง Screen Flow แบบภาพ รองรับคุณสมบัติผู้ใช้และการแบ่งกลุ่มตามกลุ่ม อนุญาตให้เปลี่ยนชื่อหน้าจอฝั่งเซิร์ฟเวอร์โดยไม่ต้องเปลี่ยนแปลงโค้ดแอปพลิเคชัน
Mixpanel ให้รายงาน Flows แบบเรียลไทม์ สามารถแสดงไม่เพียงแต่การเปลี่ยนเชิงเส้น แต่ยังรวมถึงการแตกแขนง — หน้าจอใดที่เข้าชมหลังจากหน้าจอเฉพาะ ผสานรวมกับ iOS, Android, Flutter และ React Native SDK
แต่ละเหตุการณ์ screen_view คือการส่งข้อมูลผ่านเครือข่าย หากแอปส่ง screen_view ทุกครั้งที่เปลี่ยนแท็บ (20+ ต่อนาที) จะสร้างภาระที่ไม่จำเป็น การเพิ่มประสิทธิภาพ: บัฟเฟอร์ screen_view และส่งเป็นชุดทุก 5 วินาที Firebase รวบรวมเหตุการณ์โดยอัตโนมัติ แต่ SDK ที่กำหนดเองอาจส่งแต่ละการเรียกทันที
วัด ค่าใช้จ่ายเพิ่มเติม ของการติดตาม: เพิ่มการประทับเวลาในแต่ละ screen_view และคำนวณความล่าช้าจาก onResume ถึงการส่ง หากความล่าช้าเกิน 100 มิลลิวินาที การติดตามจะส่งผลต่อ UX ใช้เธรดพื้นหลังสำหรับการส่งเพื่อไม่ให้บล็อกเธรด 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 หากหน้าจอ “Checkout” ของตัวแปร B ได้รับเหตุการณ์ screen_view น้อยกว่า 15% นั่นเป็นสัญญาณของปัญหาในการ์ดสินค้า
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม