۱. مقدمه
تبلیغات بخش مهمی از تجربه کلی کاربر در اپلیکیشن شما هستند. پیادهسازی خوب تبلیغات میتواند به بهبود تجربه کلی اپلیکیشن شما و حتی بهبود حفظ و تعامل کاربر کمک کند. به عنوان مثال، تبلیغات جایزهدار به شما این امکان را میدهد که برای تماشای تبلیغات ویدیویی، به کاربران پول درونبرنامهای یا آیتمهایی ارائه دهید، به طوری که کاربران بتوانند به سطوح جدیدی برسند که در غیر این صورت ممکن بود در آن گیر کنند و از اپلیکیشن خارج شوند.
با این حال، ایجاد یک تجربه تبلیغاتی عالی آسان نیست. ممکن است سوالاتی از این قبیل داشته باشید: چند وقت یکبار باید این تبلیغات را نشان دهید؟ کجا و چه زمانی باید آنها را نشان دهید؟ جایزه باید چه باشد؟ متأسفانه، پاسخ از برنامهای به برنامه دیگر و از مکانی به مکان دیگر متفاوت است. هیچ پاسخ یکسانی برای همه وجود ندارد.
با استفاده از گوگل آنالیتیکس برای فایربیس، ادموب و چندین ابزار قدرتمند و در عین حال آسان دیگر که فایربیس ارائه میدهد، تنظیم دقیق برنامه شما به روشی دادهمحور بسیار آسانتر و سادهتر شده است. امروز، ما به شما نشان خواهیم داد که چگونه میتوانید شروع کنید!
آنچه خواهید ساخت
این آزمایشگاه کد، اولین از سه آزمایشگاه کدی است که شما را در ساخت برنامهای به نام Awesome Drawing Quiz راهنمایی میکند، بازیای که به بازیکنان اجازه میدهد نام نقاشی را حدس بزنند. این آزمایشگاه نشان میدهد که چگونه میتوانید تبلیغات پاداشی و سرویسهای Firebase را در بازی خود بگنجانید.
در این آزمایشگاه کد، شما گوگل آنالیتیکس را برای فایربیس ادغام خواهید کرد تا برخی از رویدادهای مهم برنامه را ثبت کنید. همچنین، یاد خواهید گرفت که چگونه تجزیه و تحلیل برنامه نشان داده شده در کنسول فایربیس را بخوانید.
|
|
اگر در حین کار با این آزمایشگاه کد با هرگونه مشکلی (اشکال در کد، خطاهای دستوری، کلمات نامفهوم و غیره) مواجه شدید، لطفاً مشکل را از طریق لینک «گزارش اشتباه» در گوشه پایین سمت چپ آزمایشگاه کد گزارش دهید.
آنچه یاد خواهید گرفت
- نحوه تنظیم گوگل آنالیتیکس برای فایربیس در برنامه شما
- نحوه ثبت رویدادهای برنامه
- نحوه خواندن تجزیه و تحلیل برنامه نشان داده شده در کنسول Firebase
آنچه نیاز دارید
- اندروید استودیو نسخه ۴.۱ به بالا
- یک حساب گوگل
- یک دستگاه آزمایشی با اندروید ۵.۰+ به همراه کابل USB برای اتصال دستگاه، یا یک شبیهساز اندروید که AVD (دستگاه مجازی اندروید) را اجرا میکند و دارای یک ایمیج سیستمی است که از Play Store/Google APIs پشتیبانی میکند.
سطح تجربه خود را با AdMob چگونه ارزیابی میکنید؟
سطح تجربه خود با فایربیس را چگونه ارزیابی میکنید؟
۲. راهاندازی محیط توسعه
کد را دانلود کنید
برای دانلود تمام کدهای این codelab روی دکمه زیر کلیک کنید:
فایل زیپ دانلود شده را از حالت فشرده خارج کنید. این کار پوشه ریشه با نام admob-firebase-codelabs-android را از حالت فشرده خارج میکند.
... یا مخزن GitHub را از خط فرمان کلون کنید.
$ git clone https://github.com/googlecodelabs/admob-firebase-codelabs-android
این مخزن شامل چهار پوشه به شرح زیر است:
۱۰۱-base — کد اولیهای که در این آزمایشگاه کد خواهید ساخت.
۱۰۱-complete_and_102-base — کد تکمیلشده برای این codelab و کد آغازین برای codelab 102.
۱۰۲-کامل — کد کاملشده برای آزمایشگاه کد ۱۰۲.
برنامه شروع کننده را وارد کنید
اندروید استودیو را اجرا کنید و در صفحه خوشامدگویی گزینه "وارد کردن پروژه" را انتخاب کنید. سپس دایرکتوری 101-base را از کدی که دانلود کردهاید انتخاب کنید.
حالا باید پروژه را در اندروید استودیو باز داشته باشید.
۳. راهاندازی واحد تبلیغات ویدیویی پاداشی (اختیاری)
برنامهی اولیه برای راحتی شما، از قبل شامل یک واحد تبلیغات ویدیویی پاداشی اختصاصی است. اگر نمیخواهید یک واحد جدید در حساب AdMob خود ایجاد کنید، میتوانید از این مرحله صرف نظر کنید .
برای ایجاد یک برنامه جدید AdMob در حساب کاربری خود، لطفاً دستورالعملهای زیر را دنبال کنید:
- به کنسول ادموب بروید.
- از منوی برنامهها ، روی « افزودن برنامه » کلیک کنید.
- وقتی از شما پرسیده شد «آیا برنامه خود را در گوگل پلی یا اپ استور منتشر کردهاید؟»، پاسخ « خیر» بود.
- نام برنامه را «Awesome Drawing Quiz» بگذارید، «Android» را به عنوان پلتفرم انتخاب کنید، سپس روی « Add » کلیک کنید.
پس از ایجاد یک برنامه AdMob در حساب کاربری خود، مراحل زیر را برای ایجاد یک واحد تبلیغات ویدیویی پاداشدار جدید دنبال کنید.
- روی منوی برنامهها در بخش کاربری ادموب کلیک کنید، سپس «آزمون نقاشی فوقالعاده» را از لیست برنامهها انتخاب کنید.
- برای ایجاد یک واحد تبلیغات ویدیویی پاداشدار جدید، روی «افزودن واحد تبلیغات» کلیک کنید.
- برای قالب تبلیغ، گزینه «پاداشدار» (Rewarded) را انتخاب کنید.

