AdMob+Firebase 101 Android: الإعداد أساسيات "إحصاءات Google"

1. مقدمة

تشكّل الإعلانات جزءًا مهمًا من تجربة المستخدم الشاملة في تطبيقك. يمكن أن تساعد عمليات تنفيذ الإعلانات بشكل جيد في تحسين تجربة التطبيق بشكل عام، بل وتحسين معدّل الاحتفاظ بالمستخدمين وتفاعلهم. على سبيل المثال، تتيح لك الإعلانات مقابل مكافأة تزويد المستخدمين بعملة أو عناصر داخل التطبيق مقابل مشاهدة إعلانات الفيديو، ما يتيح لهم تحقيق إنجازات جديدة كان من الممكن أن يتعذّر عليهم تحقيقها ويؤدي إلى توقّفهم عن استخدام التطبيق.

ومع ذلك، ليس من السهل تقديم تجربة إعلانات ممتازة. قد تطرح أسئلة مثل: ما هو معدّل عرض هذه الإعلانات؟ أين ومتى يجب عرضها؟ ما هي الجائزة؟ للأسف، يختلف الجواب من تطبيق إلى آخر ومن موضع إعلان إلى آخر. ما مِن إجابة موحّدة لهذا السؤال.

باستخدام "إحصاءات Google لبرنامج Firebase" وAdMob والعديد من الأدوات الفعّالة الأخرى التي يوفّرها Firebase والتي تتسم بسهولة الاستخدام، أصبح من الأسهل بكثير تحسين تطبيقك بطريقة مستندة إلى البيانات. سنوضّح لك اليوم كيفية البدء.

ما ستنشئه

هذا الدرس التطبيقي حول الترميز هو الأول من ثلاثة دروس تطبيقية حول الترميز ستساعدك في إنشاء تطبيق باسم اختبار الرسم الرائع، وهي لعبة تتيح للاعبين تخمين اسم الرسم. ستوضّح لك هذه العيّنة كيف يمكنك دمج "الإعلانات مقابل مكافآت" وخدمات Firebase في لعبتك.

في هذا الدرس العملي، ستدمج "إحصاءات Google لبرنامج Firebase" لتسجيل بعض أحداث التطبيق المهمة. ستتعرّف أيضًا على كيفية قراءة إحصاءات التطبيقات المعروضة في "وحدة تحكّم Firebase".

إذا واجهت أي مشاكل (مثل أخطاء في الرمز أو أخطاء نحوية أو صياغة غير واضحة أو غير ذلك) أثناء العمل على هذا الدرس العملي، يُرجى الإبلاغ عن المشكلة من خلال الرابط الإبلاغ عن خطأ في أسفل يمين الدرس العملي.

ما ستتعلمه

  • كيفية إعداد "إحصاءات Google لـ Firebase" في تطبيقك
  • كيفية تسجيل أحداث التطبيق
  • كيفية قراءة إحصاءات التطبيق المعروضة في وحدة تحكّم Firebase

المتطلبات

  • الإصدار 4.1 أو الإصدارات الأحدث من استوديو Android
  • حساب Google
  • جهاز اختبار يعمل بالإصدار 5.0 من نظام التشغيل Android أو إصدار أحدث مع كابل USB لتوصيل جهازك، أو Android Emulator الذي يشغّل الجهاز الافتراضي المتوافق مع Android (AVD) مع صورة نظام تتوافق مع متجر Play/Google APIs

ما هو تقييمك لمستوى خبرتك في AdMob؟

مبتدئ متوسط متمكّن

ما هو تقييمك لمستوى خبرتك في Firebase؟

مبتدئ متوسط متقدّم

2. إعداد بيئة التطوير

تنزيل الرمز

انقر على الزر التالي لتنزيل كل الرموز البرمجية لهذا الدرس التطبيقي حول الترميز:

فكّ ضغط ملف ZIP الذي تم تنزيله. سيؤدي ذلك إلى فك ضغط مجلد رئيسي باسم admob-firebase-codelabs-android.

...أو استنسِخ مستودع GitHub من سطر الأوامر.

$ git clone https://github.com/googlecodelabs/admob-firebase-codelabs-android

يحتوي المستودع على أربعة مجلدات على النحو التالي:

  • android_studio_folder.png101-base: الرمز الأولي الذي ستنشئه في هذا الدرس التطبيقي حول الترميز
  • android_studio_folder.png101-complete_and_102-base: الرمز البرمجي المكتمل لهذا الدرس التطبيقي حول الترميز والرمز البرمجي الأساسي للدرس التطبيقي حول الترميز رقم 102
  • android_studio_folder.png102-complete: الرمز المكتمل للدرس التطبيقي حول الترميز رقم 102

استيراد التطبيق النموذجي

