Lorsqu'une impression se produit, Google Mobile Ads SDK appelle le gestionnaire d'événements payants avec les données de revenus associées. En implémentant ce gestionnaire, vous pouvez utiliser les données pour calculer la valeur vie d'un utilisateur ou les transmettre à d'autres systèmes pertinents.
Ce guide est destiné à vous aider à implémenter la capture de données de valeur vie dans votre application iOS.
Prérequis
- Assurez-vous d'avoir activé la fonctionnalité de revenus publicitaires au niveau des impressions dans l'interface utilisateur AdMob.
- Importez Google Mobile Ads SDK 9.10.0 ou une version ultérieure.
- Configurez Google Mobile Ads SDK.
Avant de pouvoir recevoir des revenus publicitaires au niveau des impressions, vous devez implémenter au moins un format d'annonce :
Implémenter un gestionnaire d'événements payants
Chaque format d'annonce possède une propriété paidEventHandler de type
GADPaidEventHandler.
Pendant le cycle de vie d'un événement publicitaire, Google Mobile Ads SDK surveille
les événements d'impression et appelle le gestionnaire avec une valeur générée.
L'exemple suivant gère les événements payants pour une annonce avec récompense :
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)."
)
}
Objective-C
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);
};
Identifier un nom de source d'annonces d'événement personnalisé
Pour les sources d'annonces d'événements personnalisés, adSourceName
la propriété vous donne le nom de la source d'annonces Custom event. Si vous utilisez plusieurs événements personnalisés, le nom de la source d'annonces n'est pas suffisamment précis pour les distinguer. Pour localiser un événement personnalisé spécifique, procédez comme suit :
- Obtenez la
adNetworkClassNamepropriété. - Définissez un nom de source d'annonces unique.
L'exemple suivant définit un nom de source d'annonces unique pour un événement personnalisé :
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;
}Pour en savoir plus sur la source d'annonces gagnante, consultez Récupérer des informations sur la réponse publicitaire.
Intégrer des App Attribution Partners (AAP)
Pour obtenir des informations complètes sur la transmission des données de revenus publicitaires aux plates-formes d'analyse, consultez le guide du partenaire :
| SDK partenaire |
|---|
| Adjust |
| AppsFlyer |
| Singular |
| Tenjin |
Les exemples suivants montrent comment envoyer des données de revenus au niveau des impressions aux partenaires AAP à l'aide de Google Mobile Ads SDK :
Adjust
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);
}
};
}Bonnes pratiques pour l'implémentation
- Définissez le gestionnaire immédiatement après avoir créé l'objet publicitaire ou y avoir accédé, et avant d'afficher l'annonce. Vous vous assurez ainsi de ne manquer aucun rappel d'événement payant.
- Envoyez immédiatement les informations sur l'événement payant à votre serveur d'analyse préféré lorsque la méthode
paidEventHandlerest appelée. Vous vous assurez ainsi de ne pas perdre de rappels accidentellement et d'éviter les écarts de données.
GADAdValue
GADAdValue est une classe qui représente la valeur monétaire générée pour une annonce, y compris le code de la devise de la valeur et son type de précision encodés comme suit.
| GADAdValuePrecision | Description |
|---|---|
GADAdValuePrecisionUnknown
|
Valeur d'annonce inconnue. Cette valeur est renvoyée lorsque le pingback de valeur vie est activé, mais que les données disponibles sont insuffisantes. |
GADAdValuePrecisionEstimated
|
Valeur d'annonce estimée à partir de données agrégées. |
GADAdValuePrecisionPublisherProvided
|
Valeur d'annonce fournie par l'éditeur, comme les CPM manuels dans un groupe de médiation. |
GADAdValuePrecisionPrecise
|
Valeur exacte payée pour cette annonce. |
Tester les impressions provenant de sources d'annonces pour les enchères
Lorsqu'un événement de revenus publicitaires au niveau des impressions se produit pour une source d'annonces pour les enchères via une requête de test, vous ne recevez que les valeurs suivantes :
GADAdValuePrecisionUnknown: indique le type de précision.
0: indique la valeur de l'annonce.
GADAdValuePrecisionUnknown et la valeur de l'annonce pouvait être supérieure à 0.
Pour en savoir plus sur l'envoi d'une demande d'annonce test, consultez Activer les appareils de test.