Unreal SDK

SDK ์„ค์น˜

๐Ÿ“˜

์—์–ด๋ธŒ๋ฆฟ์ง€ ์–ธ๋ฆฌ์–ผ 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 ๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ ์ฃผ์„ธ์š”.
  1. ์•ฑ์˜ 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์˜ ๊ฒฝ์šฐ ๋ณ„๋„์˜ ์ดˆ๊ธฐํ™” ์ž‘์—…์€ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋‚˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ๊ฐ ํ”Œ๋žซํผ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

SDK ์„ค์น˜ ํ™•์ธ

๋กœ๊ทธ๋กœ ํ™•์ธ

ํ•ด๋‹น ์•ฑ์˜ ์ž์„ธํ•œ ๋กœ๊ทธ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์œผ์‹  ๊ฒฝ์šฐ, Airbirdge Unreal SDK์—์„œ๋Š” ์–ธ๋ฆฌ์–ผ ์—๋””ํ„ฐ Project Settings ์ฐฝ์˜ Plugins > Airbridge Unreal SDK > Airbridge Configure ์˜ Log Level ํ•„๋“œ์˜ ์„ค์ •์„ ํ†ตํ•˜์—ฌ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿšง

ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์˜ต์…˜์€ Debug ๋นŒ๋“œ์—์„œ๋งŒ ๋™์ž‘ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์„ธ์š”.

๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ™•์ธ

์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์น˜ ํ›„ Airbridge ๋Œ€์‹œ๋ณด๋“œ์˜ โ†’ Raw Data โ†’ App Real-time Log ํƒญ์—์„œ ํ•ด๋‹น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿšง

Real-time Log๋Š” ์ตœ์žฅ 5๋ถ„์˜ ์ง€์—ฐ์‹œ๊ฐ„์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฅ๋งํฌ ์„ค์ •


๋Œ€์‹œ๋ณด๋“œ ์„ค์ •

๊ฐ๊ฐ 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 ํด๋ž˜์Šค์˜ ํ—ค๋” ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๋”ฅ๋งํฌ ์ฝœ๋ฐฑ ์„ค์ •์„ ์ง„ํ–‰ํ•ด ์ฃผ์„ธ์š”.

    // 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
    
    ...
    #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("[email protected]");
FAirbridgeUnreal::SetUserPhone("1(123)123-1234");
FAirbridgeUnreal::SetUserAlias(TEXT("alias1"), TEXT("value"));
  • 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์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 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("[email protected]");
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("[email protected]");
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)
	->Set(AirbridgeConstants::ATTRIBUTES::TOTAL_VALUE, 12.24);
	
FAirbridgeUnreal::TrackEvent(
	AirbridgeConstants::CATEGORY::VIEW_SEARCH_RESULT,
	UAirbridgeEventOption::CreateObject()
		->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)
	->Set(AirbridgeConstants::ATTRIBUTES::TOTAL_VALUE, 12.24);
	
FAirbridgeUnreal::TrackEvent(
	AirbridgeConstants::CATEGORY::VIEW_PRODUCT_LIST,
	UAirbridgeEventOption::CreateObject()
		->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)
	->Set(AirbridgeConstants::ATTRIBUTES::TOTAL_VALUE, 1.25);

FAirbridgeUnreal::TrackEvent(
	AirbridgeConstants::CATEGORY::ADD_TO_CART,
	UAirbridgeEventOption::CreateObject()
		->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)
	->Set(AirbridgeConstants::ATTRIBUTES::TOTAL_VALUE, 12.24);
	
FAirbridgeUnreal::TrackEvent(
	AirbridgeConstants::CATEGORY::ORDER_COMPLETE,
	UAirbridgeEventOption::CreateObject()
		->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", "2022-01-01")
					->Set("end_date", "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 ํƒญ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ์„ค์ •


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 Secret, SDK Signature Secret ID 2๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น 2๊ฐ€์ง€ ๊ฐ’์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ด๋‹น ์—์–ด๋ธŒ๋ฆฟ์ง€ CSM ์—๊ฒŒ ์ง€์›์„ ์š”์ฒญํ•ด์ฃผ์„ธ์š”.

์‚ฌ์šฉ์ž ์ •๋ณด ํ•ด์‹œํ™” ์„ค์ •

๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋“ฑ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด 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 ๋งํฌ ์ถ”์  ์„ค์ •

๊ด‘๊ณ ์ฃผ์˜ ์•ฑ ๋‚ด์—์„œ ๋‹ค์ˆ˜์˜ ๋”ฅ๋งํฌ ๋™์ž‘์œผ๋กœ ์ธํ•ด 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๊ฐ€ ์ธ์Šคํ†จ ์ด๋ฒคํŠธ์— ํฌํ•จ๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฑ ์‚ญ์ œ ์ถ”์  ์„ค์ •

Uninstall Tracking ์„ค์ • ๋ฐฉ๋ฒ•

Android Uninstall Tracking

Firebase Cloud Messaging ์„ค์ •์„ ํ†ตํ•ด ์ƒ์„ฑ๋˜์–ด์ง€๋Š” Push Token์„ ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ „๋‹ฌํ•ด ์ฃผ์„ธ์š”.

#include "AirbridgeUnreal.h"

FAirbridgeUnreal::RegisterPushToken("FIREBASE_PUSH_TOKEN");

iOS Uninstall Tracking

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 ์‚ฌ์šฉ ๊ฐ€์ด๋“œ

Blueprints ์‚ฌ์šฉ ๊ฐ€์ด๋“œ์—์„œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”.