شغِّل "استوديو Android" واختَر "استيراد مشروع" (Import project) على شاشة الترحيب. بعد ذلك، اختَر دليل 101-base من الرمز الذي نزّلته.

من المفترض أن يكون المشروع مفتوحًا الآن في "استوديو Android".

3- إعداد وحدة لإعلانات الفيديو مقابل مكافأة (اختياري)

يتضمّن التطبيق الأوّلي وحدة إعلانات فيديو مقابل مكافأة مخصّصة لتوفير الراحة لك. يمكنك تخطّي هذه الخطوة تمامًا إذا كنت لا تريد إنشاء حساب جديد ضمن حسابك على AdMob.

لإنشاء تطبيق يستخدم AdMob جديد في حسابك، يُرجى اتّباع التعليمات التالية:

  1. انتقِل إلى وحدة تحكّم AdMob.
  2. من قائمة التطبيقات، انقر على إضافة تطبيق.
  3. عندما يُطلب منك الإجابة عن السؤال "هل نشرت تطبيقك على Google Play أو App Store؟"، اختَر "لا".
  4. أطلِق على التطبيق اسم "اختبار الرسم الرائع"، واختَر "Android" كنظام أساسي، ثم انقر على "إضافة".

بعد إنشاء تطبيق يستخدم AdMob في حسابك، اتّبِع الخطوات الموضّحة أدناه لإنشاء وحدة لإعلانات الفيديو مقابل مكافأة جديدة.

  1. انقر على قائمة التطبيقات في الواجهة الأمامية لـ AdMob، ثمّ اختَر "Awesome Drawing Quiz" من قائمة التطبيقات.
  2. انقر على إضافة وحدة إعلانية لإنشاء وحدة لإعلانات الفيديو مقابل مكافأة جديدة.
  3. اختَر مقابل مكافأة لشكل الإعلان.

7672f41ec611101b.png

  1. أدخِل اسم الوحدة الإعلانية الذي تفضّله. بعد ذلك، اضبط مقدار المكافأة على 1 وعنصر المكافأة على "تلميح" (هذه هي المكافأة التي يقدّمها التطبيق حاليًا للمستخدمين). انقر على إنشاء وحدة إعلانية لإنشاء وحدة لإعلانات الفيديو مقابل مكافأة جديدة.

6d067814a2c38264.png

  1. عند إنشائه بنجاح، ستظهر لك تعليمات مشابهة لما يلي: ff872a005a07b75e.png
  2. ارجع إلى مشروع Android، وعدِّل ثوابت رقم تعريف تطبيق يستخدم AdMob ورقم تعريف الوحدة الإعلانية إلى الأرقام التي أنشأتها في الخطوة السابقة.

strings.xml

<!-- Update the value with your AdMob app id -->
<string name="admob_app_id">YOUR_ADMOB_APP_ID</string>

GameActivity.kt

// Update the value with your Rewarded Video ad unit id
private const val AD_UNIT_ID = "<YOUR_AD_UNIT_ID>";

4. إعداد مشروع Firebase

إنشاء مشروع جديد من "وحدة تحكّم Firebase"

  1. انتقِل إلى وحدة تحكّم Firebase.
  2. انقر على إضافة مشروع، وأطلِق على مشروعك اسم "اختبار الرسم الرائع". تأكَّد من تفعيل زر الاختيار تفعيل "إحصاءات Google" لهذا المشروع.
  3. اختَر حساب "إحصاءات Google" الذي تخطّط لاستخدامه. بالنسبة إلى معظم المستخدمين، يكفي اختيار الخيار الحساب التلقائي لمشروع Firebase، ولكن إذا كان لديك حساب آخر على "إحصاءات Google" تريد استخدامه، اختَره هنا.
  4. انقر على إنشاء مشروع.

إضافة تطبيق Android

  1. من شاشة النظرة العامة لمشروعك الجديد، انقر على إضافة Firebase إلى تطبيق Android.
  2. أدخِل اسم حزمة التطبيق التدريبي: com.codelab.awesomedrawingquiz
  3. عيِّن اسمًا مستعارًا لتطبيقك: اختبار الرسم الرائع
  4. اترك حقل SHA-1 فارغًا لأنّ SHA-1 غير مطلوب لهذا المشروع.
  5. انقر على تسجيل التطبيق لتسجيل تطبيقك.

إضافة ملف google-services.json إلى تطبيقك

بعد ذلك، ستظهر لك شاشة يمكنك من خلالها تنزيل ملف إعداد يحتوي على جميع البيانات الوصفية اللازمة في Firebase لتطبيقك. انقر على تنزيل ملف google-service.json وانسخ الملف إلى الدليل android_studio_folder.pngapp في مشروعك.

32419a0fa25a1405.png

تحديد إصدارات التبعيات

