يتضمّن إصدار حزمة تطوير البرامج (SDK) Firebase C++ 9.1.0 حزمة تطوير برامج (SDK) جديدة بلغة C++ من "إعلانات Google على الأجهزة الجوّالة".
إنّ حزمة تطوير البرامج (SDK) للغة C++ من "إعلانات Google على الأجهزة الجوّالة" هي واجهة برمجة تطبيقات جديدة تتضمّن التغييرات الرئيسية غير المتوافقة التي تم إجراؤها على حِزم تطوير البرامج (SDK) للغة C++ من Firebase AdMob لنظامَي التشغيل iOS وAndroid في عامَي 2021 و2022، بما في ذلك إزالة واجهات برمجة التطبيقات المتوقّفة نهائيًا، ومسار جديد عند استخدام أنواع الإعلانات بملء الشاشة.
تم وضع علامة الإيقاف النهائي على حزمة تطوير البرامج (SDK) القديمة بلغة C++ لمنصة Firebase AdMob (firebase::admob
)، ولن تتلقّى أي تحديثات أو إصلاحات للأخطاء من الآن فصاعدًا.
ستبقى كلّ من حزمة تطوير البرامج (SDK) الجديدة بلغة C++ من "إعلانات Google على الأجهزة الجوّالة" (firebase::gma
) وحزمة تطوير البرامج (SDK) القديمة بلغة C++ من Firebase AdMob (firebase::admob
) جزءًا من أرشيفات الإصدار لحزمة تطوير البرامج (SDK) Firebase C++ خلال فترة إيقاف حزمة تطوير البرامج (SDK) بلغة C++ من Firebase AdMob نهائيًا.
إزالة واجهة برمجة التطبيقات القديمة
تمت إزالة واجهات برمجة التطبيقات التالية بالكامل من حزمة تطوير البرامج (SDK) للغة C++ من "إعلانات Google على الأجهزة الجوّالة".
RewardedVideoAd
تم استبدال مساحة الاسم RewardedVideoAd
في AdMob بالفئة RewardedAd
. يتشابه سلوك RewardedAd
مع سلوك InterstitialAd
، ولكنّه يتضمّن RewardedAdListener
إضافيًا لتلقّي إشعار بمكافآت العناصر.
NativeExpressAds
تمّت الإشارة إلى NativeExpressAd
في AdMob على أنّه متوقّف نهائيًا في كل حزمة Firebase AdMob C++ SDK. لذلك، لا يتم تضمين NativeExpressAd
في حزمة SDK الجديدة لإعلانات Google على الأجهزة الجوّالة الخاصة بتطبيقات C++.
تغيير مساحة اسم حزمة تطوير البرامج (SDK)
تم نقل حزمة تطوير البرامج (SDK) إلى مساحة اسم جديدة، وأصبح لها بنية دليل جديدة:
مساحة الاسم firebase::gma
تتوفّر مصادر حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" الجديدة بلغة C++ في مساحة الاسم firebase::gma
. تم إيقاف مساحة الاسم القديمة firebase::admob
نهائيًا، بالإضافة إلى حزمة تطوير البرامج (SDK) لمنصة Firebase AdMob C++.
بنية الدليل
تم نقل ملفات العناوين إلى دليل جديد داخل أرشيف الإصدار:
حزمة C++ SDK المتوقّفة نهائيًا من Firebase AdMob | حزمة تطوير البرامج الجديدة الخاصة بلغة C++ في "إعلانات Google على الأجهزة الجوّالة" |
---|---|
include/firebase/admob |
include/firebase/gma |
المكتبة
سيتم توفير حزمة تطوير البرامج (SDK) بلغة C++ من Firebase AdMob كمكتبة ثابتة ضمن أرشيف إنشاء حزمة تطوير البرامج (SDK) Firebase C++:
iOS
حزمة C++ SDK المتوقّفة نهائيًا من Firebase AdMob | حزمة تطوير البرامج الجديدة الخاصة بلغة C++ في "إعلانات Google على الأجهزة الجوّالة" |
---|---|
firebase_admob.xcframework |
firebase_gma.xcframework |
Android
حزمة C++ SDK المتوقّفة نهائيًا من Firebase AdMob | حزمة تطوير البرامج الجديدة الخاصة بلغة C++ في "إعلانات Google على الأجهزة الجوّالة" |
---|---|
libfirebase_admob.a |
libfirebase_gma.a |
عمليات نقل البيانات الخاصة بالفئات والتعدادات والبُنى
يسرد الجدول أدناه فئات وتعدادات وبنيات محددة تم تغييرها أو إزالتها. في ما يلي ملخّص:
- تمت إعادة تسمية
BannerView
إلىAdView
. - تمت إزالة
NativeAdExpressView
. - يتم استبدال مساحة الاسم
RewardedVideo
بالفئةRewardedAd
. - تمت إزالة التعداد
PresentationState
وأدوات المعالجة واستبدالها بالتعدادAdListener
وأدوات المعالجةFullScreenContent
. تتم إزالة المَعلمات التالية كمَعلمات إعداد لكل إعلان في
AdRequests
:- إعداد أرقام تعريف الأجهزة الاختبارية
- استهداف الإعلانات حسب العمر
بدلاً من ذلك، يمكن الآن ضبط هذه المَعلمات في
RequestConfiguration
، وهو إعداد عام سيؤثر في جميع عمليات تحميل الإعلانات اللاحقة.
تم إيقافها نهائيًا firebase::admob namespace |
firebase::gma namespace جديدة |
---|---|
AdSizeType (تعداد) |
AdSize::Type (تعداد) |
BannerView |
AdView |
BannerView::Listener |
AdListener AdViewBoundingBoxListener PaidEventListener |
BannerView::Position |
AdView::Position |
BannerView::PresentationState |
تمت الإزالة |
ChildDirectedTreatmentState |
RequestConfiguration::TagForChildDirectedTreatment |
Gender (تعداد) |
تمت الإزالة |
InterstitialAd::Listener |
FullScreenContentListener PaidEventListener |
KeyValuePair |
تمت الإزالة |
NativeExpressAdView |
تمت الإزالة |
PollableRewardListener |
تمت الإزالة |
RewardItem |
AdReward |
RewardedVideoAd (مساحة الاسم) |
RewardedAd (الصف) |
RewardedVideoAd::Listener |
FullScreenContentListener PaidEventListener UserEarnedRewardListener |
AdMobError (تعداد) |
AdErrorCode (تعداد) |
RewardItem |
AdReward |
إعداد حزمة تطوير البرامج (SDK)
تعرض كل دالة تهيئة لحزمة تطوير البرامج C++ لإعلانات Google على الأجهزة الجوّالة مؤشّرَي حالة على الفور، وهما:
تعرض مَعلمة اختيارية ما إذا حدث خطأ في التبعية قبل بدء عملية الإعداد.
مَعلمة الإرجاع هي مرجع إلى
firebase::Future
. يحتويFuture
على نتائج الإعداد غير المتزامن لبرامج التكيّف الخاصة بالتوسّط على الجهاز.
مع أنّه يمكن استدعاء حزمة تطوير البرامج (SDK) الخاصة بتطبيقات C++ من "إعلانات Google على الأجهزة الجوّالة" لتحميل الإعلانات التي تعرضها AdMob فور انتهاء وظيفة الإعداد، لن تعرض شبكات الإعلانات الأخرى إعلانات إلى أن يتم إعداد مهايئ التوسّط الخاص بها بالكامل. وتتم هذه العملية بشكل غير متزامن. لذلك، إذا كنت تستخدم التوسّط في عرض الإعلانات في تطبيقك، ننصحك بالانتظار إلى أن يتم حلّ الخطأ Future
قبل محاولة تحميل أي إعلانات.
قبل
firebase::App* app = ::firebase::App::Create();
firebase::InitResult result = firebase::admob::Initialize(*app, kAdMobAppID);
if (result != kInitResultSuccess) {
// Initialization immediately failed, most likely due to a missing dependency.
// Check the device logs for more information.
return;
}
بعد
using firebase::App;
using firebase::Future;
using firebase::gma::AdapterInitializationStatus;
App* app = ::firebase::App::Create();
firebase::InitResult result;
Future<AdapterInitializationStatus> future =
firebase::gma::Initialize(*app, &result);
if (result != kInitResultSuccess) {
// Initialization immediately failed, most likely due to a missing dependency.
// Check the device logs for more information.
return;
}
// Poll the future to wait for its completion either in this
// thread, or as part of your game loop by calling
// firebase::gma::InitializeLastResult();
while (future.status() == firebase::kFutureStatusPending) {
// Initialization on-going, continue to wait.
}
// future.status() is either kFutureStatusComplete or there’s an error
if (future.status() == firebase::kFutureStatusComplete &&
future.error() == firebase::gma::AdErrorCodeNone) {
AdapterInitializationStatus* status = future.result();
// Check status for any mediation adapters you wish to use.
// ..
} else {
// Handle initialization error.
}
التغييرات في AdSize
ضمن AdView
يحتوي AdSize
الآن على عناصر ثابتة لأحجام إعلانات البانر الشائعة، ويتوافق مع أحجام الإعلانات AnchorAdaptive
وInlineAdaptive
التي لها ارتفاع ديناميكي استنادًا إلى العرض المحدّد واتجاه الشاشة الحالي.
تمت إضافة ثوابت AdSize ثابتة إلى firebase::gma::AdSize |
|
---|---|
AdSize::kBanner |
حجم إعلان البانر الخاص بـ "رابطة التسويق عبر الأجهزة الجوّالة" (MMA) (320×50 بكسل مستقل الكثافة) |
AdSize::kFullBanner |
حجم إعلان البانر الكامل الصادر عن مكتب الإعلانات التفاعلية (IAB) (468x60 بكسل مستقل الكثافة) |
AdSize::kLargeBanner |
نسخة أطول من kBanner ، وعادةً ما تكون 320x100 |
AdSize::kLeaderboard |
حجم إعلان الليدربورد الذي يحدّده مكتب الإعلانات التفاعلية (IAB) (728×90 وحدة بكسل مستقلة الكثافة) |
AdSize::kMediumRectangle |
حجم إعلان المستطيل المتوسط الذي يحدّده مكتب IAB (300x250 بكسل مستقل الكثافة) |
طُرق ثابتة في firebase::gma::AdSize للمساعدة في إنشاء مثيلات من AdSize |
|
---|---|
GetLandscapeAnchoredAdaptiveBannerAdSize |
تُنشئ هذه السمة AdSize بالعرض المحدّد وارتفاع محسّن من Google لإنشاء إعلان بانر في الوضع الأفقي. |
GetPortraitAnchoredAdaptiveBannerAdSize |
تنشئ هذه الطريقة AdSize بالعرض المحدّد وارتفاع محسّن من Google لإنشاء إعلان بانر في الوضع العمودي. |
GetCurrentOrientationAnchoredAdaptiveBannerAdSize |
تنشئ هذه الطريقة عنصر AdSize بالعرض المحدّد وارتفاع
محسَّن من Google لإنشاء إعلان بانر حسب الاتجاه الحالي. |
GetInlineAdaptiveBannerAdSize |
تُنشئ هذه الطريقة AdSize الأنسب لإعلانات البانر، مع تحديد الحد الأقصى للارتفاع.
تسمح هذه السمة |
GetLandscapeInlineAdaptiveBannerAdSize |
تنشئ هذه الطريقة InlineAdaptive AdSize بالعرض المحدّد وارتفاع الجهاز في الوضع الأفقي |
GetPortraitInlineAdaptiveBannerAdSize |
تنشئ هذه السمة InlineAdaptive AdSize بالعرض المحدّد وارتفاع الوضع العمودي للجهاز. |
GetCurrentOrientationInlineAdaptiveBannerAdSize |
طريقة ملائمة لعرض InlineAdaptive
AdSize بالنظر إلى اتجاه الواجهة الحالي مع عرض
محدّد. |
قبل
firebase::admob::BannerView* banner_view = new firebase::admob::BannerView();
firebase::admob::AdSize ad_size;
ad_size.ad_size_type = firebase::admob::kAdSizeStandard;
ad_size.width = 320;
ad_size.height = 50;
// ad_parent is a reference to an iOS UIView or an Android Activity.
// banner_ad_unit is your ad unit id for banner ads.
banner_view->Initialize(ad_parent, banner_ad_unit, ad_size);
بعد
firebase::gma::AdView* ad_view = new firebase::gma::AdView();
// ad_parent is a reference to an iOS UIView or an Android Activity.
// banner_ad_unit is your ad unit id for banner ads.
banner_view->Initialize(ad_parent, banner_ad_unit, firebase::gma::AdSize.kBanner);
AdRequest
والإعدادات العامة
تمت إزالة أرقام تعريف الأجهزة الاختبارية، TagForChildDirectedTreatment
وTagForUnderAgeOfConsent
(التي كانت تتم معالجتها سابقًا حسب تاريخ الميلاد) من AdRequest
، وأصبحت الآن جزءًا من RequestConfiguration
عالمي. يمكن أن تستدعي التطبيقات
firebase::gma::SetRequestConfiguration()
في وقت مبكر من
دورة حياة التطبيق لضبط هذه القيم. بعد ضبط هذه الإعدادات، سيتم الالتزام بها في جميع عمليات تحميل الإعلانات اللاحقة.
لا يزال firebase::gma::AdRequest
متوفّرًا لأنّه يقدّم معلومات سياقية لتحميل الإعلانات، بما في ذلك الكلمات الرئيسية وعنوان URL اختياري للمحتوى.
تم استبدال بنية AdRequest
C-style في AdMob بفئة تتضمّن طرقًا
توفّر تجربة أفضل للمستخدم عند تحديد القوائم المختلفة للمعلومات وإلحاقها بها.
في ما يلي AdRequest
التغييرات البارزة:
- أصبحت البيانات الإضافية مرتبطة الآن باسم فئة محوّل التوسّط. يجب أن تستخدم البيانات الإضافية التي يتم إرسالها إلى خدمة AdMob اسم الفئة التلقائي على النحو المحدّد أدناه.
- عند طلب إعلان، قد تمرّر التطبيقات عنوان URL للمحتوى الذي تعرضه. يتيح ذلك استهداف الكلمات الرئيسية لمطابقة الإعلان مع المحتوى الآخر الذي يتم عرضه.
قبل
firebase::admob::AdRequest request;
// Keywords to be used in targeting.
const char* keywords[] = {"GMA", "C++", "Fun"};
request.keyword_count = sizeof(keywords) / sizeof(keywords[0]);
request.keywords = keywords;
// "Extra" key value pairs.
static const firebase::admob::KeyValuePair extras[] = {
{"extra_name", "extra_value"}};
request.extras_count = sizeof(extras) / sizeof(extras[0]);
request.extras = kRequestExtras;
// Devices that should be served test ads.
const char* test_device_ids[] ={ "123", "4567", "890" };
request.test_device_id_count =
sizeof(test_device_ids) / sizeof(test_device_ids[0]);
request.test_device_ids = test_device_ids;
// Sample birthday to help determine the age of the user.
request.birthday_day = 10;
request.birthday_month = 11;
request.birthday_year = 1975;
// Load Ad with the AdRequest.
بعد
// Do once after Google Mobile Ads C++ SDK initialization.
// These settings will affect all Ad Load operations.
firebase::gma::RequestConfiguration configuration;
configuration.max_ad_content_rating =
firebase::gma::RequestConfiguration::kMaxAdContentRatingPG;
configuration.tag_for_child_directed_treatment =
firebase::gma::RequestConfiguration::kChildDirectedTreatmentTrue;
configuration.tag_for_under_age_of_consent =
firebase::gma::RequestConfiguration::kUnderAgeOfConsentFalse;
configuration.test_device_ids.push_back("1234");
configuration.test_device_ids.push_back("4567");
configuration.test_device_ids.push_back("890");
firebase::gma::SetRequestConfiguration(configuration);
// Then, more information must be provided via an AdRequest when
// loading individual ads.
firebase::gma::AdRequest ad_request;
// "Extra" key value pairs.
ad_request.add_keyword("GMA");
ad_request.add_keyword("C++");
ad_request.add_keyword("Fun");
// Content URL.
ad_request.set_content_url("www.example.com");
// Mediation Adapter Extras.
#if defined(Android)
const char* ad_network_extras_class_name =
"com/google/ads/mediation/admob/AdMobAdapter";
#else // iOS
const char* ad_network_extras_class_name = "GADExtras";
#endif
ad_request.add_extra(ad_network_extras_class_name, "extra_name", "extra_value");
// Load Ad with the AdRequest. See next section.
AdResults
تعرض LoadAd
الآن Future
يحتوي على عنصر AdResult
لجميع أنواع الإعلانات AdView
وInterstitialAd
وRewardedAd
. تعرض الطريقة
AdResult::is_successful
القيمة true
إذا تم تنفيذ طلب الإعلان
بنجاح، أو false
إذا لم يتم تنفيذه.
في حال حدوث خطأ، يحتوي AdResult
على عنصر AdError
يتضمّن معلومات على مستوى الخدمة حول المشكلة، بما في ذلك رمز الخطأ ورسالة الخطأ وسلاسل النطاقات.
قبل
firebase::Future<AdResult> future;
void load_ad() {
// Assume an already created AdRequest object.
future = ad_view->LoadAd(ad_request);
}
void your_game_loop() {
if (future.status() == firebase::kFutureStatusComplete) {
if(future.error() != firebase::admob::kAdMobErrorNone) {
// There was either an internal SDK issue that caused the Future to
// fail its completion, or AdMob failed to fulfill the ad request.
// Details are unknown other than the Future’s error code returned
// from future.error().
} else {
// The ad loaded successfully.
}
}
}
بعد
firebase::Future<AdResult> future;
void load_ad() {
// Assumes a previously created AdRequest object.
// See "AdRequest and Global Configuration" above.
future = ad_view->LoadAd(ad_request);
}
void your_game_loop() {
// Check the future status in your game loop:
if (future.status() == firebase::kFutureStatusComplete) {
if(future.error() != firebase::admob::kAdErrorCodeNone) {
// There was an internal SDK issue that caused the Future to fail.
} else {
// Future completed successfully. Check the GMA result.
const AdResult* ad_result = future.result();
if ( ad_result->is_successful() != true ) {
// GMA failed to serve an ad. Gather information about the error.
const AdError& ad_error = ad_result->ad_error();
AdErrorCode error_code = ad_error.code();
const std::string error_domain = ad_error.domain();
const std::string error_message = ad_error.message();
} else {
// The ad loaded successfully.
}
}
}
}
AdListener
حدث ضمن AdView
تم استبدال الفئة BannerView::Listener
في AdMob بفئتَي مستمعين مختلفتَين في حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" بلغة C++:
- يتتبّع
AdListener
أحداث دورة حياة الإعلان وتفاعُل المستخدم. - يتم استدعاء
AdViewBoundingBoxListener
عند تغيير حجمAdView
أو نقله.
عمليات ربط OnPresentationStateChanged
دالة ردّ الاتصال Google Mobile Ads في AdMob
لا يتضمّن الإصدار الجديد من حزمة تطوير البرامج (SDK) للغة C++ من "إعلانات Google على الأجهزة الجوّالة" firebase::admob::BannerView::PresentationState
النوع المُعدَّد
وطريقة OnPresentationStateChanged
المستمع.
في ما يلي طرق بديلة لرصد التغييرات في حالة العرض التقديمي في دورة حياة AdView
:
عدد الأحداث: firebase::admob::BannerView::Listener
OnPresentationStateChanged |
firebase::gma::AdListener جهة مقابلة |
---|---|
kPresentationStateHidden |
عند استدعاء AdListener::OnAdClosed أو عند إكمال AdView::Hide() لعملية غير متزامنة بنجاح |
kPresentationStateVisibleWithoutAd |
بلا. ستؤدي محاولة استدعاء AdView::Show() غير محملة
AdView إلى حدوث خطأ. |
kPresentationStateVisibleWithAd |
عند استدعاء AdListener::OnAdOpened أو عند إكمال AdView::Show() لعمليته غير المتزامنة بنجاح مع إعلان |
kPresentationStateOpenedPartialOverlay |
استعلم عن المربّع المحيط بعد استدعاء AdListener::OnAdOpened() لتحديد حجم الإعلان المعروض وموضعه.
كحلّ بديل، يمكنك الاستعلام عن موضع AdView وAdSize و/أو مراقبة المربّع المحيط باستخدام AdViewBoundingBoxListener . |
kPresentationStateCoveringUI |
kPresentationStateOpenedPartialOverlay أعلاه |
RewardedAd
هو الآن صف
كانت حزمة تطوير البرامج (SDK) المتوقّفة نهائيًا لمنصة Firebase AdMob C++ تسهّل عرض الإعلانات مقابل مكافأة من خلال مجموعة من الدوال في مساحة الاسم firebase::admob::rewarded_ad
. تم دمج هذه الدوال في فئة RewardedAd
جديدة تعرض الإعلانات باستخدام مساحة واجهة برمجة تطبيقات مشابهة لمساحة InterstitialAd
(راجِع القسم التالي).
المستمعون إلى InterstitialAd
وRewardedAd
يتم تصنيف كلّ من الإعلانات البينية والإعلانات مقابل مكافأة كإعلانات بملء الشاشة. يمكن تثبيت FullScreenContentListener
جديد للاستماع إلى أحداث دورة حياة الإعلان لهذه الأنواع من الإعلانات، ويمكن تثبيت PaidEventListener
منفصل لتتبُّع الوقت الذي اعتبرت فيه خدمة AdMob أنّه قد وقع حدث مدفوع.
تحتوي RewardedAd
على أداة معالجة إضافية لتتبُّع أحداث المكافآت التي يحصل عليها المستخدم.
طُرق جديدة لردّ الاتصال في الإعلانات بملء الشاشة
FullScreenContentListener طرق |
PaidEventListener طرق |
UserEarnedRewardListener طرق |
---|---|---|
OnAdClicked |
OnPaidEvent |
OnUserEarnedReward |
OnAdDismissedFullScreenContent |
||
OnAdFailedToShowFullScreenContent |
||
OnAdImpression |
||
OnAdShowedFullScreenContent |
تم تغيير الطرق أو إزالتها أو استبدالها
يسرد الجدول أدناه الطرق المحدّدة التي تم تغييرها في حزمة تطوير البرامج (SDK) الجديدة لإعلانات Google على الأجهزة الجوّالة بلغة C++. ستبقى الطرق التي تتضمّن المَعلمات المُدرَجة، ولكن تم تغيير تواقيعها.
الفئة | Firebase AdMob C++ SDK API | واجهة برمجة التطبيقات لحزمة تطوير البرامج (SDK) الخاصة بـ "إعلانات Google على الأجهزة الجوّالة" بلغة C++ | ملاحظات |
---|---|---|---|
BannerView
|
MoveTo
|
AdView::SetPosition
|
|
presentation_state
|
تمت الإزالة | يتم التعامل معها من خلال أحداث AdViewListener ونتائج AdView::Show وAdView::Hide المستقبلية.
|
|
SetListener
|
AdView::SetAdListener AdView::SetBoundingBoxListener AdView::SetPaidEventListener |
يؤدي تصميم أداة المعالجة الجديدة إلى زيادة دقة رصد أحداث دورة الحياة AdView .
|
|
Listener::OnPresentationStateChanged
|
تمت الإزالة | راجِع BannerView::SetListener أعلاه.
|
|
Listener::OnBoundingBoxChanged
|
AdViewBoundingBoxListener::OnBoundingBoxChanged
|
||
InterstitialAd | Initialize(AdParent parent, const char* ad_unit_id)
|
Initialize(AdParent parent)
|
أصبحت المَعلمة ad_unit_id الآن جزءًا من العملية LoadAd .
|
LoadAd(const AdRequest& request)
|
LoadAd(const char* ad_unit_id, const AdRequest& request)
|
||
presentation_state
|
تمت الإزالة | تمت إزالة التعداد presentation_state . استخدِم
FullScreenContentListener .
|
|
SetListener
|
SetFullScreenContentListener SetPaidEventListener
|
||
Destroy
|
تمت الإزالة | أصبح تنظيف الموارد جزءًا من أداة التدمير RewardedAd .
|
|
RewardedAd (بشكل رسمي RewardedVideoAd )
|
Initialize
|
Initialize(AdParent parent)
|
كانت القيمة AdParent تُمرَّر سابقًا إلى Show ، ولكنها أصبحت الآن جزءًا من عملية الإعداد.
|
presentation_state
|
تمت الإزالة | تمت إزالة التعداد presentation_state . استخدِم
FullScreenContentListener .
|
|
SetListener
|
SetFullScreenContentListener SetPaidEventListener
Show
|
يتم أيضًا تحديد UserEarnedReward مستمع عند عرض
RewardedAd . يُرجى مراجعة القسم أدناه.
|
|
Show(AdParent parent)
|
Show(UserEarnedRewardListener* listener)
|