Screen View هو حدث تحليلات محمولة يسجل فتح كل شاشة في التطبيق. وهو المكافئ لـ page_view على الويب، مُكيَّف مع نموذج التنقل للواجهات المحمولة. وفقًا لـ Amplitude، 2024، Screen View هو الحدث الأكثر تكرارًا في تحليلات التطبيقات، حيث يشكل ما يصل إلى 40% من جميع الأحداث المرسلة. التنفيذ الصحيح لتتبع الشاشات هو الأساس لتحليل مسارات المستخدم والمسارات التحويلية.
الخلاصة
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 بتحميل المستند. في التطبيقات المحمولة، الشاشة هي حالة واجهة لا تتوافق بالضرورة مع عنوان منفصل.
فرق آخر هو عمق السياق. 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. في كل مرة ينتقل المستخدم إلى مسار جديد، يتم تشغيل حدث 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% من مشاكل تجربة المستخدم التي لا تظهر عند تحليل الأحداث الفردية. على سبيل المثال، التنقل المتكرر ProductDetails ← HomeScreen بدون شراء يشير إلى مشكلة في السعر أو وصف المنتج.
Drop-off هو النقطة التي يغادر عندها المستخدم سيناريو. إذا غادر 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 بصري. يدعم خصائص المستخدم والتقسيم حسب المجموعات. يسمح بإعادة تسمية الشاشات من جانب الخادم دون تغييرات في كود التطبيق.
Mixpanel يوفر تقرير Flows في الوقت الفعلي. يمكنه إظهار ليس فقط التنقلات الخطية ولكن أيضًا التفرعات — أي الشاشات تُزار بعد شاشة محددة. يتكامل مع SDKs لأنظمة iOS وAndroid وFlutter وReact Native.
كل حدث screen_view هو إرسال بيانات عبر الشبكة. إذا كان التطبيق يُرسل screen_view عند كل تبديل تبويب (20+ في الدقيقة)، فإنه يُنشئ حملاً غير ضروري. التحسين: خزِّن screen_view مؤقتًا وأرسله على دفعات كل 5 ثوانٍ. Firebase يجمع الأحداث تلقائيًا، لكن SDKs المخصصة قد تُرسل كل استدعاء فورًا.
قم بقياس العبء الإضافي للتتبع: أضف طابعًا زمنيًا إلى كل screen_view واحسب التأخير من onResume إلى الإرسال. إذا تجاوز التأخير 100 مللي ثانية، فإن التتبع يؤثر على تجربة المستخدم. استخدم خيطًا خلفيًا للإرسال لتجنب حظر خيط الواجهة. على الأجهزة منخفضة المستوى، الفرق ملحوظ.
الأسئلة الشائعة
نعم، كل جزء له محتواه الخاص هو شاشة منفصلة. TabLayout بثلاث علامات تبويب يجب أن يُرسل ثلاثة أحداث screen_view مختلفة عند التبديل. الاستثناء: النوافذ المنبثقة للتبويبات بدون تنقل مستقل.
screen_class هو الاسم التقني للصنف (على سبيل المثال، «MainActivity»)، يستخدمه المطورون. screen_name هو اسم قابل للقراءة («الشاشة الرئيسية»)، يُستخدم في التقارير. غالبًا ما تملأ SDKs 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 تتلقى 15% أقل من أحداث screen_view، فهذه إشارة إلى مشكلة في بطاقة المنتج.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا