इंप्रेशन-लेवल पर विज्ञापन से मिलने वाला रेवेन्यू

प्लैटफ़ॉर्म चुनें: Android iOS Unity Android (लेगसी)

जब कोई इंप्रेशन होता है, तो Google Mobile Ads SDK, पेड इवेंट हैंडलर को उससे जुड़े रेवेन्यू डेटा के साथ कॉल करता है. इस हैंडलर को लागू करके, डेटा का इस्तेमाल करके किसी उपयोगकर्ता की लाइफ़टाइम वैल्यू का हिसाब लगाया जा सकता है. इसके अलावा, डेटा को अन्य काम के सिस्टम में भेजा जा सकता है.

इस गाइड का मकसद, 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)."
  )
}

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

विज्ञापन के कस्टम इवेंट सोर्स के नाम की पहचान करना

कस्टम इवेंट वाले विज्ञापन सोर्स के लिए, 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
}

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

विज्ञापन दिखाने के लिए चुने गए सोर्स के बारे में ज़्यादा जानने के लिए, विज्ञापन के जवाब के बारे में जानकारी पाना लेख पढ़ें.

ऐप्लिकेशन एट्रिब्यूशन पार्टनर (एएपी) के साथ इंटिग्रेट करना

विज्ञापन से मिलने वाले रेवेन्यू के डेटा को Analytics प्लैटफ़ॉर्म पर फ़ॉरवर्ड करने के बारे में पूरी जानकारी पाने के लिए, पार्टनर की गाइड देखें:

पार्टनर एसडीके
Adjust
AppsFlyer
Singular
Tenjin

यहां दिए गए उदाहरणों में, Google Mobile Ads SDK का इस्तेमाल करके, इंप्रेशन-लेवल पर विज्ञापन से मिलने वाले रेवेन्यू का डेटा, एएपी पार्टनर को भेजने का तरीका बताया गया है:

बदलाव करें

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

एकवचन

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

लागू करने के सबसे सही तरीके

  • विज्ञापन ऑब्जेक्ट बनाने या उसका ऐक्सेस पाने के तुरंत बाद, हैंडलर को सेट करें. साथ ही, विज्ञापन दिखाने से पहले ऐसा ज़रूर करें. इससे यह पक्का किया जाता है कि आपसे किसी भी ऐसे इवेंट के कॉलबैक न छूटें जिनके लिए शुल्क लिया जाता है.
  • paidEventHandler तरीके को कॉल करने के तुरंत बाद, पैसे चुकाकर देखे जाने वाले इवेंट की जानकारी अपने पसंदीदा आंकड़ों वाले सर्वर पर भेजें. इससे यह पक्का होता है कि आपसे गलती से कोई कॉलबैक न छूटे और डेटा में कोई गड़बड़ी न हो.

GADAdValue

GADAdValue एक क्लास है, जो किसी विज्ञापन से हुई कमाई की मॉनेटरी वैल्यू दिखाती है. इसमें वैल्यू का करंसी कोड और उसकी सटीक जानकारी देने वाला टाइप शामिल होता है. इसे इस तरह कोड किया जाता है.

GADAdValuePrecision ब्यौरा
GADAdValuePrecisionUnknown विज्ञापन की ऐसी वैल्यू जिसकी जानकारी नहीं है. यह तब दिखता है, जब एलटीवी पिंगबैक की सुविधा चालू हो, लेकिन ज़रूरत के मुताबिक डेटा उपलब्ध न हो.
GADAdValuePrecisionEstimated कुल डेटा से ली गई अनुमानित विज्ञापन वैल्यू.
GADAdValuePrecisionPublisherProvided पब्लिशर की दी हुई विज्ञापन वैल्यू, जैसे कि मीडिएशन ग्रुप में मैन्युअल सीपीएम.
GADAdValuePrecisionPrecise इस विज्ञापन के लिए चुकाए गए पैसे.

बिडिंग में हिस्सा लेने वाले विज्ञापन स्रोतों से मिले टेस्ट इंप्रेशन

टेस्ट रिक्वेस्ट के ज़रिए, बिडिंग में हिस्सा लेने वाले विज्ञापन सोर्स के लिए इंप्रेशन-लेवल पर विज्ञापन से मिलने वाले रेवेन्यू का इवेंट होने के बाद, आपको सिर्फ़ ये वैल्यू मिलती हैं:

  • GADAdValuePrecisionUnknown: इससे पता चलता है कि रेवेन्यू कितना सटीक है.
  • 0: इससे विज्ञापन की वैल्यू का पता चलता है.
पहले, आपको विज्ञापन की वैल्यू 0 से ज़्यादा और कितना सटीक है की वैल्यू GADAdValuePrecisionUnknown के अलावा कुछ और दिख सकती थी.

टेस्ट विज्ञापन दिखाने का अनुरोध भेजने के बारे में ज़्यादा जानने के लिए, टेस्ट डिवाइसों को चालू करना लेख पढ़ें.