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 μ‚¬μš© κ°€μ΄λ“œμ—μ„œ μžμ„Έν•œ λ‚΄μš©μ„ ν™•μΈν•˜μ„Έμš”.