- نام واحد تبلیغاتی را به دلخواه خود وارد کنید. سپس، مبلغ پاداش را روی ۱ و آیتم پاداش را روی «hint» تنظیم کنید (این پاداشی است که برنامه در حال حاضر به کاربران میدهد). برای ایجاد یک واحد تبلیغاتی ویدیویی پاداشدار جدید، روی « ایجاد واحد تبلیغاتی » کلیک کنید.

- وقتی با موفقیت ایجاد شد، دستورالعملهایی مشابه موارد زیر را مشاهده خواهید کرد:

- به پروژه اندروید برگردید و ثابتهای شناسه برنامه AdMob و شناسه واحد تبلیغات را به مواردی که در مرحله قبل ایجاد کردهاید، بهروزرسانی کنید.
رشتهها.xml
<!-- Update the value with your AdMob app id -->
<string name="admob_app_id">YOUR_ADMOB_APP_ID</string>
فعالیت بازی. kt
// Update the value with your Rewarded Video ad unit id
private const val AD_UNIT_ID = "<YOUR_AD_UNIT_ID>";
۴. راهاندازی پروژه فایربیس
ایجاد یک پروژه جدید از کنسول Firebase
- به کنسول فایربیس بروید.
- گزینه «افزودن پروژه» را انتخاب کنید و نام پروژه خود را «آزمون نقاشی فوقالعاده» بگذارید. مطمئن شوید که دکمه رادیویی «فعال کردن گوگل آنالیتیکس برای این پروژه» فعال است.
- حساب گوگل آنالیتیکسی که قصد استفاده از آن را دارید انتخاب کنید. برای اکثر موارد، انتخاب گزینه حساب پیشفرض برای فایربیس کافی است، اما اگر حساب گوگل آنالیتیکس دیگری دارید که میخواهید از آن استفاده کنید، آن را اینجا انتخاب کنید.
- روی ایجاد پروژه کلیک کنید.
برنامه اندروید را اضافه کنید
- از صفحه نمای کلی پروژه جدید خود، روی «افزودن فایربیس به برنامه اندروید» کلیک کنید.
- نام بستهی codelab را وارد کنید: com.codelab.awesomedrawingquiz
- یک نام مستعار برای برنامه خود تنظیم کنید: مسابقه نقاشی عالی
- فیلد SHA-1 را خالی بگذارید زیرا SHA-1 برای این پروژه لازم نیست.
- برای ثبت برنامه خود، گزینه ثبت برنامه را انتخاب کنید.
فایل google-services.json را به برنامه خود اضافه کنید
در مرحله بعد، صفحهای به شما نمایش داده میشود که میتوانید در آن فایل پیکربندی حاوی تمام متادیتای لازم Firebase برای برنامه خود را دانلود کنید. روی «دانلود google-service.json» کلیک کنید و فایل را در آن کپی کنید.
دایرکتوری app در پروژه شما.