لنبدأ بإضافة إصدار كل تبعية مطلوبة لدمج Firebase في المشروع. افتح ملف dependencies.gradle الموجود في جذر المشروع، ثم أضِف مكوّن google-services الإضافي وإصدار حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Firebase" وحزمة تطوير البرامج (SDK) لخدمة Firebase Core.

dependencies.gradle

ext {
    ...

    // TODO: Declare google-services plugin version (101)
    googleServicesPluginVersion = '4.3.4'

    ...

    // TODO: Declare Firebase BOM version (101)                                                                                                                                                                                                   
    firebaseBomVersion = '26.2.0'

    ...
}

تطبيق إضافة google-services على تطبيقك

يستخدم المكوّن الإضافي google-services الملف google-services.json لإعداد تطبيقك لاستخدام Firebase.

أضِف google-services كمسار فئة في الملف build.gradle الموجود في الدليل الجذري للمشروع.

build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ...
    
    dependencies {
        classpath "com.android.tools.build:gradle:$androidPluginVersion"

        // TODO: Add google-services plugin (101)
        classpath "com.google.gms:google-services:$googleServicesPluginVersion"

        ...
    }
}

...

بعد ذلك، طبِّق المكوّن الإضافي google-services من خلال إضافة سطر في ملف app/build.gradle على النحو التالي:

app/build.gradle

apply plugin: 'com.android.application'

// TODO: Apply google-services plugin (101)
apply plugin: 'com.google.gms.google-services'

android {
    ...
}

dependencies {
    ...
}

إضافة Firebase SDK إلى المشروع

أضِف حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Google" إلى ملحقات التطبيق، وذلك في ملف app/build.gradle نفسه.

app/build.gradle

apply plugin: 'com.android.application'

android {
    ...
}

dependencies {
    ...

    // TODO: Import the Firebase BoM (101)
    implementation platform("com.google.firebase:firebase-bom:$firebaseBomVersion")

    // COMPLETE: Add Firebase Analytics dependency (101)
    implementation 'com.google.firebase:firebase-analytics-ktx'

    ...
}

...

مزامنة مشروعك مع ملفات Gradle

للتأكّد من توفّر جميع التبعيات لتطبيقك، عليك مزامنة مشروعك مع ملفات Gradle. انقر على القائمة ملف > مزامنة المشروع مع ملفات Gradle لمزامنة مشروعك مع ملفات Gradle.

5- ربط حساب AdMob بمشروع على Firebase

أكمِل الخطوات التالية لربط تطبيقاتك بمنصة Firebase.

  1. سجِّل الدخول إلى حسابك على AdMob على https://apps.admob.com.
  2. انقر على "التطبيقات" في الشريط الجانبي.
  3. انقر على "اختبار الرسم الرائع". إذا لم يظهر الاسم في قائمة التطبيقات الأخيرة، يمكنك النقر على عرض جميع التطبيقات للبحث في قائمة تتضمّن جميع التطبيقات التي أضفتها إلى AdMob.
  4. انقر على إعدادات التطبيق في الشريط الجانبي.
  5. انقر على الربط بمنصة Firebase.
  6. اختَر الخيار "الربط بمشروع حالي في Firebase وإنشاء تطبيق جديد في Firebase". بعد ذلك، اختَر مشروع "اختبار الرسم الرائع" من القائمة المنسدلة.
  7. بعد النقر على الزر "متابعة"، ستظهر لك الرسالة "تم الربط بنجاح". انقر على الزر "تم" لإنهاء العملية.

بعد ربط تطبيقك على AdMob بمشروع Firebase، ستتمكّن من الاستفادة من بعض الميزات الإضافية على كلّ من AdMob و"وحدة تحكّم Firebase" على النحو التالي:

بطاقة الإيرادات (AdMob)

من بطاقة "الأرباح"، يمكنك إلقاء نظرة شاملة على جميع مصادر الأرباح المحتملة في مكان واحد. في ما يلي مصادر الأرباح المتوافقة:

  • AdMob (تقديرية)
  • شبكات الإعلانات المستندة إلى التوسّط (التي تم رصدها)
  • عمليات شراء داخل التطبيق
  • عمليات الشراء من خلال التجارة الإلكترونية

10fe118249e11150.png

بطاقة مقاييس المستخدم (AdMob)

من بطاقة مقاييس المستخدم، يمكنك الاطّلاع على كيفية تأثير التغييرات في تجربة الإعلانات على سلوك المستخدم.

5f56366f1b31d4a1.png

تقرير "الإعلانات مقابل مكافأة" (AdMob)

يقدّم "تقرير الإعلانات مقابل مكافآت" مجموعة متنوّعة من المقاييس التي ستساعد الناشرين في فهم كيفية تفاعل المستخدمين مع إعلاناتهم مقابل مكافآت.

658a2868777690ea.png

بطاقة إجمالي الأرباح (Firebase)

