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

پلاتفرم را انتخاب کنید: Android iOS Unity Android (قدیمی)

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

این راهنما برای کمک به شما در پیاده‌سازی ضبط داده‌های LTV در برنامه iOS شما طراحی شده است.

پیش‌نیازها

پیاده‌سازی مدیریت‌کننده رویداد پولی

هر قالب آگهی دارای ویژگی 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 را به شما می‌دهد. اگر از چندین رویداد سفارشی استفاده می‌کنید، نام منبع آگهی به‌اندازه کافی جزئی نیست تا بین چندین رویداد سفارشی تمایز قائل شود. برای پیدا کردن رویداد سفارشی خاص، مراحل زیر را انجام دهید:

  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
مفرد
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 دیده باشید.

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