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

1. مقدمة

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

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

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

ما الذي ستنشئه

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

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

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

المعلومات التي ستطّلع عليها

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

المتطلبات

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

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

حديث متوسط بارع

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

حديث متوسط بارع

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

تنزيل الرمز

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

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

...أو استنساخ مستودع جيت هب من سطر الأوامر.

$ 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" واختَر استيراد مشروع على شاشة الترحيب. بعد ذلك، اختَر دليل 101-base من الرمز الذي نزّلته.

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

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

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

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

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

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

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

7672f41ec611101b.png

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

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 وحزمة SDK الخاصة بخدمة Firebase Analytics وإصدار حزمة تطوير البرامج (SDK) الأساسية لمنصّة Firebase.

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" على تطبيقك

يستخدم المكوّن الإضافي لخدمات Google ملف 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 {
    ...
}

إضافة حزمة تطوير البرامج (SDK) لمنصة Firebase إلى المشروع

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

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. اختَر Awesome Drawing quiz. وفي حالة عدم رؤيته في قائمة التطبيقات المستخدمة مؤخرًا، يمكنك النقر على عرض كل التطبيقات للبحث في قائمة بجميع التطبيقات التي أضفتها إلى AdMob.
  4. انقر على إعدادات التطبيق في الشريط الجانبي.
  5. انقر على الربط بمنصة Firebase.
  6. حدِّد الخيار "الربط بمشروع حالي على Firebase وإنشاء تطبيق جديد في Firebase". بعد ذلك، اختَر مشروع Awesome Drawing Quiz" (اختبار الرسم الرائع) من القائمة المنسدلة.
  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، وe فقدd_time_sec، وhint_used

level_fail

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

level_name، وnumber_of_attempts، وe فقدd_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. أحداث الإحصاءات المتعلقة بتصحيح الأخطاء

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

يُعد هذا مفيدًا جدًا لأغراض التحقق أثناء مرحلة قياس حالة الأداة، ويمكن أن يساعدك في اكتشاف أي أخطاء في تنفيذ التحليلات.

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

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

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

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

c8dc1b4f08a224b8.png

  1. نفِّذ الأمر التالي (تأكّد من توصيل جهاز Android الاختباري بجهاز الكمبيوتر أو أنّ محاكي Android قيد التشغيل):
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 واختَر مشروع Awesome Drawing Quiz الذي أنشأته سابقًا.
  2. انقر على Analytics > الأحداث من قائمة التنقل.
  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. أكملت كل الإجراءات

لقد أكملت الدرس التطبيقي حول الترميز الخاص بنظام التشغيل Android ضمن الإصدار 101 من Firebase وAdMob. يمكنك العثور على الرمز المكتمل لهذا الدرس التطبيقي في المجلد android_studio_folder.png101-complete_and_102-base.

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