Unreal SDK

SDK 설치

에어브릿지 언리얼 SDK는 최소 4.23 버전 이상의 언리얼 엔진 버전을 필요로 합니다.

패키지 설치

1. 최신 버전의 Airbridge Unreal SDK를 다운로드 받아주세요.

2. 언리얼 엔진 프로젝트의 루트 디렉터리에 Plugins폴더를 생성해주세요.

3. 에어브릿지 언리얼 SDK 를 아래 구조와 같이 Plugins 폴더 내부로 이동시켜주세요

123456
<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 를 다음과 같이 추가해주세요.

123456789
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의 경우 별도의 초기화 작업은 필요로 하지 않으나 특수한 경우 각 플랫폼마다 별도의 마이그레이션 작업이 필요할 수도 있습니다.

SDK 설치 확인

로그로 확인

해당 앱의 자세한 로그 정보를 확인하고 싶으신 경우, Airbirdge Unreal SDK에서는 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure 의 Log Level 필드의 설정을 통하여 확인하실 수 있습니다.

알립니다

해당 사용자의 정보가 노출될 수 있기 때문에 해당 옵션은 Debug 빌드에서만 동작 할 수 있도록 처리해 주세요.

대시보드에서 확인

설정이 완료되면 어플리케이션 설치 후 Airbridge 대시보드의 → Raw Data → App Real-time Log 탭에서 해당 어플리케이션의 이벤트를 확인하실 수 있습니다.

딥링크 설정

대시보드 설정

각각 iOS 및 Android 플랫폼 별 딥링크 대시보드 설정은 다음과 같습니다.

프로젝트 설정

iOS 딥링크 설정

언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure 의 iOS URI Scheme 필드에 대시보드에서 설정된 iOS URI Scheme 정보를 입력해 주세요.

해당 정보는 Airbridge 대시보드의 → Tracking Link → Deep Link 탭에서 확인하실 수 있습니다.

Android 딥링크 설정

언리얼 에디터 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을 트래킹 링크로 사용할 수 있습니다.

  1. 사용할 커스텀 도메인을 다음 가이드와 같이 설정해 주세요.

  2. 앞서 설정한 커스텀 도메인 주소를 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure 의 Custom Domain 필드에 입력해 주세요.

딥링크 콜백 설정

유저가 클릭한 딥링크 데이터를 전송받기 위해 다음과 같은 작업을 진행해주세요.

  1. Content Browser > Add/Import > New C++ Class... 를 클릭한 후 Parent Class 를 Game Mode Base 로 지정하여 Game Mode Base 클래스를 생성하여 주세요.

  2. 생성된 Game Mode Base 클래스의 헤더 파일에 다음과 같은 방법을 통해 딥링크 콜백 설정을 진행해 주세요.

Header File
12345678910111213141516171819202122232425
// 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 클래스의 소스 코드에 다음과 같은 방법을 통해 딥링크 콜백 설정을 진행해 주세요.

ExampleGameModeBase.cpp
1234567891011121314151617181920212223
...
#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에서는 다음과 같은 방법을 통해 사용자의 식별자 정보를 설정할 수 있습니다.

C++
123456
#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) 솔루션 연동 등의 목적으로 사용자의 추가 속성 데이터를 설정할 수 있습니다.

C++
1234567
#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에 디바이스 식별자 정보를 설정해 이후 수집되는 모든 이벤트에 디바이스 식별정보를 포함시킬 수 있습니다. 디바이스 식별자가 설정되면 별도로 삭제하지 않을 경우 앱 종료 여부에 관계없이 계속 유지됩니다.

c++
12345
#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)

C++
123456789
#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)

C++
123456789
#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)

C++
12345
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"

FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::SIGN_OUT);
FAirbridgeUnreal::ClearUser();

이커머스 이벤트 전송

Airbridge Unreal SDK에서는 편의를 위해 다음과 같은 상품 클래스와 함께 이커머스 이벤트를 제공하고 있습니다.

C++
1234567
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)

C++
1234
#include "AirbridgeUnreal.h"
#include "Airbridge/AirbridgeConstants.h"

FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::VIEW_HOME);

  • 검색 결과 조회 (Search Results)

C++
12345678910111213141516171819202122232425262728293031323334353637383940
#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)

C++
123456789101112131415161718192021222324252627282930313233343536373839
#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)

C++
123456789101112131415161718192021222324252627
#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)

C++
12345678910111213141516171819202122232425262728
#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)

C++
1234567891011121314151617181920212223242526272829303132333435363738394041
#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에서는 다음과 같은 방법을 통해 커스터마이즈 된 이벤트를 전송할 수 있습니다.

C++
123456789101112131415161718192021222324252627282930313233343536373839
#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는 다음과 같습니다.