نسخههای وابستگی را اعلام کنید
بیایید با اضافه کردن نسخه هر وابستگی مورد نیاز برای ادغام Firebase در پروژه شروع کنیم. فایل dependencies.gradle را که در ریشه پروژه قرار دارد باز کنید، سپس افزونه google-services، Firebase Analytics SDK و نسخه Firebase Core SDK را اضافه کنید.
وابستگیها.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.json برای پیکربندی برنامهی شما جهت استفاده از Firebase استفاده میکند.
google-services را به عنوان classpath در فایل build.gradle که در دایرکتوری ریشه پروژه قرار دارد، اضافه کنید.
ساخت.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 اعمال کنید:
برنامه/ساخت.gradle
apply plugin: 'com.android.application'
// TODO: Apply google-services plugin (101)
apply plugin: 'com.google.gms.google-services'
android {
...
}
dependencies {
...
}
اضافه کردن Firebase SDK به پروژه
همچنان در فایل app/build.gradle خود، SDK مربوط به Analytics را به وابستگیهای برنامه اضافه کنید.
برنامه/ساخت.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، از منوی File > Sync Project with Gradle Files را انتخاب کنید.
۵. لینک کردن AdMob به پروژه Firebase
برای اتصال برنامههای خود به Firebase، مراحل زیر را انجام دهید.
- از طریق آدرس https://apps.admob.com وارد حساب کاربری AdMob خود شوید.
- روی برنامهها در نوار کناری کلیک کنید.
- «آزمون نقاشی فوقالعاده» را انتخاب کنید. اگر آن را در فهرست برنامههای اخیر نمیبینید، میتوانید روی «مشاهده همه برنامهها» کلیک کنید تا فهرستی از تمام برنامههایی که به AdMob اضافه کردهاید را جستجو کنید.
- روی تنظیمات برنامه در نوار کناری کلیک کنید.
- روی پیوند به فایربیس کلیک کنید.
- گزینه «پیوند به یک پروژه Firebase موجود و ایجاد یک برنامه Firebase جدید» را انتخاب کنید. سپس از منوی کشویی، پروژه «آزمون نقاشی فوقالعاده» را انتخاب کنید.
- پس از کلیک بر روی دکمه «ادامه» ، پیام «پیوند با موفقیت انجام شد» را مشاهده خواهید کرد. برای پایان، روی دکمه «انجام شد» کلیک کنید.
زمانی که برنامه AdMob خود را به پروژه Firebase پیوند دهید، برخی از ویژگیهای اضافی هم در کنسول AdMob و هم در کنسول Firebase به شرح زیر فعال خواهد شد:
کارت درآمد (ادموب)
از طریق کارت درآمد، میتوانید نگاهی جامع به تمام جریانهای درآمدی ممکن در یک مکان واحد داشته باشید. منابع درآمدی پشتیبانی شده به شرح زیر است:
- ادموب (تخمین زده شده)
- شبکههای تبلیغاتی واسطهای (مشاهدهشده)
- خریدهای درون برنامهای
- خریدهای تجارت الکترونیک

کارت معیارهای کاربر (AdMob)
از طریق کارت معیارهای کاربر، میتوانید ببینید که چگونه تغییرات در تجربه تبلیغات شما ممکن است بر رفتار کاربر تأثیر بگذارد.

