درآمد آگهی سطح ظهور

وقتی ظهوری رخ می‌دهد، Google Mobile Ads SDK داده‌های درآمد آگهی مربوط به آن ظهور را ارائه می‌دهد. می‌توانید از این داده‌ها برای محاسبه ارزش طول عمر کاربر استفاده کنید یا داده‌ها را به سیستم‌های مرتبط دیگر ارسال کنید.

این راهنما برای کمک به شما در پیاده‌سازی ضبط داده‌های «ارزش طول عمر» در برنامه iOS شما درنظر گرفته شده است.

پیش‌نیازها

مدیریت رویدادهای پولی

پروتکل نماینده هر قالب آگهی شامل یک روش didRecordPaidEventWithAdValue: است. درطول چرخه حیات آگهی، Google Mobile Ads SDK رویدادهای ظهور را پایش می‌کند و این روش نماینده را با شیء GADAdValue کسب‌شده فراخوانی می‌کند.

مثال زیر رویدادهای پولی را برای آگهی پاداش‌دار مدیریت می‌کند:

Swift

func ad(_ ad: FullScreenPresentingAd, didRecordPaidEventWith adValue: 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.
  let value = adValue.value
  let currencyCode = adValue.currencyCode
  let precision = adValue.precision

  print(
    "Ad paid event. Value: \(value) \(currencyCode), with precision: \(precision)."
  )
}

آبجکتیو-سی

- (void)ad:(id<GADFullScreenPresentingAd>)ad didRecordPaidEventWithAdValue:(GADAdValue *)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 را به شما می‌دهد. اگر از چند رویداد سفارشی استفاده می‌کنید، نام منبع آگهی به‌اندازه کافی جزئی نیست که بتواند بین چند رویداد سفارشی تمایز قائل شود. برای پیدا کردن رویداد سفارشی خاص، مراحل زیر را انجام دهید:

  1. خصوصیت adNetworkClassName را دریافت کنید.
  2. نام منبع آگهی منحصربه‌فردی تنظیم کنید.

مثال زیر نام منبع آگهی منحصربه‌فردی را برای رویداد سفارشی تنظیم می‌کند:

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
Singular
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);
  };
}

تنجین

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);
    }
  };
}

روال‌های مطلوب پیاده‌سازی

  • به‌محض ایجاد یا دسترسی به شیء آگهی، نماینده را تنظیم کنید، و حتماً قبل‌از نمایش آگهی این کار را انجام دهید. این کار تضمین می‌کند که هیچ‌کدام از فراخوانی‌های رویداد پولی را ازدست ندهید.
  • اطلاعات رویداد پولی را بلافاصله پس‌از فراخوانی روش نماینده didRecordPaidEventWithAdValue: به سرور تجزیه‌وتحلیل دلخواهتان ارسال کنید. این کار باعث می‌شود که به‌طور تصادفی هیچ‌کدام از تماس‌های برگشتی را ازدست ندهید و از مغایرت داده‌ها جلوگیری می‌کند.

GADAdValue

GADAdValue کلاسی است که ارزش پولی کسب‌شده برای آگهی را نشان می‌دهد، ازجمله کد واحد پول ارزش و نوع دقت آن که به‌صورت زیر کدگذاری شده است.

GADAdValuePrecision شرح
GADAdValuePrecisionUnknown مقدار آگهی که ناشناخته است. این خطا زمانی برگردانده می‌شود که پینگ‌بک LTV فعال باشد اما داده‌های کافی دردسترس نباشد.
GADAdValuePrecisionEstimated مقدار آگهی تخمین‌زده‌شده از داده‌های تجمیعی.
GADAdValuePrecisionPublisherProvided مقدار آگهی ارائه‌شده توسط ناشر، مانند هزارظهوربهای دستی در گروه میانجی‌گری.
GADAdValuePrecisionPrecise مبلغ دقیقی که برای این آگهی پرداخت شده است.

آزمایش ظهورها از منابع آگهی مناقصه

پس‌از اینکه رویداد درآمد آگهی در سطح ظهور برای منبع آگهی مزایده‌ای ازطریق درخواست آزمایشی رخ می‌دهد، فقط مقادیر زیر را دریافت می‌کنید:

  • ‫GADAdValuePrecisionUnknown: نوع دقت را نشان می‌دهد.
  • 0: نشان‌دهنده ارزش آگهی است.
قبلاً ممکن بود نوع دقت را به‌عنوان مقداری غیراز GADAdValuePrecisionUnknown و مقدار آگهی را بیشتر از 0 ببینید.

برای جزئیات مربوط به ارسال درخواست آگهی آزمایشی، به فعال کردن دستگاه‌های آزمایشی مراجعه کنید.