بعد ربط تطبيقك على AdMob بمنصة Firebase، ستعرض بطاقة "إجمالي الإيرادات" في لوحة بيانات Firebase الإيرادات من AdMob بالإضافة إلى عمليات الشراء داخل التطبيق وعمليات الشراء من خلال التجارة الإلكترونية.

98cb283977b023a.png

إعداد تقارير عن أحداث الإعلانات (Firebase)

يتم جمع الأحداث الخاصة بالإعلانات (أحداث النقر والانطباع وأحداث مقابل مكافأة) تلقائيًا وتكون متاحة للاستخدام في "إحصاءات Google لـ Firebase".

bf77bd8c00c1441b.png

6. تشغيل المشروع

بعد تجميع المشروع وتشغيله، ستظهر لك الشاشة التالية عند بدء تشغيل التطبيق.

15f1d8041988974c.png

بعد النقر على بدء لعبة، ستظهر لك صورة على الشاشة. مهمتك هي تخمين اسم الرسم باستخدام التلميح المعروض في الأعلى، والذي يمكنك من خلاله استنتاج الحرف الأول وطول اسم الرسم.

8e87e96256d6874a.png 9c4a0143c3234cb2.png

إذا لم يكن لديك أي فكرة عن اسم الرسم، يمكنك تخطّي المستوى من خلال النقر على الزر "تخطّي".

قد تحتاج إلى دليل إضافي يساعدك في تخمين الإجابة. يمكنك الحصول على تلميح إضافي من خلال النقر على زر "تلميح" ومشاهدة إعلان فيديو مقابل مكافأة. بعد إكمال مشاهدة الإعلان، سيتم الكشف عن حرف إضافي كمكافأة.

edcf6f0d833ea4ea.png 47ab9a07b1c71711.png

7. إضافة أحداث التطبيقات

لفهم رحلة المستخدم في لعبة "اختبار الرسم الرائع" بشكلٍ مفصّل، عليك تحديد بعض الأحداث المخصّصة التي تتتبّع سلوك المستخدم في اللعبة على النحو التالي:

اسم الحدث

تم التفعيل...

المعلّمات

game_start

عندما يبدأ المستخدم لعبة جديدة

لا ينطبق

level_start

عندما يبدأ المستخدم مستوى جديدًا (اختبار رسم جديدًا) ضمن مرحلة (هناك 6 مستويات في مرحلة واحدة)

level_name

level_wrong_answer

عندما يرسل المستخدم إجابة خاطئة

level_name

ad_reward_prompt

عندما ينقر المستخدم على زر التلميح ويُطلب منه مشاهدة "إعلان فيديو مقابل مكافأة"

ad_unit_id

ad_reward_impression

عندما يبدأ المستخدم بمشاهدة "إعلان فيديو مقابل مكافأة"

ad_unit_id

level_success

عندما يقدّم المستخدم إجابة صحيحة (يجتاز مستوى)

level_name, number_of_attempts, elapsed_time_sec, hint_used

level_fail

عندما يتخطّى المستخدم مستوى

level_name, number_of_attempts, elapsed_time_sec, hint_used

game_complete

عند انتهاء المباراة

number_of_correct_answers

في ما يلي وصف لكل مَعلمة مرتبطة بكل حدث:

اسم الحدث

اسم المَعلمة

الوصف

level_start

level_name

اسم الرسم الظاهر في المستوى (مثلاً، "موزة")

level_wrong_answer

level_name

عندما يرسل المستخدم إجابة خاطئة

ad_reward_prompt

ad_unit_id

معرّف وحدة إعلانية يُستخدَم لعرض "إعلان فيديو مقابل مكافأة"

ad_reward_impression

ad_unit_id

معرّف وحدة إعلانية يُستخدَم لعرض "إعلان فيديو مقابل مكافأة"

level_success

level_name

اسم الرسم الظاهر في المستوى (مثلاً، "موزة")

level_success

number_of_attempts

عدد المحاولات التي تم إجراؤها لاجتياز مستوى

level_success

elapsed_time_sec

الوقت المنقضي لإكمال مستوى معيّن، بالثواني

level_success

hint_used

ما إذا كان المستخدم قد استعان بتلميح (شاهد "إعلان فيديو مقابل مكافأة") أم لا لاجتياز مستوى (1: استعان بتلميح / 0: اجتاز مستوى بدون تلميح)

level_fail

level_name

اسم الرسم الظاهر في المستوى (مثلاً، "موزة")

level_fail

number_of_attempts

عدد المحاولات التي تم إجراؤها لاجتياز مستوى

level_fail

elapsed_time_sec

الوقت المنقضي لإكمال مستوى معيّن، بالثواني

level_fail

hint_used

ما إذا كان المستخدم قد استعان بتلميح (شاهد "إعلان فيديو مقابل مكافأة") أم لا لاجتياز مستوى (1: استعان بتلميح / 0: اجتاز مستوى بدون تلميح)

