Przychody z reklam na poziomie wyświetleń

Gdy nastąpi wyświetlenie, Google Mobile Ads SDK dostarcza dane o przychodach z reklam powiązane z tym wyświetleniem. Możesz używać tych danych do obliczania wartości użytkownika od początku śledzenia lub przekazywać je do innych odpowiednich systemów.

Ten przewodnik pomoże Ci wdrożyć rejestrowanie danych o wartości od początku śledzenia w aplikacji na iOS.

Wymagania wstępne

Obsługa płatnych wydarzeń

Protokół delegowany każdego formatu reklamy zawiera metodę didRecordPaidEventWithAdValue:. W cyklu życia reklamy Google Mobile Ads SDK monitoruje zdarzenia wyświetlenia i wywołuje tę metodę delegowaną z uzyskanym obiektem GADAdValue.

Poniższy przykład obsługuje zdarzenia płatne w przypadku reklamy z nagrodą:

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)."
  )
}

Objective-C

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

Identyfikowanie nazwy źródła reklam zdarzenia niestandardowego

W przypadku źróła reklam ze zdarzeniami niestandardowymi właściwość adSourceName podaje nazwę źródła reklam Custom event. Jeśli używasz wielu zdarzeń niestandardowych, nazwa źródła reklam nie jest wystarczająco szczegółowa, aby je rozróżnić. Aby znaleźć konkretne zdarzenie niestandardowe:

  1. Pobierz właściwość adNetworkClassName.
  2. Ustaw unikalną nazwę źródła reklam.

W tym przykładzie ustawiono unikalną nazwę źródła reklam dla zdarzenia niestandardowego:

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
}

Objective-C

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

Więcej informacji o zwycięskim źródle reklam znajdziesz w artykule Pobieranie informacji o odpowiedzi na reklamę.

Integracja z firmami uczestniczącymi w programie App Attribution Partner (AAP)

Szczegółowe informacje o przekazywaniu danych o przychodach z reklam do platform analitycznych znajdziesz w przewodniku partnera:

Pakiet SDK partnera
Adjust
AppsFlyer
Singular
Tenjin

Przykłady poniżej pokazują, jak wysyłać dane o przychodach na poziomie wyświetleń do partnerów AAP za pomocą metody Google Mobile Ads SDK:

Dostosuj

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

Objective-C

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

Objective-C

- (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];
  };
}

Singular

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

Objective-C

- (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)")
    }
  }
}

Objective-C

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

Sprawdzone metody wdrażania

  • Ustaw obiekt delegowany natychmiast po utworzeniu obiektu reklamy lub uzyskaniu do niego dostępu, a na pewno przed wyświetleniem reklamy. Dzięki temu nie przegapisz żadnych wywołań zwrotnych dotyczących płatnych wydarzeń.
  • Wyślij informacje o płatnym zdarzeniu na preferowany serwer analityczny natychmiast po wywołaniu metody delegowanej didRecordPaidEventWithAdValue:. Dzięki temu nie utracisz przypadkowo żadnych wywołań zwrotnych i unikniesz rozbieżności danych.

GADAdValue

GADAdValue to klasa, która reprezentuje wartość pieniężną uzyskaną z reklamy, w tym kod waluty i typ dokładności zakodowane w następujący sposób.

GADAdValuePrecision Opis
GADAdValuePrecisionUnknown Nieznana wartość reklamy. Ten błąd jest zwracany, gdy pingback wartości od początku śledzenia jest włączony, ale nie ma wystarczającej ilości danych.
GADAdValuePrecisionEstimated Wartość reklamy została oszacowana na podstawie danych zbiorczych.
GADAdValuePrecisionPublisherProvided Wartość reklamy podana przez wydawcę, np. CPM ustawiony ręcznie w grupie zapośredniczenia.
GADAdValuePrecisionPrecise Dokładna kwota zapłacona za tę reklamę.

Wyświetlenia testowe ze źródeł reklam z ustalaniem stawek

Gdy w przypadku źródła reklam z ustalaniem stawek wystąpi zdarzenie przychodów z reklam na poziomie wyświetleń, otrzymasz tylko te wartości:

  • GADAdValuePrecisionUnknown: wskazuje typ dokładności.
  • 0: wskazuje wartość reklamy.
Wcześniej typ dokładności mógł mieć wartość inną niż GADAdValuePrecisionUnknown, a wartość reklamy mogła być większa niż 0.

Szczegółowe informacje o wysyłaniu żądania reklamy testowej znajdziesz w artykule Włączanie urządzeń testowych.