了解广告收入归因
广告收入归属可帮助您将广告收入与将用户引入应用程序的特定广告活动联系起来。这样,广告活动成本、应用内收入和广告收入都会显示在一个地方,让您清楚地了解广告效果如何。该功能还能让您将广告收入数据发送回广告网络,以提高广告效果。
要点
- 作用:广告收入归属将移动应用广告收入与为应用带来用户的营销活动联系起来。这样,您就可以看到您从每个营销活动中获得了多少收入,以及这些收入对您的整体广告投资回报率有何影响。
- 数据来源:这些数据通常来自您的中介平台,可以是用户级别的数据,也可以是印象级别的数据。Singular 支持通过不同方式获取这些归因数据。
- 更多信息:更多详情,请查看有关 Singular 广告收入归因的常见问题和故障排除文章。
重要说明:
- 货币代码:使用三个字母的 ISO 4217 货币代码(例如,"USD "表示美元,"EUR "表示欧元,"INR "表示印度卢比)。许多调解平台都使用 "USD",因此,如果您使用 "USD",请确保您的代码与之匹配。如果使用其他货币,请相应更新验证码。
- 数据准确性:在发送给 Singular 之前,请务必检查收入和货币数据是否正确。不正确的数据事后无法修复,因此确保数据准确至关重要。
实施广告收入归因
- 更新 SDK:确保拥有最新版本的 Singular SDK。
- 添加代码片段:根据您的调解平台,将正确的代码片段添加到您的 Singular SDK 设置中。
遵循这些步骤将帮助您正确设置广告收入归因,并充分利用广告数据。
AdMob
合作伙伴说明
- 此功能需要在您的 AdMob 账户中启用。
请参阅AdMob 支持。
-
加载广告格式(如 "App Open"、"Banner"、"Interstitial"、"Native "或 "Rewarded")时,将paidEventHandler设置为回调函数,在广告产生收入时触发。Google 移动广告 SDK 会跟踪印象事件,并根据广告产生的收入调用该处理程序。
为此,请修改广告格式的"加载"函数,使其包含paidEventHandler。在该回调函数中,您可以管理广告收入数据、验证数据并使用 Singular.adRevenue函数将其发送给Singular。
例如,当 "奖励广告 "加载成功时,paidEventHandler 将收到广告收入信息(adValue)。在该函数中,处理收入数据并将其发送给 Singular。
更多详情,请查阅AdMob 文档。
重要:AdMob SDK 报告收入的方式因平台而异。例如,0.005 美元的广告收入在 Unity 和 Android 平台上将以 5000 的形式返回,但在 iOS 平台上将以 0.005 的形式返回。对于 iOS,请直接向 Singular SDK 发送 0.005。在其他平台上,将adValue从微米转换成美元后再发送到Singular。
选择 SDK 实现的代码库:
如何运行
- 实施 Google AdMob 移动广告 SDK(iOS):请参阅《入门指南》。
- 整合 AdMob:从 AdMob 加载广告并设置setOnPaidEventListener以处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在向 Singular 发送数据之前,确保货币不是零或空。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
import Singular
private let adUnitID = "AD_UNIT_ID"
var rewardedAd: GADRewardedAd?
func loadRewardedAd() {
let request = GADRequest()
GADRewardedAd.load(withAdUnitID: adUnitID, request: request) { [weak self] ad, error in
guard let self = self else { return }
if let error = error {
print("Rewarded ad failed to load with error: \(error.localizedDescription)")
return
}
self.rewardedAd = ad
self.rewardedAd?.paidEventHandler = { adValue in
// Ensure valid revenue data
let revenue = adValue.value
let currency = adValue.currencyCode
// Validate the revenue and currency before sending to Singular
guard revenue > 0, let currency = currency, !currency.isEmpty else {
print("Invalid ad revenue data: revenue = \(revenue), currency = \(String(describing: currency))")
return
}
let data = SingularAdData(
adPlatform: "Admob",
currency: currency,
revenue: revenue
)
// Send Ad Revenue data to Singular
Singular.adRevenue(data: data)
// Log the data for debugging
print("Ad Revenue reported to Singular: \(data)")
}
}
}
如何运行
- 实施 Google AdMob 移动广告 SDK(iOS):请参阅《入门指南》。
- 整合 AdMob:从 AdMob 加载广告并设置paidEventHandler来处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在向 Singular 发送数据之前,确保货币不是零或空。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
#import <Singular/Singular.h>
static NSString *const adUnitID = @"AD_UNIT_ID";
// Initialize and load the rewarded ad
@interface YourClassName () <GADRewardedAdDelegate>
@property(nonatomic, strong) GADRewardedAd *rewardedAd;
@end
@implementation YourClassName
- (void)loadRewardedAd {
GADRequest *request = [[GADRequest alloc] init];
[GADRewardedAd loadWithAdUnitID:adUnitID
request:request
completionHandler:^(GADRewardedAd *ad, NSError *error) {
if (error) {
NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
return;
}
self.rewardedAd = ad;
self.rewardedAd.fullScreenContentDelegate = self;
self.rewardedAd.paidEventHandler = ^(GADAdValue *adValue) {
// Ensure valid revenue data
NSDecimalNumber *revenue = adValue.value;
NSString *currency = adValue.currencyCode;
if (revenue.doubleValue > 0 && currency.length > 0) {
SingularAdData *data = [[SingularAdData alloc] initWithAdPlatfrom:@"Admob"
currency:currency
revenue:revenue.doubleValue];
// Send Ad Revenue data to Singular
[Singular adRevenue:data];
// Log the data for debugging
NSLog(@"Ad Revenue reported to Singular: %@", data);
} else {
NSLog(@"Invalid ad revenue data: revenue = %@, currency = %@", revenue, currency);
}
};
}];
}
@end
AppLovinMax
合作伙伴注意事项
- 使用 Applovin 印象级用户收入 API 共享印象级广告收入数据。
为您的 SDK 实施选择代码库:
工作原理:
- 使用 AppLovin 印象级用户收入 API(iOS):请参阅入门指南。
- AppLovin 集成:从 AppLovin MAX 加载奖励广告,并使用didReceive函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币准确无误,而不是零或空值。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
import Singular
func didReceive(_ message: ALCMessage) {
if "max_revenue_events" == message.topic {
// Safely unwrap values from the message data
guard
let revenueValue = message.data["revenue"] as? Double,
revenueValue > 0
else {
print("Failed to parse valid revenue value from message data or revenue is not greater than 0")
return
}
let data = SingularAdData(
adPlatform: "AppLovin",
currency: "USD", // Update this if a different currency is needed
revenue: revenueValue
)
// Send the revenue data to Singular
Singular.adRevenue(data)
}
}
工作原理
- 使用 AppLovin 印象级用户收入 API(iOS):请参阅《入门指南》。
- AppLovin 集成:从 AppLovin MAX 加载奖励广告,并使用didReceive函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币准确无误,而不是零或空值。
- 记录无效数据:如果数据未通过验证,请打印日志信息进行调试,不要将数据发送到 Singular。
#import <Singular/Singular.h>
- (void)didReceive:(ALCMessage *)message {
if ([@"max_revenue_events" isEqualToString:message.topic]) {
NSDictionary *data = message.data;
NSNumber *revenueNumber = data[@"revenue"];
double revenueValue = [revenueNumber doubleValue];
if (revenueValue > 0) {
SingularAdData *adData = [[SingularAdData alloc] initWithAdPlatfrom:@"AppLovin"
currency:@"USD"
revenue:revenueValue];
// Send the revenue data to Singular
[Singular adRevenue:adData];
} else {
NSLog(@"Failed to parse valid revenue value from message data or revenue is not greater than 0");
}
}
}
Unity LevelPlay (IronSource)
合作伙伴说明
- Impression Level Revenue (ILR) SDK API 使用 ironSource SDK 为 ironSource Ads 和其他中介网络提供印象级别数据。在[developers.is.com] 上阅读更多内容
- 确保打开 IronSource 中的 ARM SDK 回传标志
为您的 SDK 实施选择代码库:
工作原理:
- 使用 ironSource SDK 获取印象级用户收入(iOS):请参阅《入门指南》。
- Ironsource集成:从 Ironsource 加载奖励广告,并使用impressionDataDidSucceed函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币准确无误,而不是零或空值。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
import Singular
class IronSourceRewardedAdViewController: UIViewController {
func impressionDataDidSucceed(impressionData: ISImpressionData?) {
logCallback(#function)
// Ensure impressionData is not nil
guard let impressionData = impressionData else {
print("No impression data available.")
return
}
// Ensure revenue value is valid
let revenue = impressionData.revenue
guard revenue > 0 else {
print("Invalid revenue value: \(revenue)")
return
}
// Create SingularAdData object with appropriate values
let data = SingularAdData(
adPlatform: "IronSource",
currency: "USD",
revenue: revenue
)
// Send the Ad Revenue data to Singular
Singular.adRevenue(data)
// Log the data for debugging
print("Ad Revenue reported to Singular: AdPlatform: \(data.adPlatform), Currency: \(data.currency), Revenue: \(data.revenue)")
}
private func logCallback(_ functionName: String) {
// Implement logging if needed
print("Function called: \(functionName)")
}
}
工作原理
- 使用 ironSource SDK 获取印象级用户收入(iOS):请参阅《入门指南》。
- Ironsource集成:从 Ironsource 加载奖励广告,并使用impressionDataDidSucceed函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币准确无误,而不是零或空值。
- 记录无效数据:如果数据未通过验证,请打印日志信息进行调试,不要将数据发送到 Singular。
#import <Singular/Singular.h>
@implementation IronSourceRewardedAdViewController
- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
[self logCallback:NSStringFromSelector(_cmd)];
// Ensure impressionData is not nil
if (!impressionData) {
NSLog(@"No impression data available.");
return;
}
// Ensure revenue value is valid
double revenue = impressionData.revenue;
if (revenue <= 0) {
NSLog(@"Invalid revenue value: %f", revenue);
return;
}
// Create SingularAdData object with appropriate values
SingularAdData *data = [[SingularAdData alloc] initWithAdPlatfrom:@"IronSource"
currency:@"USD"
revenue:revenue];
// Send the Ad Revenue data to Singular
[Singular adRevenue:data];
// Log the data for debugging
NSLog(@"Ad Revenue reported to Singular: AdPlatform: %@, Currency: %@, Revenue: %f",
data.adPlatform, data.currency, data.revenue);
}
- (void)logCallback:(NSString *)functionName {
// Implement logging if needed
NSLog(@"Function called: %@", functionName);
}
@end
TradPlus
合作伙伴注意事项
- 设置impressionDelegate
- 在TradPlusAdImpression回调中添加 Singular
为您的 SDK 实现选择代码库:
如何工作:
- TradPlus 集成:从 TradPlus 加载奖励广告并使用tradPlusAdImpression函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。adInfo字典包含一个具有有效 NSNumber 值的"ecpm"键。它将此值转换为双倍值并进行缩放(ecpm 通常以毫安单位表示,因此除以 1000.0 将其转换为美元)。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币是准确的,而不是零或空。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
import Singular
// Set up the delegate
TradPlus.sharedInstance().impressionDelegate = self
// Delegate method for handling ad impressions
func tradPlusAdImpression(_ adInfo: [String: Any]) {
let currency = "USD" // Assuming USD, adjust if necessary
// Ensure adInfo contains the necessary key and its value is valid
if let ecpmValue = adInfo["ecpm"] as? NSNumber {
let revenue = ecpmValue.doubleValue / 1000.0
// Validate the revenue value
guard revenue > 0 else {
print("Ad Revenue value out of expected range: \(revenue)")
return
}
// Create SingularAdData object with required fields
let data = SingularAdData(
adPlatform: "TradPlus",
currency: currency,
revenue: revenue
)
// Send the Ad Revenue data to Singular
Singular.adRevenue(data)
print("Ad Revenue reported to Singular: \(data)")
} else {
// Log the issue for debugging
print("No eCPM data available in adInfo")
}
}
如何运行
- TradPlus 集成:从 TradPlus 加载奖励广告,并使用tradPlusAdImpression函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。adInfo字典包含一个具有有效 NSNumber 值的"ecpm"键。它将此值转换为双倍值并进行缩放(ecpm 通常以毫安单位表示,因此除以 1000.0 将其转换为美元)。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币的准确性,而不是零或空。
- 记录无效数据:如果数据未能通过验证,请打印日志信息以便调试,同时不要向 Singular 发送数据。
#import <Singular/Singular.h>
// Set up the delegate
TradPlus.sharedInstance.impressionDelegate = self;
// Delegate method for handling ad impressions
- (void)tradPlusAdImpression:(NSDictionary<NSString *, id> *)adInfo {
NSString *currency = @"USD"; // Assuming USD, adjust if necessary
// Ensure adInfo contains the necessary key and its value is valid
NSNumber *ecpmValue = adInfo[@"ecpm"];
if (ecpmValue) {
double revenue = [ecpmValue doubleValue] / 1000.0;
// Validate the revenue value
if (revenue <= 0) {
NSLog(@"Ad Revenue value out of expected range: %f", revenue);
return;
}
// Create SingularAdData object with required fields
SingularAdData *data = [[SingularAdData alloc] initWithAdPlatfrom:@"TradPlus"
currency:currency
revenue:revenue];
// Send the Ad Revenue data to Singular
[Singular adRevenue:data];
NSLog(@"Ad Revenue reported to Singular: AdPlatform: %@, Currency: %@, Revenue: %f", data.adPlatform, data.currency, data.revenue);
} else {
// Log the issue for debugging
NSLog(@"No eCPM data available in adInfo");
}
}
其他(通用)
合作伙伴说明
- 通用集成:初始化一个 SingularAdData 对象并传递所需的数据。数据应包括字符串形式的广告平台、字符串形式的货币和双倍形式的收入。
- 收入报告:在将收入和货币数据发送给 Singular 之前,请检查这些数据是否正确。不正确的数据以后无法修复,因此确保数据准确至关重要。
- 提示:记录调试信息。
为您的 SDK 实施选择代码库:
import Singular
// Function to send Ad Revenue data to Singular
func reportAdRevenue(adPlatform: String, currency: String, revenue: Double) {
// Validate the revenue value
guard revenue > 0 else {
print("Invalid revenue value: \(revenue)")
return
}
// Create a SingularAdData object with the provided fields
let data = SingularAdData(
adPlatform: adPlatform,
currency: currency,
revenue: revenue
)
// Send the Ad Revenue data to Singular
Singular.adRevenue(data)
// Log the data for debugging
print("Ad Revenue reported to Singular: AdPlatform: \(data.adPlatform), Currency: \(data.currency), Revenue: \(data.revenue)")
}
#import <Singular/Singular.h>
// Function to send Ad Revenue data to Singular
- (void)reportAdRevenueWithPlatform:(NSString *)adPlatform currency:(NSString *)currency revenue:(double)revenue {
// Validate the revenue value
if (revenue <= 0) {
NSLog(@"Invalid revenue value: %f", revenue);
return;
}
// Create a SingularAdData object with the provided fields
SingularAdData *data = [[SingularAdData alloc] initWithAdPlatfrom:adPlatform currency:currency revenue:revenue];
// Send the Ad Revenue data to Singular
[Singular adRevenue:data];
// Log the data for debugging
NSLog(@"Ad Revenue reported to Singular: AdPlatform: %@, Currency: %@, Revenue: %f", data.adPlatform, data.currency, data.revenue);
}