game_complete

number_of_correct_answers

عدد المستويات التي تم اجتيازها في اللعبة

إنشاء فئة مساعدة لتسجيل الأحداث المخصّصة

لتسجيل حدث الإحصاءات بسهولة، عليك إنشاء فئة مساعدة لإدارة الأحداث المخصّصة.

أولاً، أنشئ ملف Kotlin جديدًا (وليس فئة Kotlin) وسمِّه QuizAnalytics.kt ضمن حزمة com.codelab.awesomedrawingquiz. أنشئ حقولاً تحدّد اسم الأحداث المخصّصة ومَعلماتها.

QuizAnalytics.kt

private const val EVENT_AD_REWARD_PROMPT = "ad_reward_prompt"

private const val EVENT_AD_REWARD_IMPRESSION = "ad_reward_impression"

private const val EVENT_LEVEL_FAIL = "level_fail"

private const val EVENT_LEVEL_SUCCESS = "level_success"

private const val EVENT_LEVEL_WRONG_ANSWER = "level_wrong_answer"

private const val EVENT_GAME_START = "game_start"

private const val EVENT_GAME_COMPLETE = "game_complete"

private const val PARAM_AD_UNIT_ID = "ad_unit_id"

private const val PARAM_ELAPSED_TIME_SEC = "elapsed_time_sec"

private const val PARAM_HINT_USED = "hint_used"

private const val PARAM_NUMBER_OF_ATTEMPTS = "number_of_attempts"

private const val PARAM_NUMBER_OF_CORRECT_ANSWERS = "number_of_correct_answers"

بعد ذلك، أضِف وظائف الإضافة التي تساعدك في تسجيل الأحداث المخصّصة في لعبتك. يُرجى العِلم أنّ معظم الأحداث المخصّصة تتضمّن مَعلمات لتوفير المزيد من السياق لكلّ حدث. يُرجى أيضًا العِلم بأنّ "إحصاءات Google" تحدّد مسبقًا بعض أسماء الأحداث والمَعلمات (FirebaseAnalytics.Event.LEVEL_NAME وFirebaseAnalytics.Event.LEVEL_START)، لذا سنستخدمها.

QuizAnalytics.kt

...

fun FirebaseAnalytics.logGameStart() = logEvent(EVENT_GAME_START, null)

fun FirebaseAnalytics.logLevelStart(levelName: String) {
    logEvent(FirebaseAnalytics.Event.LEVEL_START) {
        param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
    }
}

fun FirebaseAnalytics.logLevelWrongAnswer(levelName: String) {
    logEvent(EVENT_LEVEL_WRONG_ANSWER) {
        param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
    }
}

fun FirebaseAnalytics.logAdRewardPrompt(adUnitId: String) {
    logEvent(EVENT_AD_REWARD_PROMPT) {
        param(PARAM_AD_UNIT_ID, adUnitId)
    }
}

fun FirebaseAnalytics.logAdRewardImpression(adUnitId: String) {
    logEvent(EVENT_AD_REWARD_IMPRESSION) {
        param(PARAM_AD_UNIT_ID, adUnitId)
    }
}

fun FirebaseAnalytics.logLevelSuccess(
    levelName: String,
    numberOfAttempts: Int,
    elapsedTimeSec: Int,
    hintUsed: Boolean
) {
    logEvent(EVENT_LEVEL_SUCCESS) {
        param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
        param(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttempts.toLong())
        param(PARAM_ELAPSED_TIME_SEC, elapsedTimeSec.toLong())
        param(PARAM_HINT_USED, if (hintUsed) 1 else 0)
    }
}

fun FirebaseAnalytics.logLevelFail(
    levelName: String,
    numberOfAttempts: Int,
    elapsedTimeSec: Int,
    hintUsed: Boolean
) {
    logEvent(EVENT_LEVEL_FAIL) {
        param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
        param(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttempts.toLong())
        param(PARAM_ELAPSED_TIME_SEC, elapsedTimeSec.toLong())
        param(PARAM_HINT_USED, if (hintUsed) 1 else 0)
    }
}

fun FirebaseAnalytics.logGameComplete(
    numberOfCorrectAnswers: Int
) {
    logEvent(EVENT_GAME_COMPLETE) {
        param(PARAM_NUMBER_OF_CORRECT_ANSWERS, numberOfCorrectAnswers.toLong())
    }
}

تسجيل أحداث إحصاءات الاستخدام في اللعبة

في الفئة GameViewModel، أضِف سمة جديدة لمثيل FirebaseAnalytics.

GameViewModel.kt

class GameViewModel(
    ...
    // TODO: Accept FirebaseAnalytics instance as a parameter (101)
    private val analytics: FirebaseAnalytics,
) : ViewModel() {
   ...
}