گزارش تبلیغات جایزهدار (AdMob)
گزارش تبلیغات جایزهدار، معیارهای متنوعی را ارائه میدهد که به ناشران کمک میکند تا نحوه تعامل کاربران با تبلیغات جایزهدار خود را درک کنند.

کارت درآمد کل (فایربیس)
پس از اینکه برنامه AdMob خود را به Firebase متصل کردید، کارت درآمد کل در داشبورد Firebase، درآمد حاصل از AdMob را به همراه خریدهای درون برنامهای و خریدهای تجارت الکترونیک نمایش میدهد.

گزارش رویدادهای تبلیغاتی (فایربیس)
رویدادهای خاص تبلیغات (رویدادهای کلیک، نمایش و پاداش) به طور خودکار جمعآوری میشوند و برای استفاده در Google Analytics برای Firebase در دسترس هستند.

۶. اجرای پروژه
پس از کامپایل و اجرای پروژه، هنگام شروع برنامه، صفحه زیر را مشاهده خواهید کرد.

وقتی روی شروع بازی کلیک کنید، یک نقاشی روی صفحه نمایش داده میشود. ماموریت شما این است که با استفاده از راهنمایی که در بالا نمایش داده میشود، نام نقاشی را حدس بزنید، که از طریق آن میتوانید حرف اول و طول نام نقاشی را حدس بزنید.


اگر نام نقاشی را نمیدانید، میتوانید با کلیک بر روی دکمه «رد شدن» از مرحله صرف نظر کنید.
ممکن است به یک سرنخ اضافی نیاز داشته باشید که به شما در حدس زدن پاسخ کمک کند. میتوانید با کلیک بر روی دکمه «راهنمایی» و تماشای یک تبلیغ ویدیویی جایزهدار، یک سرنخ اضافی دریافت کنید. پس از تماشای کامل تبلیغ، یک حرف اضافی به عنوان جایزه نمایش داده میشود.


