يقدّم إصدار حزمة SDK Firebase C++ 9.1.0 حزمة SDK جديدة لإعلانات Google على الأجهزة الجوّالة مبنية على لغة C++.
حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة هي واجهة برمجة تطبيقات جديدة تتضمن التغيُّرات العميقة الرئيسية التي تم إجراؤها على حِزم تطوير البرامج (SDK) لـ Firebase AdMob C++ لنظامَي التشغيل iOS وAndroid في عامَي 2021 و2022، بما في ذلك إزالة واجهات برمجة التطبيقات المتوقّفة نهائيًا، ومسار جديد عند العمل مع أنواع الإعلانات التي تظهر على الشاشة الكاملة.
تم وضع علامة على حزمة تطوير البرامج (SDK) القديمة لـ Firebase AdMob C++ (firebase::admob
) بأنّها متوقّفة نهائيًا،
ولن تتلقّى أي تحديثات أو إصلاحات للأخطاء من الآن فصاعدًا.
ستظلّ كلّ من حزمة تطوير البرامج (SDK) الجديدة لإعلانات Google على الأجهزة الجوّالة (firebase::gma
) وحزمة تطوير البرامج (SDK) القديمة
لـ Firebase AdMob (firebase::admob
) جزءًا من أرشيف
عمليات إنشاء حزمة تطوير البرامج (SDK) Firebase C++ خلال فترة الإيقاف نهائيًا لـ
حزمة تطوير البرامج (SDK) لـ Firebase AdMob.
إزالة واجهة برمجة التطبيقات القديمة
تمت إزالة واجهات برمجة التطبيقات التالية بالكامل من حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة باستخدام لغة C++:
RewardedVideoAd
تم استبدال مساحة الاسم RewardedVideoAd
في AdMob بفئة
RewardedAd
. يعمل الإجراء RewardedAd
بالطريقة نفسها التي يعمل بها الإجراء InterstitialAd
، ولكنه
يتضمّن RewardedAdListener
إضافيًا لتلقّي إشعارات بشأن مكافآت
العناصر.
NativeExpressAds
سبق أن تم وضع علامة على NativeExpressAd
في AdMob على أنّها متوقفة نهائيًا في كلٍّ من
حزمة تطوير البرامج (SDK) لـ Firebase AdMob C++. لذلك، لا يتم تضمين NativeExpressAd
في
حزمة تطوير البرامج (SDK) الجديدة لإعلانات Google على الأجهزة الجوّالة باستخدام لغة C++.
تغيير مساحة اسم حزمة SDK
تم نقل حزمة SDK إلى مساحة اسم جديدة، وهي تتضمّن بنية دليل جديدة:
مساحة الاسم firebase::gma
تقع مصادر حزمة تطوير البرامج (SDK) الجديدة لإعلانات Google على الأجهزة الجوّالة باستخدام لغة C++ في مساحة الاسم firebase::gma
. تم إيقاف مساحة الاسم firebase::admob
القديمة نهائيًا مع
حزمة تطوير البرامج (SDK) لـ Firebase AdMob C++.
بنية الدليل
تم نقل ملفات الرأس إلى دليل جديد داخل أرشيف التصميم:
حزمة تطوير البرامج (SDK) لـ Firebase AdMob C++ المتوقّفة نهائيًا | حزمة تطوير البرامج (SDK) الجديدة لإعلانات Google على الأجهزة الجوّالة باستخدام لغة C++ |
---|---|
include/firebase/admob |
include/firebase/gma |
المكتبة
سيتم توفير حزمة تطوير البرامج (SDK) لـ Firebase AdMob C++ كمكتبة ثابتة ضمن أرشيف حزمة SDK لمحاولة الربط Firebase C++:
iOS
حزمة تطوير البرامج (SDK) لـ Firebase AdMob C++ المتوقّفة نهائيًا | حزمة تطوير البرامج (SDK) الجديدة لإعلانات Google على الأجهزة الجوّالة باستخدام لغة C++ |
---|---|
firebase_admob.xcframework |
firebase_gma.xcframework |
Android
حزمة تطوير البرامج (SDK) لـ Firebase AdMob C++ المتوقّفة نهائيًا | حزمة تطوير البرامج (SDK) الجديدة لإعلانات Google على الأجهزة الجوّالة باستخدام لغة C++ |
---|---|
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)
تُعرِض كلّ وظيفة إعداد حزمة تطوير البرامج "SDK لإعلانات Google على الأجهزة الجوّالة" بتنسيق C++ على الفور مؤشّري حالة:
تنقل المَعلمة الاختيارية out ما إذا كان قد حدث خطأ في التبعية قبل بدء عملية الإعداد.
مَعلمة الإرجاع هي مرجع إلى
firebase::Future
. يحتويFuture
على نتائج الإعداد غير المتزامن لمحوِّلات التوسّط على الجهاز.
على الرغم من أنّه يمكن استدعاء حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة باستخدام لغة C++ لتحميل الإعلانات التي تعرِضها 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 |
حجم إعلان البانر الكامل وفقًا لمعيار Interactive Advertising Bureau (IAB) (468×60 بكسل لا يعتمد على الكثافة) |
AdSize::kLargeBanner |
نسخة أطول من kBanner ، عادةً ما تكون أبعادها 320×100 |
AdSize::kLeaderboard |
حجم إعلان لوحة الصدارة وفقًا لمعيار Interactive Advertising Bureau (IAB) (728×90 بكسل مستقلة الكثافة) |
AdSize::kMediumRectangle |
حجم الإعلان المستطيل المتوسط الذي يحدّده مكتب Interactive Advertising Bureau (IAB) (300×250 بكسل بكثافة مستقلة) |
طرق ثابتة في 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
بنية AdMob على غرار C بصفّة تتضمّن طُرقًا
توفّر تجربة أفضل للمستخدم عند تحديد
قوائم المعلومات المختلفة وإضافتها إليها.
في ما يلي التغييرات البارزة في 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 لإعلانات Google على الأجهزة الجوّالة باستخدام لغة C++ النوع المُدرَج firebase::admob::BannerView::PresentationState
وطريقة المستمع OnPresentationStateChanged
.
في ما يلي طرق بديلة لرصد تغييرات حالة العرض التقديمي في
دورة حياة AdView
:
عدد الأحداث: firebase::admob::BannerView::Listener
OnPresentationStateChanged |
firebase::gma::AdListener نظير |
---|---|
kPresentationStateHidden |
عند استدعاء AdListener::OnAdClosed أو عند
إكمال AdView::Hide() لعمليته غير المتزامنة
بنجاح |
kPresentationStateVisibleWithoutAd |
بلا. ستؤدي محاولة استدعاء AdView::Show() AdView غير المحمَّل
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 | واجهة برمجة التطبيقات لخدمة "إعلانات 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)
|