123456789101112131415161718192021222324252627282930313233
{
    "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 탭에서 다음과 같이 확인하실 수 있습니다.

고급 설정

SDK Signature 설정

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 필드의 설정을 이용하여 데이터 수집과 전송을 명시적으로 시작할 수 있습니다.

해당 기능을 비활성화한 경우에 다음과 같은 함수를 명시적으로 호출해야 올바르게 데이터 수집이 이루어지게 됩니다.

C++
123
#include "AirbridgeUnreal.h"

FAirbridgeUnreal::StartTracking();

Airbridge 링크 추적 설정

광고주의 앱 내에서 다수의 딥링크 동작으로 인해 Airbridge를 통한 Re-engagement 성과를 한눈에 확인하기 어려운 경우, 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure 의 Track Airbridge Link Only 필드의 설정을 통하여 Airbridge 딥링크를 통해 들어온 성과만 필터링하도록 설정할 수 있습니다.

딥링크 성과 확인

해당 기능을 활성화할 경우 아래의 조건을 만족한 딥링크를 통해 앱이 오픈 된 경우에 한하여 딥링크 성과로 측정합니다.

  • 대시보드에 등록된 형태의 딥링크를 통해 앱이 오픈 된 경우

  • airbridge.io딥링크를 통해 앱이 오픈 된 경우

  • deeplink.page딥링크를 통해 앱이 오픈 된 경우

  • airbridge_referrerquery 정보가 존재하는 경우

위치 정보 수집

Airbridge Unreal SDK에서는 언리얼 에디터 Project Settings 창의 Plugins > Airbridge Unreal SDK > Airbridge Configure 의 Location Collection Enabled 필드의 설정을 통하여 유저의 위치 정보를 수집할 수 있습니다.

해당 기능은 오직 안드로이드에서 사용 가능하며 다음과 같은 권한이 AndroidManifest.xml에 포함되어야 합니다.

12
<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가 인스톨 이벤트에 포함되도록 설정할 수 있습니다.

앱 삭제 추적 설정

Uninstall Tracking 설정 방법

Android Uninstall Tracking

Firebase Cloud Messaging 설정을 통해 생성되어지는 Push Token을 다음 가이드를 참고하여 전달해 주세요.

C++
123
#include "AirbridgeUnreal.h"

FAirbridgeUnreal::RegisterPushToken("FIREBASE_PUSH_TOKEN");

iOS Uninstall Tracking

APNs Device Token을 다음 가이드를 참고하여 전달해 주세요.

C++
123
#include "AirbridgeUnreal.h"

FAirbridgeUnreal::RegisterPushToken("APNS_DEVICE_TOKEN");

하이브리드 앱 설정

Web SDK만의 설치로는 앱 설치 및 실행 또는 딥링크 호출 등의 추가적인 이벤트를 트래킹 할 수가 없습니다. Airbridge 에서는 다음과 같은 설정을 통하여 쉽게 하이브리드 앱에서 인앱 이벤트를 호출할 수 있습니다.

C++
1234567891011
#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 사용 가이드

Blueprints 사용 가이드에서 자세한 내용을 확인하세요.

Troubleshooting


Android

1. AndroidX 적용

- 언리얼 엔진 4.23 버전 ~ 5.1.0 버전

Airbridge Unreal SDK v1.3.4 부터 com.google.android.gms:play-services-appset:16.0.2 dependency가 추가됨으로 인하여 AndroidX가 도입되어 Unreal Plugin Language (UPL) 파일에 아래 설정을 추가해야 합니다.

12345678910111213141516171819202122232425262728293031323334353637
<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>

- 언리얼 엔진 5.1.1 또는 이후 버전

AndroidX 적용을 위한 추가 작업이 필요하지 않습니다.

2. Google Play services

- 언리얼 엔진 4.23 버전 ~ 5.1.0 버전

Airbridge Unreal SDK v1.3.4 부터 com.google.android.gms:play-services-appset:16.0.2 dependency가 추가됨으로 인하여 dependency resolution 해결을 위하여 Unreal Plugin Language (UPL) 파일에 아래 설정을 추가해야 합니다.

123456789101112131415
<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 기능을 사용할 수 없습니다.

- 언리얼 엔진 5.1.1 또는 이후 버전

dependency resolution 해결을 위한 추가 작업이 필요하지 않습니다.

마이그레이션 가이드


SDK 업데이트 시, `이전버전` ~ `이후버전` 사이에 해당하는 버전들에 해당하는 내용들을 고려해주세요.

1.3.4

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 기능을 사용할 수 없습니다.

1.3.0

딥링크 콜백에서 제공하는 딥링크 URL 이 에어브릿지 대시보드에 입력된 내용을 2번 디코딩하여 제공하는 문제가 1.2.0 ~ 1.2.1 에 있었던 것이 해결되었습니다.

1.2.0

딥링크 콜백에서 제공하는 딥링크 URL 에 더이상 airbridge_referrer 가 추가되지 않게 됩니다.

도움이 되었나요?

더 필요한 내용이 있나요?