۷. رویدادهای برنامه را اضافه کنید
برای درک عمیقتر سفر کاربر در مسابقه طراحی فوقالعاده، چند رویداد سفارشی تعریف خواهید کرد که رفتار کاربر را در بازی به شرح زیر ردیابی میکنند:
نام رویداد | تحریک شده... | پارامترها |
شروع_بازی | وقتی کاربر یک بازی جدید را شروع میکند | هیچ کدام |
سطح_شروع | وقتی کاربر یک مرحله جدید (یک مسابقه نقاشی جدید) را در یک مرحله شروع میکند. (در یک مرحله 6 مرحله وجود دارد) | نام_سطح |
سطح_پاسخ_اشتباه | وقتی کاربر پاسخ اشتباهی ارسال میکند | نام_سطح |
ad_reward_prompt | وقتی کاربر دکمهی راهنما را لمس میکند و از او خواسته میشود یک تبلیغ ویدیویی جایزهدار را تماشا کند | شناسه_واحد_تبلیغاتی |
نمایش_پاداش_تبلیغات | وقتی کاربر شروع به تماشای یک تبلیغ ویدیویی جایزهدار میکند | شناسه_واحد_تبلیغاتی |
موفقیت_سطحی | وقتی کاربر پاسخ صحیحی ارسال میکند (یک مرحله را تمام میکند) | نام سطح، تعداد تلاشها، زمان سپریشده، نکتهی استفادهشده |
سطح_شکست | وقتی کاربر از یک مرحله رد میشود | نام سطح، تعداد تلاشها، زمان سپریشده، نکتهی استفادهشده |
بازی_کامل | وقتی بازی تمام شد | تعداد_پاسخهای_صحیح |
شرح هر پارامتر مرتبط با هر رویداد به شرح زیر است:
نام رویداد | نام پارامتر | توضیحات |
سطح_شروع | نام_سطح | نام نقاشی نشان داده شده در مرحله (مثلاً «موز») |
سطح_پاسخ_اشتباه | نام_سطح | وقتی کاربر پاسخ اشتباهی ارسال میکند |
ad_reward_prompt | شناسه_واحد_تبلیغاتی | شناسه واحد تبلیغاتی که برای نمایش یک تبلیغ ویدیویی جایزهدار استفاده میشود |
نمایش_پاداش_تبلیغات | شناسه_واحد_تبلیغاتی | شناسه واحد تبلیغاتی که برای نمایش یک تبلیغ ویدیویی جایزهدار استفاده میشود |
موفقیت_سطحی | نام_سطح | نام نقاشی نشان داده شده در مرحله (مثلاً «موز») |
موفقیت_سطحی | تعداد_تلاشها | تعداد تلاشهای انجام شده برای عبور از یک مرحله |
موفقیت_سطحی | زمان_سپری_شده_ثانیه | زمان سپری شده برای عبور از یک سطح، بر حسب ثانیه |
موفقیت_سطحی | hint_used | اینکه آیا کاربر از راهنمایی (تماشا کردن یک تبلیغ ویدیویی جایزهدار) برای عبور از یک مرحله استفاده کرده یا نه (۱: از راهنمایی استفاده کرده / ۰: بدون راهنمایی مرحله را عبور داده است) |
سطح_شکست | نام_سطح | نام نقاشی نشان داده شده در مرحله (مثلاً «موز») |
سطح_شکست | تعداد_تلاشها | تعداد تلاشهای انجام شده برای عبور از یک مرحله |
سطح_شکست | زمان_سپری_شده_ثانیه | زمان سپری شده برای عبور از یک سطح، بر حسب ثانیه |
سطح_شکست | hint_used | اینکه آیا کاربر از راهنمایی (تماشا کردن یک تبلیغ ویدیویی جایزهدار) برای عبور از یک مرحله استفاده کرده یا نه (۱: از راهنمایی استفاده کرده / ۰: بدون راهنمایی مرحله را عبور داده است) |
بازی_کامل | تعداد_پاسخهای_صحیح | تعداد مراحل طی شده در بازی |
ایجاد یک کلاس کمکی برای ثبت رویدادهای سفارشی
برای ثبت آسان رویداد تحلیلی، یک کلاس کمکی برای مدیریت رویدادهای سفارشی ایجاد خواهید کرد.
ابتدا، یک فایل کاتلین جدید (نه یک کلاس کاتلین) ایجاد کنید و نام آن را 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"
در مرحله بعد، توابع افزونهای را اضافه کنید که به شما در ثبت رویدادهای سفارشی در بازیتان کمک میکنند. توجه داشته باشید که اکثر رویدادهای سفارشی شامل پارامترهایی هستند تا بتوانید اطلاعات بیشتری از هر رویداد داشته باشید. همچنین توجه داشته باشید که چند نام رویداد و پارامتر ( FirebaseAnalytics.Event.LEVEL_NAME و FirebaseAnalytics.Event.LEVEL_START ) از قبل توسط Analytics تعریف شدهاند، بنابراین ما از آنها استفاده خواهیم کرد.
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 انجام دادید.
آزمون نقاشی فوقالعادهViewModelFactory.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)
...
}
۸. اشکالزدایی رویدادهای تحلیلی
شما میتوانید از DebugView در کنسول Firebase برای تأیید صحت ثبت رویدادها استفاده کنید. DebugView به شما این امکان را میدهد که دادههای خام رویدادهای ثبت شده توسط برنامه خود را در دستگاههای توسعه تقریباً به صورت بلادرنگ مشاهده کنید.
این برای اهداف اعتبارسنجی در طول مرحله ابزار دقیق توسعه بسیار مفید است و میتواند به شما در کشف هرگونه خطا در پیادهسازی تحلیلیتان کمک کند.
فعال کردن حالت اشکالزدایی
بهطورکلی، رویدادهای ثبتشده در برنامه شما در طول یک دوره تقریباً یک ساعته دستهبندی شده و با هم آپلود میشوند. برای اعتبارسنجی پیادهسازی تحلیلی خود در لحظه، باید حالت اشکالزدایی (Debug mode) را در دستگاه توسعه خود فعال کنید تا رویدادها با حداقل تأخیر آپلود شوند.
برای فعال کردن حالت اشکالزدایی، مراحل زیر را انجام دهید:
- پنجره ابزار ترمینال را در اندروید استودیو باز کنید ( View > Tool Windows > Terminal ).

