รายได้จากโฆษณาระดับการแสดงผล

เลือกแพลตฟอร์ม: 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)."
  )
}

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับแหล่งที่มาของโฆษณาที่ชนะได้ที่ ดึงข้อมูลเกี่ยวกับ คำขอโฆษณา

ผสานรวมกับ App Attribution Partner (AAP)

ดูรายละเอียดทั้งหมดเกี่ยวกับการส่งต่อข้อมูลรายได้จากโฆษณาไปยังแพลตฟอร์มการวิเคราะห์ได้ในคู่มือของพาร์ทเนอร์

SDK ของพาร์ทเนอร์
Adjust
AppsFlyer
Singular
Tenjin

ตัวอย่างต่อไปนี้แสดงวิธีส่งข้อมูลรายได้ระดับการแสดงผลไปยังพาร์ทเนอร์ AAP โดยใช้ 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);
    }
  };
}

แนวทางปฏิบัติแนะนำสำหรับการนำไปใช้

  • ตั้งค่าตัวจัดการทันทีเมื่อสร้างหรือได้รับสิทธิ์เข้าถึงออบเจ็กต์โฆษณา และตั้งค่าก่อนที่จะแสดงโฆษณา ซึ่งจะช่วยให้คุณไม่พลาดการเรียกกลับของเหตุการณ์แบบเสียค่าใช้จ่าย
  • ส่งข้อมูลเหตุการณ์แบบเสียค่าใช้จ่ายไปยังเซิร์ฟเวอร์การวิเคราะห์ที่คุณต้องการทันทีเมื่อมีการเรียกใช้เมธอด paidEventHandler ซึ่งจะช่วยให้คุณไม่พลาดการเรียกกลับโดยไม่ตั้งใจและหลีกเลี่ยงความคลาดเคลื่อนของข้อมูล

GADAdValue

GADAdValue เป็นคลาสที่แสดงมูลค่าทางการเงินที่ได้รับจากโฆษณา ซึ่งรวมถึงรหัสสกุลเงินของมูลค่าและประเภทความแม่นยำที่เข้ารหัสไว้ดังนี้

GADAdValuePrecision คำอธิบาย
GADAdValuePrecisionUnknown มูลค่าโฆษณาที่ไม่ทราบ ระบบจะแสดงค่านี้เมื่อเปิดใช้การ Pingback ของ LTV แต่มีข้อมูลไม่เพียงพอ
GADAdValuePrecisionEstimated มูลค่าโฆษณาโดยประมาณจากภาพรวมข้อมูล
GADAdValuePrecisionPublisherProvided มูลค่าโฆษณาที่ผู้เผยแพร่โฆษณาระบุ เช่น CPM แบบกําหนดเองในกลุ่มสื่อกลาง
GADAdValuePrecisionPrecise มูลค่าที่ตรงกับค่าใช้จ่ายโฆษณารายการนี้

ทดสอบการแสดงผลจากแหล่งที่มาของโฆษณาซึ่งใช้การเสนอราคา

หลังจากเกิดเหตุการณ์รายได้จากโฆษณาระดับการแสดงผลสําหรับ แหล่งที่มาของโฆษณาซึ่งใช้การเสนอราคาผ่านคําขอทดสอบ คุณจะได้รับเฉพาะค่าต่อไปนี้

  • GADAdValuePrecisionUnknown: ระบุประเภทความแม่นยำ
  • 0: ระบุมูลค่าโฆษณา
ก่อนหน้านี้ คุณอาจเห็นประเภทความแม่นยำเป็นค่าอื่นที่ไม่ใช่ GADAdValuePrecisionUnknown และมูลค่าโฆษณามากกว่า 0

ดูรายละเอียดเกี่ยวกับการส่งคําขอโฆษณาทดสอบได้ที่ เปิดใช้อุปกรณ์ทดสอบ