بعد ذلك، في الفئة AwesomeDrawingQuizViewModelFactory، أضِف سمة جديدة كما فعلت سابقًا في GameViewModel.

AwesomeDrawingQuizViewModelFactory.kt

class AwesomeDrawingQuizViewModelFactory(
    ...
    // TODO: Accept FirebaseAnalytics instance as a parameter (101)
    private val analytics: FirebaseAnalytics,
) : ViewModelProvider.Factory {
    ...
}

بعد ذلك، في الفئة AwesomeDrawingQuiz، أضِف الدالة provideFirebaseAnalytics() وعدِّل الدالة provideViewModelFactory() لتمرير مثيل FirebaseAnalytics إلى AwesomeDrawingViewModelFactory.

AwesomeDrawingQuiz.kt

class AwesomeDrawingQuiz : Application() {

    ...

    fun provideViewModelFactory() = AwesomeDrawingQuizViewModelFactory(
        this,
        provideGameSettings(),
        // TODO: Pass FirebaseAnalytics instance as a parameter (101)
        provideFirebaseAnalytics(),
    )

    // TODO: Provide FirebaseAnalytics instance (101)
    private fun provideFirebaseAnalytics() = Firebase.analytics

    ...

}

أنت الآن جاهز لتنفيذ الأحداث المخصّصة. أولاً، في الدالة startGame()، استدعِ الدالة logGameStart() للإشارة إلى بدء إحدى الألعاب.

بما أنّ logGameStart() هي دالة إضافة للفئة FirebaseAnalytics، يمكنك استدعاؤها من مثيل الفئة FirebaseAnalytics.

GameViewModel.kt

fun startGame() {
    ...

    // TODO: Log game_start event (101)
    analytics.logGameStart()

    ...
}

بعد ذلك، في الدالة checkAnswer()، أضِف الحدثَين level_success وlevel_wrong_answer.

GameViewModel.kt

fun checkAnswer(userAnswer: String) {
    ...
    if (correct) {
        ...

        // TODO: Log level_success event (101)
        analytics.logLevelSuccess(
            levelName = drawing.word,
            numberOfAttempts = numAttempts,
            elapsedTimeSec = elapsedTimeInSeconds,
            hintUsed = isHintUsed,
        )

        ...
    } else {
        // TODO: Log level_wrong_answer event (101)
        analytics.logLevelWrongAnswer(levelName = drawing.word)

        ...
    }
}

بعد ذلك، في الدالة skipLevel()، أضِف الحدث level_fail لوضع علامة على المستوى على أنّه لم يتم اجتيازه.

GameViewModel.kt

fun skipLevel() {
   ...

    // TODO: Log level_fail event (101)
    analytics.logLevelFail(
        levelName = drawing.word,
        numberOfAttempts = numAttempts,
        elapsedTimeSec = elapsedTimeInSeconds,
        hintUsed = isHintUsed,
    )

    ...
}

بعد ذلك، نفِّذ الدالتَين logAdRewardPrompt() وlogAdRewardImpression() لتتبُّع سلوك المستخدم بشأن "إعلان الفيديو مقابل مكافأة".

GameViewModel.kt

fun logAdRewardPrompt(adUnitId: String) {
    // TODO: Log ad_reward_prompt event (101)
    analytics.logAdRewardPrompt(adUnitId)
}

fun logAdRewardImpression(adUnitId: String) {
    // TODO: Log ad_reward_impression event (101)
    analytics.logAdRewardImpression(adUnitId)
}

أخيرًا، عدِّل الدالتَين requestNewDrawing() وfinishGame() لإضافة الحدثَين المخصّصَين level_start وgame_complete.

GameViewModel.kt

private fun requestNewDrawing() {
    ...

    drawingRequestDisposable = drawingDao.getRandomDrawings(seenWords)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe { d ->
            ...

            // TODO: Log level_start event (101)
            analytics.logLevelStart(d.word)

            ...
        }
}

private fun finishGame() {
    // TODO: Log game_complete event (101)
    analytics.logGameComplete(numCorrectAnswers)

    ...
}

8. تصحيح أخطاء أحداث "إحصاءات Google"

يمكنك استخدام DebugView في وحدة تحكّم Firebase للتأكّد من تسجيل الأحداث بشكلٍ صحيح. تتيح لك أداة DebugView الاطّلاع على بيانات الأحداث الأولية التي يسجّلها تطبيقك على أجهزة التطوير في الوقت الفعلي تقريبًا.

وهذا مفيد جدًا لأغراض التحقّق من الصحة خلال مرحلة قياس حالة التطبيق في عملية التطوير، ويمكن أن يساعدك في رصد أي أخطاء في عملية تنفيذ "إحصاءات Google".

تفعيل وضع تصحيح الأخطاء