- دستور زیر را اجرا کنید (مطمئن شوید که دستگاه اندروید آزمایشی به رایانه شما متصل است یا شبیهساز اندروید در حال اجرا است):
adb shell setprop debug.firebase.analytics.app com.codelab.awesomedrawingquiz
این رفتار تا زمانی که حالت اشکالزدایی را با اجرای دستور زیر غیرفعال کنید، ادامه مییابد:
adb shell setprop debug.firebase.analytics.app .none.
اشکالزدایی رویدادهای تحلیلی با DebugView
پس از فعال کردن حالت اشکالزدایی (Debug mode) در دستگاه آزمایشی خود، به پروژه خود در کنسول Firebase بروید و از منو ، Analytics > DebugView را انتخاب کنید. سپس، در دستگاه آزمایشی خود، بازی خود را اجرا کنید تا رویدادهای ثبت شده و نمایش داده شده در گزارش DebugView را مشاهده کنید.

شما میتوانید با کلیک روی نام هر رویداد، به اطلاعات دقیقی در مورد آن دسترسی پیدا کنید. به عنوان مثال، تصویر زیر جزئیات پارامترهای مرتبط با رویداد level_start را نشان میدهد.

برای جزئیات بیشتر، لطفاً به مقاله مرکز راهنمای DebugView مراجعه کنید.
۹. ابعاد و معیارهای سفارشی را فعال کنید
به طور پیشفرض، گوگل آنالیتیکس برای فایربیس تعداد کل رویدادها را جمعآوری میکند. برای هر پارامتر رویدادی که به آن علاقهمند هستید، باید گزارشدهی آن پارامتر را به طور صریح فعال کنید. سپس گوگل آنالیتیکس برای فایربیس میتواند کارتهای اضافی را برای نمایش آمار پارامترهای سفارشی نمایش دهد.
برای ثبت ابعاد و معیارهای سفارشی:
- به کنسول فایربیس بروید و پروژه Awesome Drawing Quiz که قبلاً ایجاد کردهاید را انتخاب کنید.
- از منوی پیمایش، روی Analytics > Events کلیک کنید.
- روی مدیریت تعاریف سفارشی کلیک کنید.
- در برگه ابعاد سفارشی، روی ایجاد ابعاد سفارشی کلیک کنید.
- در فیلد نام پارامتر رویداد، level_name را وارد کنید و برای تکمیل ثبت پارامتر، روی ذخیره کلیک کنید.

- سپس، برگه «اندازهگیریهای سفارشی» را انتخاب کرده و روی «ایجاد اندازهگیریهای سفارشی» کلیک کنید.
- نام پارامتر، واحد اندازهگیری برای پارامترهای زیر را وارد کنید.
نام پارامتر | نوع پارامتر | واحد اندازهگیری |
تعداد_تلاشها | شماره | استاندارد |
hint_used | شماره | استاندارد |
زمان_سپری_شده_ثانیه | شماره | ثانیهها |
تعداد_پاسخهای_صحیح | شماره | استاندارد |
۱۰. از گزارش رویداد، بینش کسب کنید
همانطور که چند رویداد به بازی اضافه کردهاید، باید بتوانید به سوالات مربوط به رفتار کاربر در بازی پاسخ دهید. در اینجا چند بینش وجود دارد که میتوانید از گزارش رویدادهای Firebase به دست آورید.
کدام سطح بیشترین تعداد پاسخهای اشتباه را دارد؟
برای پاسخ به این سوال، باید بدانید که در هر سطح، چند رویداد level_wrong_answer فعال شده است.
روی level_wrong_answer از گزارش رویدادها کلیک کنید. در گزارش رویداد level_wrong_answer ، کارت level_name پیدا کنید. مقادیر مرتبط با پارامتر level_name را روی آن کارت به شرح زیر مشاهده خواهید کرد.

