에어브릿지 언리얼 SDK는 최소 4.23 버전 이상의 언리얼 엔진 버전을 필요로 합니다.
1. 최신 버전의 Airbridge Unreal SDK를 다운로드 받아주세요.
2. 언리얼 엔진 프로젝트의 루트 디렉터리에 Plugins
폴더를 생성해주세요.
3. 에어브릿지 언리얼 SDK 를 아래 구조와 같이 Plugins 폴더 내부로 이동시켜주세요
<YOUR_UE_PROJECT>
├── Plugins
└── AirbridgeUnrealSDK
├── Resources
├── Source
└── AirbridgeUnrealSDK.uplugin
4. 언리얼 엔진 툴바의 Settings > Plugins
를 클릭하여 Airbridge Unreal SDK 를 활성화시켜 주세요.
5. 앱의 Build.cs 파일 (<YOUR_UE_PROJECT>.Build.cs
) 내부에 있는 PublicDependencyModuleNames 배열에 AirbridgeUnreal
를 다음과 같이 추가해주세요.
public class <YOUR_UE_PROJECT> : ModuleRules
{
public <YOUR_UE_PROJECT>(ReadOnlyTargetRules Target) : base(Target)
{
...
PublicDependencyModuleNames.AddRange(new string[] { ... , "AirbridgeUnreal" }); // ADD DEPENDENCY
...
}
}
1. 언리얼 엔진 툴바의 Settings > Project Settings...
를 클릭하여 Project Settings 창을 열어주세요.
2. Plugins 항목 아래에서 Airbridge Unreal SDK
를 클릭하시면 아래와 같은 화면을 확인 할 수 있습니다.
필드 입력 완료 후 적용을 위해 반드시 아래와 같은 처리를 진행해주세요.
1. Plugins - Airbridge Unreal SDK 우측 상단의
Set as Default
를 반드시 눌러주세요. (Project > Config > DefaultAirbridge.ini
파일에 설정 값이 저장됩니다.)2. 언리얼 엔진 툴바의
Airbridge
(Update iOS Setting & Update Android Manifest) 버튼을 반드시 눌러주세요.
알립니다
Android Manifest
파일을 사용자가 직접 Merge 작업을 수행할 경우,Project > Plugins > AirbridgeUnrealSDK > Source > AirbridgeUnreal > Airbridge_UPL_Android.xml
파일을 참조하여 주세요.
언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 App Name
및 App Token
필드에 대시보드에서 설정된 앱 이름 (Unique ID)
과 앱 SDK 토큰 정보
를 각각 입력해 주세요.
해당 정보는 Airbridge 대시보드의 → Settings
→ Tokens
탭에서 확인하실 수 있습니다.
Airbridge Unreal SDK의 경우 별도의 초기화 작업은 필요로 하지 않으나 특수한 경우 각 플랫폼마다 별도의 마이그레이션 작업이 필요할 수도 있습니다.
해당 앱의 자세한 로그 정보를 확인하고 싶으신 경우, Airbirdge Unreal SDK에서는 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 Log Level
필드의 설정을 통하여 확인하실 수 있습니다.
알립니다
해당 사용자의 정보가 노출될 수 있기 때문에 해당 옵션은 Debug 빌드에서만 동작 할 수 있도록 처리해 주세요.
설정이 완료되면 어플리케이션 설치 후 Airbridge 대시보드의 → Raw Data
→ App Real-time Log
탭에서 해당 어플리케이션의 이벤트를 확인하실 수 있습니다.
각각 iOS 및 Android 플랫폼 별 딥링크 대시보드 설정은 다음과 같습니다.
언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 iOS URI Scheme
필드에 대시보드에서 설정된 iOS URI Scheme
정보를 입력해 주세요.
해당 정보는 Airbridge 대시보드의 → Tracking Link
→ Deep Link
탭에서 확인하실 수 있습니다.
언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 Android URI Scheme
필드에 대시보드에서 설정된 Android URI Scheme
정보를 입력해 주세요.
해당 정보는 Airbridge 대시보드의 → Tracking Link
→ Deep Link
탭에서 확인하실 수 있습니다.
Airbridge 대시보드에서 트래킹 링크를 생성하게 되는 경우 deeplink.page
혹은 abr.ge
형태의 트래킹 링크를 사용할 수 있지만, 고객사에서는 트래킹 링크의 브랜딩 및 클릭률(CTR)의 향상을 위해 다음과 같은 설정을 통해 go.my_company.com/abcd
와 같이 커스터마이즈 된 URL을 트래킹 링크로 사용할 수 있습니다.
사용할 커스텀 도메인을 다음 가이드와 같이 설정해 주세요.
앞서 설정한 커스텀 도메인 주소를 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 Custom Domain
필드에 입력해 주세요.
유저가 클릭한 딥링크 데이터를 전송받기 위해 다음과 같은 작업을 진행해주세요.
Content Browser > Add/Import > New C++ Class...
를 클릭한 후 Parent Class 를 Game Mode Base
로 지정하여 Game Mode Base 클래스를 생성하여 주세요.
생성된 Game Mode Base 클래스의 헤더 파일에 다음과 같은 방법을 통해 딥링크 콜백 설정을 진행해 주세요.
// ExampleGameModeBase.h
#pragma once
#include "AirbridgeCallbacks.h"
...
UCLASS()
class YOUR_UE_PROJECT_API AExampleGameModeBase : public AGameModeBase
{
GENERATED_BODY()
public:
AExampleGameModeBase();
virtual void BeginPlay() override;
// Method will be called by Airbridge when deeplink detected
UFUNCTION()
void OnDeeplinkReceived(const FString& Url);
// Register an object to receive user-clicked deep link data
UPROPERTY()
UAirbridgeCallbacks* AirbridgeCallbacks;
};
3. 생성된 Game Mode Base 클래스의 소스 코드에 다음과 같은 방법을 통해 딥링크 콜백 설정을 진행해 주세요.
...
#include "AirbridgeUnreal.h"
AExampleGameModeBase::AExampleGameModeBase()
{
AirbridgeCallbacks = CreateDefaultSubobject<UAirbridgeCallbacks>(TEXT("AIRBRIDGE_CALLBACKS"));
}
void AExampleGameModeBase::BeginPlay()
{
// Register an object to receive user-clicked deep link data
AirbridgeCallbacks->OnDeeplinkReceived.AddDynamic(this, &AExampleGameModeBase::OnDeeplinkReceived);
// Call SetDeeplinkCallback to receive user-clicked deep link data
FAirbridgeUnreal::SetDeeplinkCallback();
}
// 위와 같이 Callback을 등록하게 되면 해당 클래스는 다음과 같은 함수를 통해 딥링크 URL을 넘겨받게 됩니다.
// Method will be called by Airbridge when deeplink detected
void AExampleGameModeBase::OnDeeplinkReceived(const FString& Url)
{
}
4. 언리얼 에디터 Project Settings 창의 Project > Maps & Modes > Default Modes
의 Default GameMode
필드 값으로 딥링크 콜백 설정이 완료된 게임 모드 (e.g. ExampleGameModeBase) 를 지정해 주세요.
Airbridge Unreal SDK의 딥링크 설정이 완료 후 다음과 같은 링크들을 통하여 해당 모바일 앱의 페이지로 올바르게 이동 되는지 확인하실 수 있습니다.
scheme://
딥링크 설정 및 확인이 완료되면 Airbridge 대시보드 → Raw Data
→ App Real-time Log
탭에서 다음과 같이 확인하실 수 있습니다.
Airbridge에서는 웹(Web)과 앱(App)간의 파편화된 사용자의 기여도 측정을 위해 다음과 같은 사용자의 식별자 정보들을 수집합니다.
User Email : 이메일
User Phone : 전화번호
User ID : 사용자 고유 ID (사용자의 특정할 수 있는 ID 값으로 웹과 앱에서 1:1로 대응되어야 합니다)
User Alias : 사용자를 나타낼 수 있는 기타 ID (e.g. 로열티 프로그램용 ID, 계열사 통합 ID 등등)
알립니다
입력되어진 사용자의 이메일과 전화번호는 자동으로 해시화(SHA256)되어 서버로 전송되어 집니다.
Airbridge Unreal SDK에서는 다음과 같은 방법을 통해 사용자의 식별자 정보를 설정할 수 있습니다.
#include "AirbridgeUnreal.h"
FAirbridgeUnreal::SetUserID("personID");
FAirbridgeUnreal::SetUserEmail("persondoe@airbridge.io");
FAirbridgeUnreal::SetUserPhone("1(123)123-1234");
FAirbridgeUnreal::SetUserAlias(TEXT("alias1"), TEXT("value"));
User Alias
User Alias의 개수는
최대 10개
입니다.User Alias의 key는
String 타입
이며, 길이는최대 128자
입니다.User Alias의 key 는
^[a-z_][a-z0-9_]*$ 정규식
을 만족해야 합니다.User Alias의 value 는
String 타입
이며 String의 경우최대 128자
입니다.
사용자의 식별자 정보를 한번 설정하게 되면 모든 이벤트에 해당 식별자 정보가 함께 포함되어 전달됩니다.
MTA(Multi-Touch Attribution) 분석의 정확도 향상, 내부 데이터 분석, 서드파티(3rd Party) 솔루션 연동 등의 목적으로 사용자의 추가 속성 데이터를 설정할 수 있습니다.
#include "AirbridgeUnreal.h"
FAirbridgeUnreal::SetUserAttribute(TEXT("int_key"), 100);
FAirbridgeUnreal::SetUserAttribute(TEXT("long_key"), 1000);
FAirbridgeUnreal::SetUserAttribute(TEXT("float_key"), 3.14F);
FAirbridgeUnreal::SetUserAttribute(TEXT("boolean_key"), true);
FAirbridgeUnreal::SetUserAttribute(TEXT("string_key"), TEXT("airbridge"));
User Attribute
User Attribute의 개수는
최대 100개
입니다.User Attribute의 key는
String 타입
이며, 길이는최대 128자
입니다.User Attribute의 key는
^[a-z_][a-z0-9_]*$ 정규식
을 만족해야 합니다.User Attribute의 value는
Integer, Float, Long, Boolean 타입
과String 타입
이며 String의 경우최대 1024자
입니다.
Airbridge Unreal SDK에서 설정한 유저 정보는 Airbridge 대시보드 → Raw Data
→ App Real-time Log
탭에서 다음과 같이 확인하실 수 있습니다.
SDK에 디바이스 식별자 정보를 설정해 이후 수집되는 모든 이벤트에 디바이스 식별정보를 포함시킬 수 있습니다. 디바이스 식별자가 설정되면 별도로 삭제하지 않을 경우 앱 종료 여부에 관계없이 계속 유지됩니다.
#include "AirbridgeUnreal.h"
FAirbridgeUnreal::SetDeviceAlias(TEXT("ADD_YOUR_KEY"), TEXT("AND_YOUR_VALUE"));
FAirbridgeUnreal::RemoveDeviceAlias(TEXT("DELETE_THIS_KEY"));
FAirbridgeUnreal::ClearDeviceAlias();
메소드 | 설명 |
---|---|
SetDeviceAlias(const FString& Key, const FString& Value) | 전달한 Key와 Value 쌍을 디바이스 식별자에 추가합니다. |
RemoveDeviceAlias(const FString& Key) | 전달한 Key에 해당하는 디바이스 식별자를 삭제합니다. 해당하는 식별자가 없을 경우 아무런 동작을 하지 않습니다. |
ClearDeviceAlias() | 모든 디바이스 식별자를 삭제합니다. |
Airbridge Unreal SDK에서 호출하는 모든 이벤트들은 다음과 같이 6개의 하위 속성 값들과 함께 전송할 수 있습니다.
Event Category : 이벤트의 이름 Required
(FString)
Event Action : 이벤트 하위 속성값 1 (FString)
Event Label : 이벤트 하위 속성값 2 (FString)
Event Value : 이벤트 하위 속성값 3 (double)
Event Custom Attributes : 이벤트 하위의 커스텀 데이터 (UAirbridgeMap Class)
Event Semantic Attributes : 이벤트 하위의 시멘틱 데이터 (UAirbridgeMap Class)
Airbridge Unreal SDK에서는 편의를 위해 다음과 같은 3가지 유저 이벤트를 제공하고 있습니다.
회원가입 (Sign up)
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
FAirbridgeUnreal::SetUserID("personID");
FAirbridgeUnreal::SetUserEmail("persondoe@airbridge.io");
FAirbridgeUnreal::SetUserPhone("1(123)123-1234");
FAirbridgeUnreal::SetUserAlias(TEXT("alias1"), TEXT("value"));
FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::SIGN_UP);
로그인 (Sign in)
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
FAirbridgeUnreal::SetUserID("personID");
FAirbridgeUnreal::SetUserEmail("persondoe@airbridge.io");
FAirbridgeUnreal::SetUserPhone("1(123)123-1234");
FAirbridgeUnreal::SetUserAlias(TEXT("alias1"), TEXT("value"));
FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::SIGN_IN);
로그아웃 (Sign out)
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::SIGN_OUT);
FAirbridgeUnreal::ClearUser();
Airbridge Unreal SDK에서는 편의를 위해 다음과 같은 상품 클래스와 함께 이커머스 이벤트를 제공하고 있습니다.
UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
홈 화면 (Home Screen)
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::VIEW_HOME);
검색 결과 조회 (Search Results)
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
UAirbridgeList* Beverages = UAirbridgeList::CreateObject();
UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
Beverages->Add(Cocacola);
UAirbridgeMap* Fanta = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::PRODUCT::ID, "beverage_2")
->Set(AirbridgeConstants::PRODUCT::NAME, "Fanta")
->Set(AirbridgeConstants::PRODUCT::PRICE, 10.99)
->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
->Set(AirbridgeConstants::PRODUCT::POSITION, 1);
Beverages->Add(Fanta);
UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::ATTRIBUTES::QUERY, "SELECT * FROM beverages")
->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Beverages);
FAirbridgeUnreal::TrackEvent(
AirbridgeConstants::CATEGORY::VIEW_SEARCH_RESULT,
UAirbridgeEventOption::CreateObject()
->SetValue(12.24)
->SetSemanticAttributes(SemanticAttributes)
);
// Optional (Remove the resource immediately)
SemanticAttributes->ConditionalBeginDestroy();
Fanta->ConditionalBeginDestroy();
Cocacola->ConditionalBeginDestroy();
Fanta->ConditionalBeginDestroy();
Beverages->ConditionalBeginDestroy();
상품 리스트 조회 (Product List)
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
UAirbridgeList* Beverages = UAirbridgeList::CreateObject();
UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
Beverages->Add(Cocacola);
UAirbridgeMap* Fanta = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::PRODUCT::ID, "beverage_3")
->Set(AirbridgeConstants::PRODUCT::NAME, "Fanta")
->Set(AirbridgeConstants::PRODUCT::PRICE, 10.99)
->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
->Set(AirbridgeConstants::PRODUCT::POSITION, 2);
Beverages->Add(Fanta);
UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::ATTRIBUTES::PRODUCT_LIST_ID, "beverage_list_0")
->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Beverages);
FAirbridgeUnreal::TrackEvent(
AirbridgeConstants::CATEGORY::VIEW_PRODUCT_LIST,
UAirbridgeEventOption::CreateObject()
->SetValue(12.24)
->SetSemanticAttributes(SemanticAttributes)
);
// Optional (Remove the resource immediately)
SemanticAttributes->ConditionalBeginDestroy();
Fanta->ConditionalBeginDestroy();
Cocacola->ConditionalBeginDestroy();
Beverages->ConditionalBeginDestroy();
상품 상세 페이지 조회 (Product Details)
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
UAirbridgeList* Products = UAirbridgeList::CreateObject();
UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
Products->Add(Cocacola);
UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Products);
FAirbridgeUnreal::TrackEvent(
AirbridgeConstants::CATEGORY::VIEW_PRODUCT_DETAILS,
UAirbridgeEventOption::CreateObject()
->SetSemanticAttributes(SemanticAttributes)
);
// Optional (Remove the resource immediately)
SemanticAttributes->ConditionalBeginDestroy();
Cocacola->ConditionalBeginDestroy();
Products->ConditionalBeginDestroy();
장바구니 담기 (Add to Cart)
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
UAirbridgeList* Products = UAirbridgeList::CreateObject();
UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
Products->Add(Cocacola);
UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Products);
FAirbridgeUnreal::TrackEvent(
AirbridgeConstants::CATEGORY::ADD_TO_CART,
UAirbridgeEventOption::CreateObject()
->SetValue(1.25)
->SetSemanticAttributes(SemanticAttributes)
);
// Optional (Remove the resource immediately)
SemanticAttributes->ConditionalBeginDestroy();
Cocacola->ConditionalBeginDestroy();
Products->ConditionalBeginDestroy();
결제 완료 (Order Complete)
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
UAirbridgeList* Beverages = UAirbridgeList::CreateObject();
UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
Beverages->Add(Cocacola);
UAirbridgeMap* Fanta = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::PRODUCT::ID, "beverage_3")
->Set(AirbridgeConstants::PRODUCT::NAME, "Fanta")
->Set(AirbridgeConstants::PRODUCT::PRICE, 10.99)
->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
->Set(AirbridgeConstants::PRODUCT::POSITION, 2);
Beverages->Add(Fanta);
UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::ATTRIBUTES::TRANSACTION_ID, "transaction_123")
->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Beverages)
->Set(AirbridgeConstants::ATTRIBUTES::IN_APP_PURCHASED, true);
FAirbridgeUnreal::TrackEvent(
AirbridgeConstants::CATEGORY::ORDER_COMPLETE,
UAirbridgeEventOption::CreateObject()
->SetValue(1.25)
->SetSemanticAttributes(SemanticAttributes)
);
// Optional (Remove the resource immediately)
SemanticAttributes->ConditionalBeginDestroy();
Fanta->ConditionalBeginDestroy();
Cocacola->ConditionalBeginDestroy();
Fanta->ConditionalBeginDestroy();
Beverages->ConditionalBeginDestroy();
Airbridge Unreal SDK에서는 다음과 같은 방법을 통해 커스터마이즈 된 이벤트를 전송할 수 있습니다.
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"
FAirbridgeUnreal::TrackEvent(
"category",
UAirbridgeEventOption::CreateObject()
->SetAction("action")
->SetLabel("label")
->SetValue(100.99)
// Custom Attributes
->SetCustomAttributes(
UAirbridgeMap::CreateObject()
->Set("model", "MMM")
->Set("report", UAirbridgeMap::CreateObject()
->Set("start_date", TEXT"2022-01-01")
->Set("end_date", TEXT"2022-12-31")
->Set("channel_attributions", UAirbridgeList::CreateObject()
->Add(UAirbridgeMap::CreateObject()
->Set("channel", "Paid Search")
->Set("attributed_conversions", 100)
->Set("attributed_revenue", 1000)
)
->Add(UAirbridgeMap::CreateObject()
->Set("channel", "Organic Search")
->Set("attributed_conversions", 75)
->Set("attributed_revenue", 500)
)
->Add(UAirbridgeMap::CreateObject()
->Set("channel", "Email")
->Set("attributed_conversions", 50)
->Set("attributed_revenue", 250)
)
)
)
)
// Semantic Attributes
->SetSemanticAttributes(UAirbridgeMap::CreateObject()
->Set(AirbridgeConstants::ATTRIBUTES::QUERY, "query_123"))
);
위의 코드를 통해서 서버에 전송되는 이벤트 payload는 다음과 같습니다.
{
"category": "category",
"action": "action",
"label": "label",
"value": 100.99,
"customAttributes": {
"model": "MMM",
"report": {
"start_date": "2022-01-01",
"end_date": "2022-12-31",
"channel_attributions": [
{
"channel": "Paid Search",
"attributed_conversions": 100,
"attributed_revenue": 1000
},
{
"channel": "Organic Search",
"attributed_conversions": 75,
"attributed_revenue": 500
},
{
"channel": "Email",
"attributed_conversions": 50,
"attributed_revenue": 250
}
]
}
},
"semanticAttributes": {
"query": "query_123"
}
}
알립니다
Semantic Attributes
를 직접 구성하여 전달하기 위해서는 다음 페이지를 참조해 주세요.
Airbridge Unreal SDK에서 전송된 이벤트 정보는 Airbridge 대시보드 → Raw Data
→ App Real-time Log
탭에서 다음과 같이 확인하실 수 있습니다.
Airbirdge Unreal SDK에서는 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 Sdk Signature Secret ID
필드와 Sdk Signature Secret
필드의 설정을 통해 SDK 를 SDK Spoofing 으로 부터 보호할 수 있습니다.
알립니다
SDK Signature를 설정하기 위해서는 SDK Signature 보안 정보가 필요합니다. SDK Signature 보안 정보를 생성하기 위한 자세한 내용은 에어브릿지 가이드를 참고해 주세요.
내부의 데이터 분석 등의 목적을 위해 HASH(SHA256)하지 않고 사용자의 식별자 정보를 전송하고 싶은 경우, 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 User Info Hash Enabled
필드의 설정을 통해 User Email 그리고 User Phone 정보의 해시화(SHA256)를 중단할 수 있습니다.
주의하세요
해당 옵션은
User Email
과User Phone
등 민감한 개인정보를 제 3자에게 제공하기 때문에 내부적으로 별도의 보안 조치가 선행되어져야 합니다.
Airbirdge Unreal SDK에서는 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 Session Timeout Seconds
필드의 설정을 통해 설정된 세션 시간 내에 유저가 앱을 재 실행 하더라도 같은 세션으로 판단하여 앱 실행 이벤트를 다시 보내지 않도록 할 수 있습니다.
해당 기능은 GDPR이나 CCPA와 같이 고객으로부터 개인정보보호에 대한 동의를 받아 데이터 수집 및 전송을 진행하는 경우에 유용한 기능입니다.
언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 Auto Start Tracking Enabled
필드의 설정을 이용하여 데이터 수집과 전송을 명시적으로 시작할 수 있습니다.
해당 기능을 비활성화한 경우에 다음과 같은 함수를 명시적으로 호출해야 올바르게 데이터 수집이 이루어지게 됩니다.
#include "AirbridgeUnreal.h"
FAirbridgeUnreal::StartTracking();
광고주의 앱 내에서 다수의 딥링크 동작으로 인해 Airbridge를 통한 Re-engagement 성과를 한눈에 확인하기 어려운 경우, 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 Track Airbridge Link Only
필드의 설정을 통하여 Airbridge 딥링크를 통해 들어온 성과만 필터링하도록 설정할 수 있습니다.
딥링크 성과 확인
해당 기능을 활성화할 경우 아래의 조건을 만족한 딥링크를 통해 앱이 오픈 된 경우에 한하여 딥링크 성과로 측정합니다.
대시보드에 등록된 형태의 딥링크를 통해 앱이 오픈 된 경우
airbridge.io
딥링크를 통해 앱이 오픈 된 경우
deeplink.page
딥링크를 통해 앱이 오픈 된 경우
airbridge_referrer
query 정보가 존재하는 경우
Airbridge Unreal SDK에서는 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 Location Collection Enabled
필드의 설정을 통하여 유저의 위치 정보를 수집할 수 있습니다.
해당 기능은 오직 안드로이드에서 사용 가능하며 다음과 같은 권한이 AndroidManifest.xml
에 포함되어야 합니다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
주의하세요
위치 정보는 합법적인 목적과 방법을 통하여 수집되어야 하므로 본 기능 사용에 주의가 요구됩니다.
iOS 14의 정책 변화에 따라 iOS에서 앱 추적 허용 설정(App Tracking Transparency)을 통하여 사용자에게 동의를 얻어야 올바르게 IDFA
정보를 수집할 수 있습니다.
Airbridge Unreal SDK에서는 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure
의 iOS Tracking Authorize Timeout Seconds
설정을 통해 설치 이벤트를 지연하여 올바르게 IDFA
가 인스톨 이벤트에 포함되도록 설정할 수 있습니다.
Firebase Cloud Messaging 설정을 통해 생성되어지는 Push Token을 다음 가이드를 참고하여 전달해 주세요.
#include "AirbridgeUnreal.h"
FAirbridgeUnreal::RegisterPushToken("FIREBASE_PUSH_TOKEN");
APNs Device Token을 다음 가이드를 참고하여 전달해 주세요.
#include "AirbridgeUnreal.h"
FAirbridgeUnreal::RegisterPushToken("APNS_DEVICE_TOKEN");
Web SDK만의 설치로는 앱 설치 및 실행 또는 딥링크 호출 등의 추가적인 이벤트를 트래킹 할 수가 없습니다. Airbridge 에서는 다음과 같은 설정을 통하여 쉽게 하이브리드 앱에서 인앱 이벤트를 호출할 수 있습니다.
#include "AirbridgeUnreal.h"
TUniquePtr<IAirbridgeWebInterface> AirbridgeWebInterface;
AirbridgeWebInterface = TUniquePtr<IAirbridgeWebInterface>(FAirbridgeUnreal::CreateWebInterface(
TEXT("YOUR_WEB_TOKEN"), // web token
[](const FString& Msg) -> FString // post command function
{
return TEXT("...");
}
));
알립니다
FAirbridgeUnreal::CreateWebInterface
를 통해서 Web Interface 를 제어 할 수 있습니다.
Blueprints 사용 가이드에서 자세한 내용을 확인하세요.
Airbridge Unreal SDK v1.3.4 부터 com.google.android.gms:play-services-appset:16.0.2 dependency가 추가됨으로 인하여 AndroidX가 도입되어 Unreal Plugin Language (UPL)
파일에 아래 설정을 추가해야 합니다.
<gradleProperties>
<insert>
android.useAndroidX=true
android.enableJetifier=true
</insert>
</gradleProperties>
<baseBuildGradleAdditions>
<insert>
allprojects {
def classMap = [
'android.support.annotation': 'androidx.annotation',
'android.support.v4.app.ActivityCompat': 'androidx.core.app.ActivityCompat',
'android.support.v4.app.NotificationCompat': 'androidx.core.app.NotificationCompat',
'android.support.v4.app.NotificationManagerCompat': 'androidx.core.app.NotificationManagerCompat',
'android.support.v4.content.ContextCompat': 'androidx.core.content.ContextCompat',
'android.support.v4.content.FileProvider': 'androidx.core.content.FileProvider',
'android.support.v13.app.FragmentCompat': 'androidx.legacy.app.FragmentCompat',
'android.arch.lifecycle': 'androidx.lifecycle',
'android.arch.lifecycle.Lifecycle': 'androidx.lifecycle.Lifecycle',
'android.arch.lifecycle.LifecycleObserver': 'androidx.lifecycle.LifecycleObserver',
'android.arch.lifecycle.OnLifecycleEvent': 'androidx.lifecycle.OnLifecycleEvent',
'android.arch.lifecycle.ProcessLifecycleOwner': 'androidx.lifecycle.ProcessLifecycleOwner',
]
afterEvaluate { project ->
project.rootProject.projectDir.traverse(type: groovy.io.FileType.FILES, nameFilter: ~/.*\.java$/) { f ->
classMap.each { entry ->
if (f.getText('UTF-8').contains(entry.key)) {
println "Change ${entry.key} to ${entry.value} in file ${f}"
ant.replace(file: f, token: entry.key, value: entry.value)
}
}
}
}
}
</insert>
</baseBuildGradleAdditions>
AndroidX 적용을 위한 추가 작업이 필요하지 않습니다.
Airbridge Unreal SDK v1.3.4 부터 com.google.android.gms:play-services-appset:16.0.2 dependency가 추가됨으로 인하여 dependency resolution 해결을 위하여 Unreal Plugin Language (UPL)
파일에 아래 설정을 추가해야 합니다.
<baseBuildGradleAdditions>
<insert>
allprojects {
subprojects {
project.configurations.all {
resolutionStrategy {
force 'com.google.android.gms:play-services-base:11.8.0'
force 'com.google.android.gms:play-services-basement:11.8.0'
force 'com.google.android.gms:play-services-tasks:11.8.0'
}
}
}
}
</insert>
</baseBuildGradleAdditions>
알립니다
언리얼 엔진 4.23 버전 ~ 5.1.0 버전에서는 Airbridge Unreal SDK v1.3.4 부터 추가된 App set ID support 기능을 사용할 수 없습니다.
dependency resolution 해결을 위한 추가 작업이 필요하지 않습니다.
SDK 업데이트 시, `이전버전` ~ `이후버전` 사이에 해당하는 버전들에 해당하는 내용들을 고려해주세요.
App set ID를 지원하기 위해 com.google.android.gms:play-services-appset:16.0.2 dependency가 추가되었습니다. Troubleshooting > Android
가이드를 참고하여 AndroidX 적용과 dependency resolution 해결을 위한 코드를 적용 후 Android 빌드를 진행해주세요.
알립니다
언리얼 엔진 4.23 버전 ~ 5.1.0 버전에서는 Airbridge Unreal SDK v1.3.4 부터 추가된 App set ID support 기능을 사용할 수 없습니다.
딥링크 콜백에서 제공하는 딥링크 URL 이 에어브릿지 대시보드에 입력된 내용을 2번 디코딩하여 제공하는 문제가 1.2.0 ~ 1.2.1 에 있었던 것이 해결되었습니다.
딥링크 콜백에서 제공하는 딥링크 URL 에 더이상 airbridge_referrer 가 추가되지 않게 됩니다.
도움이 되었나요?