بشكل عام، يتم تجميع الأحداث المسجَّلة في تطبيقك معًا على مدار فترة زمنية تبلغ ساعة واحدة تقريبًا، ثم يتم تحميلها معًا. للتحقّق من صحة تنفيذ "إحصاءات Google" أثناء التنفيذ، عليك تفعيل "وضع تصحيح الأخطاء" على جهاز التطوير لتحميل الأحداث بأقل تأخير.

لتفعيل "وضع تصحيح الأخطاء"، أكمِل الخطوات التالية:

  1. افتح نافذة أداة Terminal في "استوديو Android" (عرض > نوافذ الأدوات > Terminal).

c8dc1b4f08a224b8.png

  1. نفِّذ الأمر التالي (تأكَّد من توصيل جهاز Android التجريبي بجهاز الكمبيوتر أو تشغيل Android Emulator):
adb shell setprop debug.firebase.analytics.app com.codelab.awesomedrawingquiz

يستمر أسلوب الأداء هذا إلى أن يتم إيقاف "وضع تصحيح الأخطاء" بشكل صريح عن طريق تنفيذ الأمر التالي:

adb shell setprop debug.firebase.analytics.app .none.

تصحيح أخطاء أحداث "إحصاءات Google" باستخدام DebugView

بعد تفعيل "وضع تصحيح الأخطاء" على جهاز الاختبار، انتقِل إلى مشروعك في وحدة تحكّم Firebase واختَر إحصاءات Google > DebugView من القائمة. بعد ذلك، شغِّل لعبتك على جهازك الاختباري للاطّلاع على الأحداث التي يتم تسجيلها وعرضها في تقرير DebugView.

827059255d09ac00.png

يمكنك الوصول إلى معلومات تفصيلية عن كل حدث من خلال النقر على اسم الحدث. على سبيل المثال، تعرض لقطة الشاشة التالية تفاصيل المَعلمات المرتبطة بالحدث level_start.

475db00d05d03ab8.png

يُرجى الرجوع إلى مقالة مركز المساعدة حول DebugView لمزيد من التفاصيل.

9- تفعيل السمات والمقاييس المخصّصة

تجمع "إحصاءات Google لبرنامج Firebase" تلقائيًا إجمالي عدد الأحداث. لكل مَعلمة خاصة بالحدث تهمّك، عليك تفعيل إعداد التقارير لهذه المَعلمة بشكلٍ صريح. يمكن بعد ذلك لأداة "إحصاءات Google لـ Firebase" عرض بطاقات إضافية لعرض إحصاءات المعلمات المخصّصة.

لتسجيل السمات والمقاييس المخصّصة، اتّبِع الخطوات التالية:

  1. انتقِل إلى وحدة تحكّم Firebase واختَر مشروع اختبار الرسم الرائع الذي أنشأته سابقًا.
  2. انقر على إحصاءات Google > الأحداث من قائمة التنقّل.
  1. انقر على إدارة التعريفات المخصّصة.
  2. في علامة التبويب "السمات المخصّصة"، انقر على إنشاء سمات مخصّصة.
  3. في حقل "اسم مَعلمة خاصة بالحدث"، أدخِل level_name وانقر على حفظ لإكمال تسجيل المَعلمة.

3d20ee9d7de74e9b.png

  1. بعد ذلك، اختَر علامة التبويب المقاييس المخصّصة وانقر على إنشاء مقاييس مخصّصة.
  2. أدخِل اسم المَعلمة ووحدة القياس للمَعلمات التالية.

اسم المَعلمة

نوع المَعلمة

وحدة القياس

number_of_attempts

العدد

خطة "الرزمة العادية"

hint_used

العدد

خطة "الرزمة العادية"

elapsed_time_sec

العدد

الثواني

number_of_correct_answers

العدد

خطة "الرزمة العادية"

10. الحصول على إحصاءات من تقرير "الأحداث"

بعد إضافة بعض الأحداث في اللعبة، من المفترض أن تتمكّن من الإجابة عن الأسئلة المتعلّقة بسلوك المستخدم في اللعبة. في ما يلي بعض الإحصاءات التي يمكنك الحصول عليها من تقرير أحداث Firebase.

أي مستوى يحتوي على أكبر عدد من الإجابات الخاطئة؟

للإجابة عن هذا السؤال، عليك معرفة عدد أحداث level_wrong_answer التي تم تشغيلها لكل مستوى.

انقر على level_wrong_answer من تقرير الأحداث. في تقرير الحدث level_wrong_answer، ابحث عن البطاقة level_name. ستظهر لك القيم المرتبطة بالمَعلمة level_name في تلك البطاقة على النحو التالي.

25da426bbc0c612c.png

وفقًا للقطة الشاشة أعلاه، يمكنك بسهولة معرفة أنّ الأفق يتضمّن أكبر عدد من الإجابات الخاطئة، ما يعني أنّه صعب على المستخدمين مقارنةً بالمستويات الأخرى.