طبق تصویر بالا، به راحتی میتوانید متوجه شوید که افق بیشترین تعداد پاسخهای اشتباه را دارد، که به این معنی است که در مقایسه با سایر سطوح، برای کاربران دشوارتر است.
با استفاده از بینشی که از اینجا به دست آوردهاید، میتوانید تصمیم بگیرید که سطوح دشوار را برای کاربران تازهکار ارائه ندهید تا نرخ ماندگاری بالایی داشته باشید.
به طور متوسط چند بار تلاش برای عبور از یک مرحله انجام شده است؟
در مسابقه نقاشی فوقالعاده ، کاربران میتوانند پاسخ هر سطح را به هر تعداد که میخواهند ارسال کنند.
از آنجا که گزارش پارامتر را برای پارامتر number_of_attempts در رویداد level_success فعال کردهاید، میتوانید معیارهای دقیق آن پارامتر را مشاهده کنید.
روی رویداد level_success از گزارش رویدادها کلیک کنید. در گزارش رویداد level_success ، کارت number_of_attemps را پیدا کنید. میانگین تعداد تلاشها روی آن کارت را به شرح زیر مشاهده خواهید کرد:

شما میتوانید از بینش اینجا برای بهینهسازی میانگین سختی بازی استفاده کنید. برای مثال، اگر میانگین تعداد تلاشها خیلی نزدیک به ۱ باشد، میتوانید بازی را کمی چالشبرانگیزتر کنید.
آیا کاربران سعی کردند با دریافت راهنمایی، سوال را حل کنند، حتی اگر در نهایت نتوانستند از یک مرحله عبور کنند؟
وقتی کاربر تصمیم میگیرد از یک مرحله صرف نظر کند، رویداد level_fail فعال میشود. دلایل زیادی میتواند برای این تصمیم کاربر وجود داشته باشد.
با این حال، از آنجایی که بازی میتواند پس از تماشای یک تبلیغ ویدیویی جایزهدار به آنها راهنمایی بدهد، مهم است بدانیم که آیا کاربر سعی کرده است با کمک راهنمایی، مرحله را تمام کند یا خیر.
روی رویداد level_fail از گزارش رویدادها کلیک کنید. در گزارش رویداد level_fail ، کارت hint_used را پیدا کنید. میانگین تعداد پارامترهای رویداد hint_used را مشاهده خواهید کرد. توجه داشته باشید که اگر از hint استفاده شده باشد، مقدار پارامتر ۱ و اگر از hint استفاده نشده باشد، ۰ است.

اگر اعداد روی کارت hint_used نزدیک به ۰ باشد، نشان میدهد که پاداش (هینت) به اندازه کافی برای این کاربران مفید نیست. همچنین، شما فرصت افزایش درآمد از یک تبلیغ ویدیویی پاداشدار را از دست میدهید.
بنابراین، شما باید پاداش بزرگتری را در نظر بگیرید تا کاربران بتوانند عمیقتر با بازی درگیر شوند و درآمد شما از تبلیغات ویدیویی پاداشی افزایش یابد.
به طور متوسط در هر بازی چند مرحله طی شد؟
در مجموع ۶ مرحله برای هر بازی در مسابقه نقاشی فوقالعاده وجود دارد. زمانی که کاربر ۶ مرحله را تمام کند (مهم نیست که هر مرحله را کامل کرده یا رد شده باشد)، یک رویداد game_complete با پارامتر number_of_correct_answers فعال میشود. پارامتر number_of_correct_answers تعداد مراحلی را که کاربر پاسخ صحیح ارائه داده است، نشان میدهد.
روی رویداد game_complete از گزارش رویدادها کلیک کنید. در گزارش رویداد game_complete، کارت number_of_correct_answers پیدا کنید. میانگین تعداد پارامترهای رویداد number_of_correct_answers مشاهده خواهید کرد.

اگر میانگین تعداد مراحل گذرانده شده خیلی کم است، باید چیدمان مراحل بازی را تغییر دهید تا به افراد کمک کنید مراحل قبلی را راحتتر تمام کنند و بتوانند بدون از دست دادن علاقه به بازی شما ادامه دهند.
۱۱. همه چیز تمام شد!
شما Codelab اندروید AdMob+Firebase 101 را تکمیل کردهاید. میتوانید کد تکمیلشده برای این Codelab را در اینجا پیدا کنید.
پوشهی پایهی ۱۰۱-complete_and_102 .
در بخش بعدی از آزمایشگاه کد AdMob+Firebase، یاد خواهید گرفت که چگونه از یک قیف برای تجسم جریان رویداد برنامه استفاده کنید. بخش بعدی همچنین نحوه استفاده از Remote Config و تست A/B را برای بهینهسازی مقدار پارامتر در بازی بدون بهروزرسانی برنامه پوشش خواهد داد.