알립니다
이 기능은 베타 서비스입니다. 개선 의견과 문의사항은 에어브릿지 CSM을 통해 전달해 주세요. 담당 CSM이 없는 경우 문의하기를 통해 전달해 주세요. 정식 서비스에서 발전한 기능으로 보답하겠습니다.
에어브릿지와 유니티 레벨플레이(아이언소스)를 연동해 광고로 발생한 수익과 관련된 데이터를 에어브릿지 대시보드에서 확인할 수 있습니다. 에어브릿지는 유니티 레벨플레이와의 서버 투 서버(S2S) 연동과 SDK 연동을 지원합니다.
권장하는 연동 방식
더 정확한 광고 성과 측정과 활용을 위해 서버 투 서버 연동과 SDK 연동을 모두 설정하는 것을 권장합니다.
에어브릿지는 SDK 연동으로 실시간으로 받은 데이터를 서버 투 서버 연동으로 받은 보정된 데이터로 자동 업데이트합니다. 또한 SDK 연동으로 받은 데이터는 SKAdNetwork(SKAN)에 활용할 수 있습니다.
에어브릿지 SDK가 아래 버전 이상인지 확인해 주세요. 확인 시점에 에어브릿지 SDK가 아래 버전 미만이라면 서버 투 서버 연동 또는 SDK 연동 중에 1가지만 진행하는 것을 권장합니다.
주의하세요
서버 투 서버 연동과 SDK 연동을 모두 진행한다면 에어브릿지 SDK가 아래 버전 이상인지 반드시 확인해 주세요.
충분히 많은 유저가 아래 버전 이상의 SDK가 설치된 앱으로 업데이트한 후에 모든 연동을 진행하는 것을 권장합니다. 아래 버전 미만의 에어브릿지 SDK가 설치된 앱을 사용하는 유저가 대부분일 때 서버 투 서버 연동과 SDK 연동을 모두 진행하면 유저 수가 정확히 집계되지 않습니다.
Android SDK 2.25.0
React Native SDK 2.8.6
Flutter SDK 3.5.6
Cordova SDK 2.6.6
Expo SDK 2.6.6
Unity SDK 1.14.5
Unreal SDK 1.3.5
아래 링크에 따라 아이언소스 SDK를 설치해 주세요.
유니티 레벨플레이(아이언소스)에서 발생한 광고 수익 데이터를 에어브릿지로 전송합니다. 아이언소스 SDK에 광고 수익 데이터 콜백을 설정합니다. 해당 콜백을 활용하여 광고 수익 데이터를 에어브릿지 SDK로 전송합니다.
IronSourceEvents.onImpressionDataReadyEvent += ImpressionDataReadyEvent;
private void ImpressionDataReadyEvent(IronSourceImpressionData impressionData)
{
if (impressionData != null)
{
AirbridgeEvent @event = new AirbridgeEvent("airbridge.adImpression");
var ironSource = new Dictionary<string, object>();
// optional fields
ironSource["auction_id"] = impressionData.auctionId;
ironSource["ad_unit"] = impressionData.adUnit;
ironSource["ad_network"] = impressionData.adNetwork;
ironSource["instance_name"] = impressionData.instanceName;
ironSource["instance_id"] = impressionData.instanceId;
ironSource["country"] = impressionData.country;
ironSource["placement"] = impressionData.placement;
ironSource["revenue"] = impressionData.revenue;
ironSource["precision"] = impressionData.precision;
ironSource["ab"] = impressionData.ab;
ironSource["segment_name"] = impressionData.segmentName;
ironSource["lifetime_revenue"] = impressionData.lifetimeRevenue;
ironSource["encrypted_cpm"] = impressionData.encryptedCPM;
var adPartners = new Dictionary<string, object>();
adPartners["ironSource"] = ironSource;
@event.SetAction(impressionData.adNetwork);
@event.SetLabel(impressionData.placement);
@event.SetValue(impressionData.revenue ?? 0);
@event.AddSemanticAttribute("adPartners", adPartners);
// ironSource has a default currency of USD
@event.AddSemanticAttribute("currency", "USD");
AirbridgeUnity.TrackEvent(@event);
}
}
import AirBridge
import IronSource
class ISImpressionDataManager: NSObject, ISImpressionDataDelegate {
func impressionDataDidSucceed(_ impressionData: ISImpressionData!) {
if let impressionData = impressionData {
var ironSource: [String: Any] = [:]
// optional fields
ironSource["auction_id"] = impressionData.auction_id
ironSource["ad_unit"] = impressionData.ad_unit
ironSource["ad_network"] = impressionData.ad_network
ironSource["instance_name"] = impressionData.instance_name
ironSource["instance_id"] = impressionData.instance_id
ironSource["country"] = impressionData.country
ironSource["placement"] = impressionData.placement
ironSource["revenue"] = impressionData.revenue
ironSource["precision"] = impressionData.precision
ironSource["ab"] = impressionData.ab
ironSource["segment_name"] = impressionData.segment_name
ironSource["lifetime_revenue"] = impressionData.lifetime_revenue
ironSource["encrypted_cpm"] = impressionData.encrypted_cpm
var adPartners: [String: Any] = [:]
adPartners["ironSource"] = ironSource
var semanticAttributes: [String: Any] = [:]
semanticAttributes["adPartners"] = adPartners
// ironSource has a default currency of USD
semanticAttributes["currency"] = "USD"
guard let event = ABInAppEvent() else { return }
event.setCategory("airbridge.adImpression")
event.setAction(impressionData.ad_network)
event.setLabel(impressionData.placement)
event.setValue(impressionData.revenue)
event.setSemantics(semanticAttributes)
event.send()
}
}
}
#import "AirBridge.h"
#import "ISImpressionDataManager.h"
@interface ISImpressionDataManager () <ISImpressionDataDelegate>
@end
@implementation ISImpressionDataManager
- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
if (impressionData) {
NSMutableDictionary *ironSource = [NSMutableDictionary dictionary];
// optional fields
ironSource[@"auction_id"] = impressionData.auction_id;
ironSource[@"ad_unit"] = impressionData.ad_unit;
ironSource[@"ad_network"] = impressionData.ad_network;
ironSource[@"instance_name"] = impressionData.instance_name;
ironSource[@"instance_id"] = impressionData.instance_id;
ironSource[@"country"] = impressionData.country;
ironSource[@"placement"] = impressionData.placement;
ironSource[@"revenue"] = impressionData.revenue;
ironSource[@"precision"] = impressionData.precision;
ironSource[@"ab"] = impressionData.ab;
ironSource[@"segment_name"] = impressionData.segment_name;
ironSource[@"lifetime_revenue"] = impressionData.lifetime_revenue;
ironSource[@"encrypted_cpm"] = impressionData.encrypted_cpm;
NSMutableDictionary *adPartners = [NSMutableDictionary dictionary];
adPartners[@"ironSource"] = ironSource;
NSMutableDictionary *semanticAttributes = [NSMutableDictionary dictionary];
semanticAttributes[@"adPartners"] = adPartners;
// ironSource has a default currency of USD
semanticAttributes[@"currency"] = @"USD";
ABInAppEvent *event = [[ABInAppEvent alloc] init];
[event setCategory:@"airbridge.adImpression"];
[event setAction:impressionData.ad_network];
[event setLabel:impressionData.placement];
[event setValue:impressionData.revenue];
[event setSemantics:semanticAttributes];
[event send];
}
}
@end
@Override
public void onImpressionSuccess(ImpressionData impressionData) {
if (impressionData != null) {
Event event = new Event("airbridge.adImpression");
Map<String, Object> ironSource = new HashMap<>();
// optional fields
ironSource.put("auction_id", impressionData.getAuctionId());
ironSource.put("ad_unit", impressionData.getAdUnit());
ironSource.put("ad_network", impressionData.getAdNetwork());
ironSource.put("instance_name", impressionData.getInstanceName());
ironSource.put("instance_id", impressionData.getInstanceId());
ironSource.put("country", impressionData.getCountry());
ironSource.put("placement", impressionData.getPlacement());
ironSource.put("revenue", impressionData.getRevenue());
ironSource.put("precision", impressionData.getPrecision());
ironSource.put("ab", impressionData.getAb());
ironSource.put("segment_name", impressionData.getSegmentName());
ironSource.put("lifetime_revenue", impressionData.getLifetimeRevenue());
ironSource.put("encrypted_cpm", impressionData.getEncryptedCPM());
Map<String, Object> adPartners = new HashMap<>();
adPartners.put("ironSource", ironSource);
Map<String, Object> semanticAttributes = new HashMap<>();
semanticAttributes.put("adPartners", adPartners);
// ironSource has a default currency of USD
semanticAttributes.put("currency", "USD");
event.setAction(impressionData.getAdNetwork());
event.setLabel(impressionData.getPlacement());
event.setValue(impressionData.getRevenue());
event.setSemanticAttributes(semanticAttributes);
Airbridge.trackEvent(event);
}
}
override fun onImpressionSuccess(impressionData: ImpressionData?) {
if (impressionData != null) {
val event = Event("airbridge.adImpression")
val ironSource = mutableMapOf<String, Any?>()
// optional fields
ironSource["auction_id"] = impressionData.auctionId
ironSource["ad_unit"] = impressionData.adUnit
ironSource["ad_network"] = impressionData.adNetwork
ironSource["instance_name"] = impressionData.instanceName
ironSource["instance_id"] = impressionData.instanceId
ironSource["country"] = impressionData.country
ironSource["placement"] = impressionData.placement
ironSource["revenue"] = impressionData.revenue
ironSource["precision"] = impressionData.precision
ironSource["ab"] = impressionData.ab
ironSource["segment_name"] = impressionData.segmentName
ironSource["lifetime_revenue"] = impressionData.lifetimeRevenue
ironSource["encrypted_cpm"] = impressionData.encryptedCPM
val adPartners = mapOf("ironSource" to ironSource)
event.action = impressionData.adNetwork
event.label = impressionData.placement
event.value = impressionData.revenue
event.semanticAttributes = mutableMapOf(
"adPartners" to adPartners,
"currency" to "USD" // ironSource has a default currency of USD
)
Airbridge.trackEvent(event)
}
}
유니티 레벨플레이(아이언소스)의 서버 투 서버(S2S) 연동에 유니티 레벨플레이의 Secret Key와 Refresh Token이 필요합니다. 유니티 레벨플레이에서 확인한 Secret Key와 Refresh Token을 에어브릿지에 입력합니다.
자세한 연동 방법은 아래 가이드를 참고해 주세요.
도움이 되었나요?
#import "AirBridge.h"
#import "ISImpressionDataManager.h"
@interface ISImpressionDataManager () <ISImpressionDataDelegate>
@end
@implementation ISImpressionDataManager
- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
if (impressionData) {
NSMutableDictionary *ironSource = [NSMutableDictionary dictionary];
// optional fields
ironSource[@"auction_id"] = impressionData.auction_id;
ironSource[@"ad_unit"] = impressionData.ad_unit;
ironSource[@"ad_network"] = impressionData.ad_network;
ironSource[@"instance_name"] = impressionData.instance_name;
ironSource[@"instance_id"] = impressionData.instance_id;
ironSource[@"country"] = impressionData.country;
ironSource[@"placement"] = impressionData.placement;
ironSource[@"revenue"] = impressionData.revenue;
ironSource[@"precision"] = impressionData.precision;
ironSource[@"ab"] = impressionData.ab;
ironSource[@"segment_name"] = impressionData.segment_name;
ironSource[@"lifetime_revenue"] = impressionData.lifetime_revenue;
ironSource[@"encrypted_cpm"] = impressionData.encrypted_cpm;
NSMutableDictionary *adPartners = [NSMutableDictionary dictionary];
adPartners[@"ironSource"] = ironSource;
NSMutableDictionary *semanticAttributes = [NSMutableDictionary dictionary];
semanticAttributes[@"adPartners"] = adPartners;
// ironSource has a default currency of USD
semanticAttributes[@"currency"] = @"USD";
ABInAppEvent *event = [[ABInAppEvent alloc] init];
[event setCategory:@"airbridge.adImpression"];
[event setAction:impressionData.ad_network];
[event setLabel:impressionData.placement];
[event setValue:impressionData.revenue];
[event setSemantics:semanticAttributes];
[event send];
}
}
@end
@Override
public void onImpressionSuccess(ImpressionData impressionData) {
if (impressionData != null) {
Event event = new Event("airbridge.adImpression");
Map<String, Object> ironSource = new HashMap<>();
// optional fields
ironSource.put("auction_id", impressionData.getAuctionId());
ironSource.put("ad_unit", impressionData.getAdUnit());
ironSource.put("ad_network", impressionData.getAdNetwork());
ironSource.put("instance_name", impressionData.getInstanceName());
ironSource.put("instance_id", impressionData.getInstanceId());
ironSource.put("country", impressionData.getCountry());
ironSource.put("placement", impressionData.getPlacement());
ironSource.put("revenue", impressionData.getRevenue());
ironSource.put("precision", impressionData.getPrecision());
ironSource.put("ab", impressionData.getAb());
ironSource.put("segment_name", impressionData.getSegmentName());
ironSource.put("lifetime_revenue", impressionData.getLifetimeRevenue());
ironSource.put("encrypted_cpm", impressionData.getEncryptedCPM());
Map<String, Object> adPartners = new HashMap<>();
adPartners.put("ironSource", ironSource);
Map<String, Object> semanticAttributes = new HashMap<>();
semanticAttributes.put("adPartners", adPartners);
// ironSource has a default currency of USD
semanticAttributes.put("currency", "USD");
event.setAction(impressionData.getAdNetwork());
event.setLabel(impressionData.getPlacement());
event.setValue(impressionData.getRevenue());
event.setSemanticAttributes(semanticAttributes);
Airbridge.trackEvent(event);
}
}
override fun onImpressionSuccess(impressionData: ImpressionData?) {
if (impressionData != null) {
val event = Event("airbridge.adImpression")
val ironSource = mutableMapOf<String, Any?>()
// optional fields
ironSource["auction_id"] = impressionData.auctionId
ironSource["ad_unit"] = impressionData.adUnit
ironSource["ad_network"] = impressionData.adNetwork
ironSource["instance_name"] = impressionData.instanceName
ironSource["instance_id"] = impressionData.instanceId
ironSource["country"] = impressionData.country
ironSource["placement"] = impressionData.placement
ironSource["revenue"] = impressionData.revenue
ironSource["precision"] = impressionData.precision
ironSource["ab"] = impressionData.ab
ironSource["segment_name"] = impressionData.segmentName
ironSource["lifetime_revenue"] = impressionData.lifetimeRevenue
ironSource["encrypted_cpm"] = impressionData.encryptedCPM
val adPartners = mapOf("ironSource" to ironSource)
event.action = impressionData.adNetwork
event.label = impressionData.placement
event.value = impressionData.revenue
event.semanticAttributes = mutableMapOf(
"adPartners" to adPartners,
"currency" to "USD" // ironSource has a default currency of USD
)
Airbridge.trackEvent(event)
}
}