باستخدام الإحصاءات التي حصلت عليها من هنا، يمكنك اتّخاذ قرار بعدم توفير مستويات صعبة للمستخدمين المبتدئين للحفاظ على معدّل احتفاظ مرتفع.

ما هو متوسط عدد المحاولات التي تم إجراؤها لاجتياز مستوى معيّن؟

في لعبة اختبار الرسم الرائع، يمكن للمستخدمين إرسال الإجابة عن كل مستوى بالقدر الذي يريدونه.

بما أنّك فعّلت إعداد تقارير المَعلمات في المَعلمة number_of_attempts ضمن الحدث level_success، يمكنك الاطّلاع على المقاييس التفصيلية لهذه المَعلمة.

انقر على الحدث level_success من تقرير الأحداث. في تقرير الحدث level_success، ابحث عن البطاقة number_of_attemps. سيظهر لك متوسط عدد المحاولات على تلك البطاقة على النحو التالي:

43de290f9f1a0ac9.png

يمكنك استخدام الإحصاءات من هنا لتحسين صعوبة اللعبة في المتوسط. على سبيل المثال، إذا كان متوسط عدد المحاولات قريبًا جدًا من 1، يمكنك جعل اللعبة أكثر صعوبة.

هل حاول المستخدمون حلّ السؤال من خلال الحصول على تلميح، حتى لو لم يتمكّنوا من اجتياز مستوى في النهاية؟

عندما يقرّر المستخدم تخطّي مستوى معيّن، يتمّ تشغيل الحدث level_fail. يمكن أن تكون هناك أسباب عديدة لقرار المستخدم.

ومع ذلك، بما أنّ اللعبة يمكن أن تقدّم للمستخدم تلميحًا بعد مشاهدة "إعلان فيديو مقابل مكافأة"، من المهم معرفة ما إذا كان المستخدم قد حاول اجتياز المستوى بمساعدة التلميح.

انقر على الحدث level_fail من تقرير الأحداث. في تقرير الحدث level_fail، ابحث عن البطاقة hint_used. سيظهر لك متوسط عدد مَعلمات الحدث hint_used. يُرجى العِلم أنّ قيمة المَعلمة هي 1 إذا تم استخدام تلميح، و0 إذا لم يتم استخدام تلميح.

313814372cd7c8a4.png

إذا كانت الأرقام الواردة في البطاقة hint_used قريبة من 0، فهذه إشارة إلى أنّ المكافأة (التلميح) ليست مفيدة بما يكفي لهؤلاء المستخدمين. بالإضافة إلى ذلك، ستفوتك فرصة زيادة الإيرادات من "إعلانات الفيديو مقابل مكافأة".

لذلك، عليك التفكير في تقديم مكافأة أكبر حتى يتفاعل المستخدمون مع اللعبة بشكل أكبر، ما يؤدي إلى زيادة الإيرادات من "إعلانات الفيديو مقابل مكافأة".

ما هو متوسط عدد المستويات التي تم اجتيازها في كل لعبة؟

يتضمّن كلّ من "اختبار الرسم الرائع" 6 مستويات. بعد أن يكمل المستخدم 6 مستويات (بغض النظر عمّا إذا كان قد اجتاز كل مستوى أو أخفق فيه)، يتمّ تنشيط الحدث game_complete مع number_of_correct_answers كمَعلمة. تشير المَعلمة number_of_correct_answers إلى عدد المستويات التي قدّم فيها المستخدم إجابة صحيحة.

انقر على الحدث game_complete من تقرير الأحداث. في تقرير حدث game_complete، ابحث عن البطاقة number_of_correct_answers. سيظهر لك متوسط عدد مَعلمات الحدث number_of_correct_answers.

d9eeaa019d1bceb4.png

إذا كان متوسط عدد المستويات التي تم اجتيازها منخفضًا جدًا، عليك إعادة ترتيب المستويات في اللعبة لمساعدة المستخدمين على اجتياز المستويات الأولى بسهولة أكبر، حتى يتمكّنوا من مواصلة اللعب بدون أن يفقدوا اهتمامهم.

11. أكملت الخطوات بنجاح

لقد أكملت الدرس التطبيقي حول الترميز بعنوان "أساسيات AdMob وFirebase" على Android. يمكنك العثور على الرمز البرمجي المكتمل لهذا الدرس التطبيقي حول الترميز في المجلد android_studio_folder.png101-complete_and_102-base.

في الجزء التالي من الدرس التطبيقي حول الترميز AdMob+Firebase، ستتعلّم كيفية استخدام مسار إحالة المستخدمين إلى إجراء معيّن لتصوّر مسار أحداث التطبيق. سيتناول الجزء التالي أيضًا كيفية استخدام ميزتَي "الإعداد عن بُعد" و"اختبار A/B" لتحسين قيمة المَعلمة في اللعبة بدون تحديث التطبيق.