وقتی ظهوری رخ میدهد، Google Mobile Ads SDK گرداننده رویداد پولی را با دادههای درآمد مربوط به آن فراخوانی میکند. با پیادهسازی این مدیریتکننده، میتوانید از دادهها برای محاسبه مقدار طول عمر کاربر استفاده کنید یا دادهها را به سیستمهای مرتبط دیگر ارسال کنید.
این راهنما برای کمک به شما در پیادهسازی ضبط دادههای LTV در برنامه iOS شما طراحی شده است.
پیشنیازها
- مطمئن شوید که ویژگی درآمد آگهی در سطح ظهور را در میانای کاربری AdMob فعال کردهاید.
- Google Mobile Ads SDK نسخه ۹.۱۰.۰ یا بالاتر را وارد کنید.
- Google Mobile Ads SDK را راهاندازی کنید.
قبلاز اینکه بتوانید درآمد آگهی در سطح ظهور دریافت کنید، باید حداقل یک قالب آگهی را پیادهسازی کنید:
پیادهسازی مدیریتکننده رویداد پولی
هر قالب آگهی دارای ویژگی paidEventHandler از نوع
GADPaidEventHandler است.
درطول چرخه حیات رویداد آگهی، Google Mobile Ads SDK رویدادهای ظهور را پایش میکند و گرداننده را با مقدار کسبشده فراخوانی میکند.
نمونه زیر رویدادهای پولی را برای آگهی پاداشدار مدیریت میکند:
Swift
rewardedAd?.paidEventHandler = { adValue in
// TODO: Send the impression-level ad revenue information to your preferred
// analytics server directly within this callback.
// Extract the impression-level ad revenue data.
let value = adValue.value
let currencyCode = adValue.currencyCode
let precision = adValue.precision
print(
"Ad paid event. Value: \(value) \(currencyCode), with precision: \(precision)."
)
}
آبجکتیو-سی
rewardedAd.paidEventHandler = ^(GADAdValue *_Nonnull adValue) {
// TODO: Send the impression-level ad revenue information to your preferred
// analytics server directly within this callback.
// Extract the impression-level ad revenue data.
NSDecimalNumber *value = adValue.value;
NSString *currencyCode = adValue.currencyCode;
GADAdValuePrecision precision = adValue.precision;
NSLog(@"Ad paid event. Value: %@ %@, with precision: %ld.", value, currencyCode,
(long)precision);
};
نام منبع آگهی رویداد سفارشی را شناسایی کنید
برای منابع آگهی رویداد سفارشی، adSourceName
دارایی نام منبع آگهی Custom event را به شما میدهد. اگر از چندین رویداد سفارشی استفاده میکنید، نام منبع آگهی بهاندازه کافی جزئی نیست تا بین چندین رویداد سفارشی تمایز قائل شود. برای پیدا کردن رویداد سفارشی خاص، مراحل زیر را انجام دهید:
- خصوصیت
adNetworkClassNameرا دریافت کنید. - نام منبع آگهی منحصربهفردی تنظیم کنید.
مثال زیر نام منحصربهفردی برای منبع آگهی رویداد سفارشی تنظیم میکند:
Swift
func uniqueAdSourceName(for loadedAdNetworkResponseInfo: AdNetworkResponseInfo) -> String {
var adSourceName: String = loadedAdNetworkResponseInfo.adSourceName ?? ""
if adSourceName == "Custom Event" {
if loadedAdNetworkResponseInfo.adNetworkClassName
== "MediationExample.SampleCustomEventSwift"
{
adSourceName = "Sample Ad Network (Custom Event)"
}
}
return adSourceName
}آبجکتیو-سی
- (NSString *)uniqueAdSourceNameForAdNetworkResponseInfo:
(GADAdNetworkResponseInfo *)loadedAdNetworkResponseInfo {
NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;
if ([adSourceName isEqualToString:@"Custom Event"]) {
if ([loadedAdNetworkResponseInfo.adNetworkClassName isEqualToString:@"SampleCustomEvent"]) {
adSourceName = @"Sample Ad Network (Custom Event)";
}
}
return adSourceName;
}برای اطلاعات بیشتر درباره منبع آگهی برنده، به بازیابی اطلاعات درباره پاسخ آگهی مراجعه کنید.
ادغام با «شریک ارجاع برنامه» (AAP)
برای جزئیات کامل درباره بازارسال دادههای درآمد آگهی به پلاتفرمهای تجزیهوتحلیل، به راهنمای شریک مراجعه کنید:
| کیت توسعه نرمافزار شریک |
|---|
| تنظیم کردن |
| AppsFlyer |
| مفرد |
| Tenjin |
مثالهای زیر نشان میدهند که چگونه میتوان دادههای درآمد سطح ظهور را بااستفاده از Google Mobile Ads SDK به شرکای AAP ارسال کرد:
میزان کردن
Swift
func setPaidEventHandler(rewardAd: RewardedAd) {
rewardAd.paidEventHandler = { adValue in
guard let adRevenue = ADJAdRevenue(source: "admob_sdk") else { return }
adRevenue.setRevenue(adValue.value.doubleValue, currency: adValue.currencyCode)
if let adSourceName = rewardAd.responseInfo.loadedAdNetworkResponseInfo?.adSourceName {
adRevenue.setAdRevenueNetwork(adSourceName)
}
Adjust.trackAdRevenue(adRevenue)
}
}آبجکتیو-سی
- (void)setPaidEventHandler:(GADRewardedAd *)rewardAd {
NSString *adSourceName = rewardAd.responseInfo.loadedAdNetworkResponseInfo.adSourceName;
rewardAd.paidEventHandler = ^(GADAdValue *_Nonnull adValue) {
ADJAdRevenue *adRevenue = [[ADJAdRevenue alloc] initWithSource:@"admob_sdk"];
if (!adRevenue) {
return;
}
[adRevenue setRevenue:adValue.value.doubleValue currency:adValue.currencyCode];
if (adSourceName) {
[adRevenue setAdRevenueNetwork:adSourceName];
}
[Adjust trackAdRevenue:adRevenue];
};
}AppsFlyer
Swift
func setPaidEventHandler(rewardedAd: RewardedAd) {
rewardedAd.paidEventHandler = { adValue in
let adRevenueData = AFAdRevenueData(
monetizationNetwork: "AdMob Mediation", mediationNetwork: MediationNetworkType.googleAdMob,
currencyIso4217Code: adValue.currencyCode, eventRevenue: adValue.value)
var additionalParameters = [:]
additionalParameters[kAppsFlyerAdRevenueCountry] = "US"
additionalParameters[kAppsFlyerAdRevenueAdUnit] = rewardedAd.adUnitID
additionalParameters[kAppsFlyerAdRevenueAdType] = "Rewarded"
AppsFlyerLib.shared().logAdRevenue(adRevenueData, additionalParameters: additionalParameters)
}
}آبجکتیو-سی
- (void)setPaidEventHandler:(GADRewardedAd *)rewardedAd {
NSString *adUnitID = rewardedAd.adUnitID;
rewardedAd.paidEventHandler = ^(GADAdValue *_Nonnull adValue) {
AFAdRevenueData *adRevenueData = [[AFAdRevenueData alloc]
initWithMonetizationNetwork:@"AdMob Mediation"
mediationNetwork:AppsFlyerAdRevenueMediationNetworkTypeGoogleAdMob
currencyIso4217Code:adValue.currencyCode
eventRevenue:adValue.value];
NSMutableDictionary *additionalParameters = [[NSMutableDictionary alloc] init];
additionalParameters[kAppsFlyerAdRevenueCountry] = @"US";
additionalParameters[kAppsFlyerAdRevenueAdUnit] = adUnitID;
additionalParameters[kAppsFlyerAdRevenueAdType] = @"Rewarded";
[[AppsFlyerLib shared] logAdRevenue:adRevenueData additionalParameters:additionalParameters];
};
}مفرد
Swift
func setPaidEventHandler(rewardedAd: RewardedAd) {
rewardedAd.paidEventHandler = { adValue in
// Extract revenue and currency from AdValue.
let revenue = adValue.value.doubleValue
let currency = adValue.currencyCode
// Validate revenue and currency before sending.
guard revenue > 0, !currency.isEmpty else {
print(
"Invalid ad revenue data: revenue = \(revenue), currency = \(String(describing: currency))"
)
return
}
// Create ad revenue data object.
let data = SingularAdData(
adPlatform: "AdMob",
withCurrency: currency,
withRevenue: NSNumber(value: revenue)
)
// Send to Singular.
Singular.adRevenue(data)
print("Ad revenue sent: \(revenue) \(currency)")
}
}آبجکتیو-سی
- (void)setPaidEventHandler:(GADRewardedAd *)rewardedAd {
rewardedAd.paidEventHandler = ^(GADAdValue *_Nonnull adValue) {
// Extract revenue and currency from AdValue.
double revenue = adValue.value.doubleValue;
NSString *currency = adValue.currencyCode;
// Validate revenue and currency before sending.
if (revenue <= 0 || currency.length == 0) {
NSLog(@"Invalid ad revenue data: revenue = %f, currency = %@", revenue, currency);
return;
}
// Create ad revenue data object.
SingularAdData *data =
[[SingularAdData alloc] initWithAdPlatform:@"AdMob"
withCurrency:currency
withRevenue:[NSNumber numberWithDouble:revenue]];
// Send to Singular.
[Singular adRevenue:data];
NSLog(@"Ad revenue sent: %f %@", revenue, currency);
};
}Tenjin
Swift
func setPaidEventHandler(rewardedAd: RewardedAd) {
rewardedAd.paidEventHandler = { adValue in
var jsonDict = [:]
jsonDict["ad_unit_id"] = rewardedAd.adUnitID
jsonDict["value_micros"] = adValue.value
jsonDict["currency_code"] = adValue.currencyCode
let responseInfo = rewardedAd.responseInfo
if let responseIdentifier = responseInfo.responseIdentifier {
jsonDict["response_id"] = responseIdentifier
}
if let adNetworkClassName = responseInfo.loadedAdNetworkResponseInfo?.adNetworkClassName {
jsonDict["mediation_adapter_class_name"] = adNetworkClassName
}
do {
let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
let jsonString = String(data: jsonData, encoding: .utf8)
TenjinSDK.adMobImpression(fromJSON: jsonString)
} catch {
print("Failed to log AdMob impression: \(error)")
}
}
}آبجکتیو-سی
- (void)setPaidEventHandler:(GADRewardedAd *)rewardedAd {
NSString *adUnitID = rewardedAd.adUnitID;
GADResponseInfo *responseInfo = rewardedAd.responseInfo;
rewardedAd.paidEventHandler = ^(GADAdValue *_Nonnull adValue) {
NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init];
jsonDict[@"ad_unit_id"] = adUnitID;
jsonDict[@"value_micros"] = adValue.value;
jsonDict[@"currency_code"] = adValue.currencyCode;
NSString *responseIdentifier = responseInfo.responseIdentifier;
if (responseIdentifier) {
jsonDict[@"response_id"] = responseIdentifier;
}
NSString *adNetworkClassName = responseInfo.loadedAdNetworkResponseInfo.adNetworkClassName;
if (adNetworkClassName) {
jsonDict[@"mediation_adapter_class_name"] = adNetworkClassName;
}
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:&error];
if (jsonData) {
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
[TenjinSDK adMobImpressionFromJSON:jsonString];
} else {
NSLog(@"Failed to log AdMob impression: %@", error);
}
};
}روالهای مطلوب پیادهسازی
- بهمحض اینکه به شیء آگهی دسترسی پیدا کردید یا آن را ایجاد کردید، و قطعاً قبلاز نمایش آگهی، کارپرداز را تنظیم کنید. این کار تضمین میکند که هیچیک از بازخوانهای رویداد پولی را ازدست ندهید.
- اطلاعات رویداد پولی را بلافاصله در زمان فراخوانی روش
paidEventHandlerبه سرور تجزیهوتحلیل ترجیحی خود ارسال کنید. این کار باعث میشود که بهطور تصادفی هیچکدام از تماسهای برگشتی را ازدست ندهید و از اختلاف دادهها جلوگیری میکند.
GADAdValue
GADAdValue کلاسی است که نشاندهنده مقدار پولی کسبشده برای آگهی است،
ازجمله کد واحد پول مقدار و نوع دقت آن که بهصورت زیر کدبندی شده است.
| GADAdValuePrecision | شرح |
|---|---|
GADAdValuePrecisionUnknown
|
مقدار آگهی که ناشناخته است. وقتی که برگشتی پینگ LTV فعال باشد اما دادههای کافی دردسترس نباشد، این مقدار برگردانده میشود. |
GADAdValuePrecisionEstimated
|
مقدار آگهی تخمینی از دادههای تجمیعی. |
GADAdValuePrecisionPublisherProvided
|
مقدار آگهی ارائهشده توسط ناشر، مانند هزارظهوربهای دستی در گروه میانجیگری. |
GADAdValuePrecisionPrecise
|
مبلغ دقیقی که برای این آگهی پرداخت شده است. |
آزمایش ظهورها از منابع آگهی مناقصه
پساز اینکه رویداد درآمد آگهی در سطح ظهور برای منبع آگهی پیشنهاد قیمت ازطریق درخواست آزمایشی رخ میدهد، فقط مقادیر زیر را دریافت میکنید:
-
GADAdValuePrecisionUnknown: نوع دقت را نشان میدهد.
-
0: نشاندهنده مقدار آگهی است.
GADAdValuePrecisionUnknown و مقدار آگهی را بیشتر از 0 دیده باشید.
برای جزئیات ارسال درخواست آگهی آزمایشی، به فعال کردن دستگاههای آزمایشی مراجعه کنید.