SDK ์„ค์น˜

๐Ÿ“˜

์—์–ด๋ธŒ๋ฆฟ์ง€ ์œ ๋‹ˆํ‹ฐ SDK๋Š” ์ตœ์†Œ 2018.4 ๋ฒ„์ „ ์ด์ƒ์˜ ์œ ๋‹ˆํ‹ฐ ๋ฒ„์ „์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿšง

์—์–ด๋ธŒ๋ฆฟ์ง€ ์œ ๋‹ˆํ‹ฐ SDK๋Š” unity-jar-resolver(External Dependency Manager for Unity)๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Airbridge Unity SDK 1.9.3 ๋ฏธ๋งŒ์˜ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ ํ•ด๋‹น ์œ ๋‹ˆํ‹ฐ ํŒจํ‚ค์ง€ ์„ค์ •์„ ์™„๋ฃŒํ•ด ์ฃผ์„ธ์š”.

Airbridge Unity SDK 1.9.3 ์ด์ƒ์˜ ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” Airbridge Plugin ๊ณผ EDM4U ์—์…‹์„ ๋ชจ๋‘ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์œ ๋‹ˆํ‹ฐ ํŒจํ‚ค์ง€ ์„ค์ •์„ ํ•˜์‹ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์„ค์น˜

  1. ์ตœ์‹  ๋ฒ„์ „์˜ Airbridge Unity SDK๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์ฃผ์„ธ์š”.
  2. ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ Assets > Import Package > Custom Package ... ๋ฅผ ํด๋ฆญํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.
  3. ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 ํƒญ์„ ํ™•์ธ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์„ค์ •

์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings ๋ฅผ ํด๋ฆญํ•˜์‹œ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿšง

ํ•„๋“œ ์ž…๋ ฅ ์™„๋ฃŒ ํ›„ ์ ์šฉ์„ ์œ„ํ•ด Update iOS App Setting ํ˜น์€ Update Android Manifest๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”.

๐Ÿšง

Android Manifest ํŒŒ์ผ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ Merge ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ, Project > Plugins > Airbridge > Android > AndroidManifest.xml ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ ์ฃผ์„ธ์š”.

์•ฑ ์ •๋ณด ์„ค์ •

์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ App Name ๋ฐ App Token ํ•„๋“œ์— ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์„ค์ •๋œ ์•ฑ ์ด๋ฆ„ (Unique ID)๊ณผ ์•ฑ SDK ํ† ํฐ ์ •๋ณด๋ฅผ ๊ฐ๊ฐ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.

ํ•ด๋‹น ์ •๋ณด๋Š” Airbridge ๋Œ€์‹œ๋ณด๋“œ์˜ โ†’ Settings โ†’ Tokens ํƒญ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2520

์ดˆ๊ธฐํ™”

Airbridge Unity SDK์˜ ๊ฒฝ์šฐ ๋ณ„๋„์˜ ์ดˆ๊ธฐํ™” ์ž‘์—…์€ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋‚˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ๊ฐ ํ”Œ๋žซํผ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์—์–ด๋ธŒ๋ฆฟ์ง€ SDK์˜ ๊ธฐ๋ณธ ์„ค์น˜ ๋ฐ ์„ค์ •์ด ์™„๋ฃŒ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค์„ ํ†ตํ•ด์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ • ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ•ด๋‹น ์•ฑ์˜ ์ž์„ธํ•œ ๋กœ๊ทธ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์œผ์‹  ๊ฒฝ์šฐ, ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ Log Level ํ•„๋“œ ์„ค์ •์„ ํ†ตํ•˜์—ฌ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๐Ÿšง

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

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


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

๊ฐ๊ฐ iOS ๋ฐ Android ํ”Œ๋žซํผ ๋ณ„ ๋”ฅ๋งํฌ ๋Œ€์‹œ๋ณด๋“œ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์„ค์ •

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

์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ iOS URI Scheme ํ•„๋“œ์— ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์„ค์ •๋œ iOS URI Scheme ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.

ํ•ด๋‹น ์ •๋ณด๋Š” Airbridge ๋Œ€์‹œ๋ณด๋“œ์˜ โ†’ Tracking Link โ†’ Deep Link ํƒญ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ 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. ์•ž์„œ ์„ค์ •ํ•œ ์ปค์Šคํ…€ ๋„๋ฉ”์ธ ์ฃผ์†Œ๋ฅผ ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ Custom Domain ํ•„๋“œ์— ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.

๋”ฅ๋งํฌ ์ฝœ๋ฐฑ ์„ค์ •

์œ ์ €๊ฐ€ ํด๋ฆญํ•œ ๋”ฅ๋งํฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก๋ฐ›๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ์˜ค๋ธŒ์ ํŠธ๋ช…์„ ๋“ฑ๋กํ•ด ์ฃผ์„ธ์š”.

private void Awake() { AirbridgeUnity.SetDeeplinkCallback("AirbridgeManager"); }

์œ„์™€ ๊ฐ™์ด Callback์„ ๋“ฑ๋กํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋”ฅ๋งํฌ URL์„ ๋„˜๊ฒจ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

using UnityEngine; public class AirbridgeManager : MonoBehaviour { private void Awake() { Airbridge.SetDeeplinkCallback("AirbridgeManager"); } // Method will call by Airbridge when deeplink detected private void OnTrackingLinkResponse(string url) { } }

๐Ÿ“˜

Airbridge Unity๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Unity์—์„œ ์ œ๊ณตํ•˜๋Š” UnitySendMessage ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ๋”ฅ๋งํฌ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฅ๋งํฌ ์„ค์ • ํ™•์ธ

Airbridge Unity 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 Unity SDK์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ์‹๋ณ„์ž ์ •๋ณด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dictionary<string, string> alias = new Dictionary<string, string>(); AirbridgeUser user = new AirbridgeUser(); user.SetId(UserId); user.SetEmail(Email); user.SetPhoneNumber(Phone); user.SetAlias(alias); AirbridgeUnity.SetUser(user);
  • 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) ์†”๋ฃจ์…˜ ์—ฐ๋™ ๋“ฑ์˜ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ถ”๊ฐ€ ์†์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dictionary<string, object> attrs = new Dictionary<string, object>(); AirbridgeUser user = new AirbridgeUser(); user.SetAttributes(attrs); AirbridgeUnity.SetUser(user);
  • 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 Unity SDK์—์„œ ์„ค์ •ํ•œ ์œ ์ € ์ •๋ณด๋Š” Airbridge ๋Œ€์‹œ๋ณด๋“œ โ†’ Raw Data โ†’ App Real-time Log ํƒญ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””๋ฐ”์ด์Šค ์„ค์ •


๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž ์„ค์ •

SDK์— ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž ์ •๋ณด๋ฅผ ์„ค์ •ํ•ด ์ดํ›„ ์ˆ˜์ง‘๋˜๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ์— ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ •๋ณด๋ฅผ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž๊ฐ€ ์„ค์ •๋˜๋ฉด ๋ณ„๋„๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์•ฑ ์ข…๋ฃŒ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๊ณ„์† ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

AirbridgeUnity.SetDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE"); AirbridgeUnity.RemoveDeviceAlias("DELETE_THIS_KEY"); AirbridgeUnity.ClearDeviceAlias();
๋ฉ”์†Œ๋“œ์„ค๋ช…
SetDeviceAlias(string key, string value)์ „๋‹ฌํ•œ Key์™€ Value ์Œ์„ ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
RemoveDeviceAlias(string key)์ „๋‹ฌํ•œ Key์— ํ•ด๋‹นํ•˜๋Š” ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹นํ•˜๋Š” ์‹๋ณ„์ž๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์•„๋ฌด๋Ÿฐ ๋™์ž‘์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ClearDeviceAlias()๋ชจ๋“  ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์„ค์ •


Airbridge Unity SDK์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 6๊ฐœ์˜ ํ•˜์œ„ ์†์„ฑ ๊ฐ’๋“ค๊ณผ ํ•จ๊ป˜ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Event Category : ์ด๋ฒคํŠธ์˜ ์ด๋ฆ„ Required (string)
  • Event Action : ์ด๋ฒคํŠธ ํ•˜์œ„ ์†์„ฑ๊ฐ’ 1 (string)
  • Event Label : ์ด๋ฒคํŠธ ํ•˜์œ„ ์†์„ฑ๊ฐ’ 2 (string)
  • Event Value : ์ด๋ฒคํŠธ ํ•˜์œ„ ์†์„ฑ๊ฐ’ 3 (double)
  • Event Custom Attributes : ์ด๋ฒคํŠธ ํ•˜์œ„์˜ ์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ (Dictionary<string, object>)
  • Event Semantic Attributes : ์ด๋ฒคํŠธ ํ•˜์œ„์˜ ์‹œ๋ฉ˜ํ‹ฑ ๋ฐ์ดํ„ฐ (Dictionary<string, object>)

์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ์ „์†ก

Airbridge Unity SDK์—์„œ๋Š” ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€ ์œ ์ € ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํšŒ์›๊ฐ€์ž… (Sign up)
Dictionary<string, string> alias = new Dictionary<string, string>(); AirbridgeUser user = new AirbridgeUser(); user.SetId(UserId); user.SetEmail(Email); user.SetPhoneNumber(Phone); user.SetAlias(alias); AirbridgeUnity.SetUser(user); AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.SIGN_UP); AirbridgeUnity.TrackEvent(@event);
  • ๋กœ๊ทธ์ธ (Sign in)
Dictionary<string, string> alias = new Dictionary<string, string>(); AirbridgeUser user = new AirbridgeUser(); user.SetId(UserId); user.SetEmail(Email); user.SetPhoneNumber(Phone); user.SetAlias(alias); AirbridgeUnity.SetUser(user); AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.SIGN_IN); AirbridgeUnity.TrackEvent(@event);
  • ๋กœ๊ทธ์•„์›ƒ (Sign out)
AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.SIGN_OUT); AirbridgeUnity.TrackEvent(@event); AirbridgeUnity.ExpireUser();

์ด์ปค๋จธ์Šค ์ด๋ฒคํŠธ ์ „์†ก

Airbridge Unity SDK์—์„œ๋Š” ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ’ˆ ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์ด์ปค๋จธ์Šค ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product(); cocacola.SetId("beverage_1"); cocacola.SetName("Coca Cola"); cocacola.SetPrice(1.25); cocacola.SetCurrency("USD"); cocacola.SetQuantity(1); cocacola.SetPosition(0);
  • ํ™ˆ ํ™”๋ฉด (Home Screen)
AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.VIEW_HOME); AirbridgeUnity.TrackEvent(@event);
  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์กฐํšŒ (Search Results)
List<Airbridge.Ecommerce.Product> beverages = new List<Airbridge.Ecommerce.Product>(); Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product(); cocacola.SetId("beverage_1"); cocacola.SetName("Coca Cola"); cocacola.SetPrice(1.25); cocacola.SetCurrency("USD"); cocacola.SetQuantity(1); cocacola.SetPosition(0); beverages.Add(cocacola); Airbridge.Ecommerce.Product fanta = new Airbridge.Ecommerce.Product(); fanta.SetId("beverage_2"); fanta.SetName("Fanta"); fanta.SetPrice(10.99); fanta.SetCurrency("USD"); fanta.SetQuantity(1); fanta.SetPosition(1); beverages.Add(fanta); AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.VIEW_SEARCH_RESULT); @event.SetQuery("SELECT * FROM beverages"); @event.SetProducts(beverages.ToArray()); @event.SetTotalValue(12.24); AirbridgeUnity.TrackEvent(@event);
  • ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ (Product List)
List<Airbridge.Ecommerce.Product> beverages = new List<Airbridge.Ecommerce.Product>(); Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product(); cocacola.SetId("beverage_1"); cocacola.SetName("Coca Cola"); cocacola.SetPrice(1.25); cocacola.SetCurrency("USD"); cocacola.SetQuantity(1); cocacola.SetPosition(0); beverages.Add(cocacola); Airbridge.Ecommerce.Product fanta = new Airbridge.Ecommerce.Product(); fanta.SetId("beverage_3"); fanta.SetName("Fanta"); fanta.SetPrice(10.99); fanta.SetCurrency("USD"); fanta.SetQuantity(1); fanta.SetPosition(2); beverages.Add(fanta); AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.VIEW_PRODUCT_LIST); @event.SetProductListId("beverage_list_0"); @event.SetProducts(beverages.ToArray()); @event.SetTotalValue(12.24); AirbridgeUnity.TrackEvent(@event);
  • ์ƒํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€ ์กฐํšŒ (Product Details)
Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product(); cocacola.SetId("beverage_1"); cocacola.SetName("Coca Cola"); cocacola.SetPrice(1.25); cocacola.SetCurrency("USD"); cocacola.SetQuantity(1); cocacola.SetPosition(0); AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.VIEW_PRODUCT_DETAILS); @event.SetProducts(cocacola); AirbridgeUnity.TrackEvent(@event);
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ (Add to Cart)
Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product(); cocacola.SetId("beverage_1"); cocacola.SetName("Coca Cola"); cocacola.SetPrice(1.25); cocacola.SetCurrency("USD"); cocacola.SetQuantity(1); cocacola.SetPosition(0); AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.ADD_TO_CART); @event.SetProducts(cocacola); @event.SetTotalValue(1.25); AirbridgeUnity.TrackEvent(@event);
  • ๊ฒฐ์ œ ์™„๋ฃŒ (Order Complete)
List<Airbridge.Ecommerce.Product> beverages = new List<Airbridge.Ecommerce.Product>(); Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product(); cocacola.SetId("beverage_1"); cocacola.SetName("Coca Cola"); cocacola.SetPrice(1.25); cocacola.SetCurrency("USD"); cocacola.SetQuantity(1); cocacola.SetPosition(0); beverages.Add(cocacola); Airbridge.Ecommerce.Product fanta = new Airbridge.Ecommerce.Product(); fanta.SetId("beverage_3"); fanta.SetName("Fanta"); fanta.SetPrice(10.99); fanta.SetCurrency("USD"); fanta.SetQuantity(1); fanta.SetPosition(2); beverages.Add(fanta); AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.ORDER_COMPLETE); @event.SetTransactionId("transaction_123"); @event.SetProducts(beverages.ToArray()); @event.SetInAppPurchased(true); @event.SetTotalValue(12.24); AirbridgeUnity.TrackEvent(@event);

์ปค์Šคํ…€ ์ด๋ฒคํŠธ ์ „์†ก

Airbridge Unity SDK์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ ๋œ ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AirbridgeEvent @event = new AirbridgeEvent("category"); @event.SetAction("action"); @event.SetLabel("label"); @event.SetValue(100.99); @event.AddCustomAttribute("custom_key", "value"); @event.AddSemanticAttribute("query", "query_123"); AirbridgeUnity.TrackEvent(@event);

๐Ÿ“˜

Semantic Attributes๋ฅผ ์ง์ ‘ ๊ตฌ์„ฑํ•˜์—ฌ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•ด ์ฃผ์„ธ์š”.

์ด๋ฒคํŠธ ์ „์†ก ํ™•์ธ

Airbridge Unity SDK์—์„œ ์ „์†ก๋œ ์ด๋ฒคํŠธ ์ •๋ณด๋Š” Airbridge ๋Œ€์‹œ๋ณด๋“œ โ†’ Raw Data โ†’ App Real-time Log ํƒญ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ์„ค์ •


SDK Signature ์„ค์ •

Airbirdge Unity SDK์—์„œ๋Š” ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ Sdk Signature Secret ID ํ•„๋“œ์™€ Sdk Signature Secret ํ•„๋“œ์˜ ์„ค์ •์„ ํ†ตํ•ด SDK ๋ฅผ SDK Spoofing ์œผ๋กœ ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“˜

SDK Signature ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SDK Signature Secret, SDK Signature Secret ID 2๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋“ฑ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด HASH(SHA256)ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž์˜ ์‹๋ณ„์ž ์ •๋ณด๋ฅผ ์ „์†กํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ User Info Hash Enabled ํ•„๋“œ์˜ ์„ค์ •์„ ํ†ตํ•ด User Email ๊ทธ๋ฆฌ๊ณ  User Phone ์ •๋ณด์˜ ํ•ด์‹œํ™”(SHA256)๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ—๏ธ

ํ•ด๋‹น ์˜ต์…˜์€ User Email๊ณผ User Phone ๋“ฑ ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ œ 3์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณ„๋„์˜ ๋ณด์•ˆ ์กฐ์น˜๊ฐ€ ์„ ํ–‰๋˜์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ธ์…˜ ํƒ€์ž„์•„์›ƒ ์„ค์ •

Airbirdge Unity SDK์—์„œ๋Š” ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ Session Timeout Seconds ํ•„๋“œ์˜ ์„ค์ •์„ ํ†ตํ•ด ์„ค์ •๋œ ์„ธ์…˜ ์‹œ๊ฐ„ ๋‚ด์— ์œ ์ €๊ฐ€ ์•ฑ์„ ์žฌ ์‹คํ–‰ ํ•˜๋”๋ผ๋„ ๊ฐ™์€ ์„ธ์…˜์œผ๋กœ ํŒ๋‹จํ•˜์—ฌ ์•ฑ ์‹คํ–‰ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค์‹œ ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ ์„ค์ •

ํ•ด๋‹น ๊ธฐ๋Šฅ์€ GDPR์ด๋‚˜ CCPA์™€ ๊ฐ™์ด ๊ณ ๊ฐ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ์— ๋Œ€ํ•œ ๋™์˜๋ฅผ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ์ „์†ก์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ Auto Start Tracking Enabled ํ•„๋“œ์˜ ์„ค์ •์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ณผ ์ „์†ก์„ ๋ช…์‹œ์ ์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“˜

ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์ด ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

AirbridgeUnity.StartTracking();

Airbridge ๋งํฌ ์ถ”์  ์„ค์ •

๊ด‘๊ณ ์ฃผ์˜ ์•ฑ ๋‚ด์—์„œ ๋‹ค์ˆ˜์˜ ๋”ฅ๋งํฌ ๋™์ž‘์œผ๋กœ ์ธํ•ด Airbridge๋ฅผ ํ†ตํ•œ Re-engagement ์„ฑ๊ณผ๋ฅผ ํ•œ๋ˆˆ์— ํ™•์ธํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ, ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ Track Airbridge Link Only ํ•„๋“œ์˜ ์„ค์ •์„ ํ†ตํ•˜์—ฌ Airbridge ๋”ฅ๋งํฌ๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ์„ฑ๊ณผ๋งŒ ํ•„ํ„ฐ๋งํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•  ๊ฒฝ์šฐ ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ ๋”ฅ๋งํฌ๋ฅผ ํ†ตํ•ด ์•ฑ์ด ์˜คํ”ˆ ๋œ ๊ฒฝ์šฐ์— ํ•œํ•˜์—ฌ ๋”ฅ๋งํฌ ์„ฑ๊ณผ๋กœ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ๋Œ€์‹œ๋ณด๋“œ์— ๋“ฑ๋ก๋œ ํ˜•ํƒœ์˜ ๋”ฅ๋งํฌ๋ฅผ ํ†ตํ•ด ์•ฑ์ด ์˜คํ”ˆ ๋œ ๊ฒฝ์šฐ
  • airbridge.io ๋”ฅ๋งํฌ๋ฅผ ํ†ตํ•ด ์•ฑ์ด ์˜คํ”ˆ ๋œ ๊ฒฝ์šฐ
  • deeplink.page ๋”ฅ๋งํฌ๋ฅผ ํ†ตํ•ด ์•ฑ์ด ์˜คํ”ˆ ๋œ ๊ฒฝ์šฐ
  • airbridge_referrer query ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

์œ„์น˜ ์ •๋ณด ์ˆ˜์ง‘

Airbridge Unity SDK์—์„œ๋Š” ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ Location Collection Enabled ํ•„๋“œ์˜ ์„ค์ •์„ ํ†ตํ•˜์—ฌ ์œ ์ €์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ—๏ธ

์œ„์น˜ ์ •๋ณด๋Š” ํ•ฉ๋ฒ•์ ์ธ ๋ชฉ์ ๊ณผ ๋ฐฉ๋ฒ•์„ ํ†ตํ•˜์—ฌ ์ˆ˜์ง‘๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ณธ ๊ธฐ๋Šฅ ์‚ฌ์šฉ์— ์ฃผ์˜๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.

๐Ÿšง

ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ์˜ค์ง ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ถŒํ•œ์ด AndroidManifest.xml์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

ํŽ˜์ด์Šค๋ถ ๋””ํผ๋“œ ์•ฑ๋งํฌ ์„ค์ •

Facebook์˜ Deferred App Link๋ฅผ ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ Facebook Deferred App Link Enabled ํ•„๋“œ์˜ ์„ค์ •์„ ํ†ตํ•˜์—ฌ Airbridge Unity SDK์—์„œ ํ•จ๊ป˜ ๋ฐ›์•„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿšง

ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฏธ๋ฆฌ Facebook SDK ์„ค์ •์ด ์„ ํ–‰๋˜์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ์กฐ - https://developers.facebook.com/docs/unity/

์•ฑ ์ถ”์  ํ—ˆ์šฉ ์„ค์ •

iOS 14์˜ ์ •์ฑ… ๋ณ€ํ™”์— ๋”ฐ๋ผ iOS์—์„œ ์•ฑ ์ถ”์  ํ—ˆ์šฉ ์„ค์ •(App Tracking Transparency)์„ ํ†ตํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋™์˜๋ฅผ ์–ป์–ด์•ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ IDFA ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Airbridge Unity SDK์—์„œ๋Š” ์œ ๋‹ˆํ‹ฐ ์ƒ๋‹จ์˜ AB180 > Airbridge Settings์˜ iOS Tracking Authorize Timeout Seconds ์„ค์ •์„ ํ†ตํ•ด ์„ค์น˜ ์ด๋ฒคํŠธ๋ฅผ ์ง€์—ฐํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ IDFA๊ฐ€ ์ธ์Šคํ†จ ์ด๋ฒคํŠธ์— ํฌํ•จ๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๐Ÿ“˜

์•ฑ ์‚ญ์ œ ์ถ”์  ์„ค์ •์€ Airbridge Unity SDK v1.9.0 ์ดํ›„ ๋ฒ„์ „ ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

Android Uninstall Tracking

1. Firebase Cloud Messaging ์„ค์ •

Firebase Cloud Messaging ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์•ฑ์˜ ๊ธฐ๋ณธ ์„ค์ •์„ ์™„๋ฃŒํ•ด ์ฃผ์„ธ์š”.

2. Firebase Push Token ์ „์†ก

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

public void Start() { Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived; Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived; } public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token) { #if UNITY_ANDROID AirbridgeUnity.RegisterPushToken(token.Token); #endif } // ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์•ฑ ์‚ญ์ œ ์•Œ๋ฆผ์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋„๋ก ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•ด ์ฃผ์„ธ์š”. public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) { if (e.Message.Data.ContainsKey("airbridge-uninstall-tracking")) return; ... }

iOS Uninstall Tracking

1. Apple Push Notification service ์„ค์ •

Unity Mobile Notifications package ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด ์ฃผ์„ธ์š”.

2. Device Token ์ „์†ก

APNs Device Token์„ ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ „๋‹ฌํ•ด ์ฃผ์„ธ์š”.

void Start() { #if UNITY_IOS StartCoroutine(RequestAuthorization()); #endif } #if UNITY_IOS IEnumerator RequestAuthorization() { var authorizationOption = AuthorizationOption.Alert | AuthorizationOption.Badge; using (var req = new AuthorizationRequest(authorizationOption, true)) { while (!req.IsFinished) { yield return null; }; if (req.Granted && req.DeviceToken != "") { AirbridgeUnity.RegisterPushToken(req.DeviceToken); } } } #endif

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ ์„ค์ •

Web SDK๋งŒ์˜ ์„ค์น˜๋กœ๋Š” ์•ฑ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ๋˜๋Š” ๋”ฅ๋งํฌ ํ˜ธ์ถœ ๋“ฑ์˜ ์ถ”๊ฐ€์ ์ธ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ž˜ํ‚น ํ•  ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Airbridge ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •์„ ํ†ตํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์—์„œ ์ธ์•ฑ ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AirbridgeWebInterface webInterface; webInterface = AirbridgeUnity.CreateWebInterface( "YOUR_WEB_TOKEN", // web token (msg) => $@"..." // post command function );

AirbridgeUnity.CreateWebInterface ๋ฅผ ํ†ตํ•ด์„œ Web Interface ๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ์—ฐ๋™๊ฐ€์ด๋“œ๋ฅผ ํ™•์ธ ํ•ด์ฃผ์„ธ์š”.

Unity ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ ์—ฐ๋™ ๊ฐ€์ด๋“œ

๐Ÿšง

Airbridge Unity SDK 1.9.3 ๋ฒ„์ „ ๋ถ€ํ„ฐ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ ์„ค์ • ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


Troubleshooting


Android

1. Android ๊ธฐ๊ธฐ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ Airbridge Unity๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

  • Airbridge Unity Android์˜ ๊ฒฝ์šฐ Content Provider๋ฅผ ํ†ตํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™” ๋ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์œ„ํ•˜์—ฌ Project > Plugins > Android > AndroidManifest.xml ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ Xml Tag๊ฐ€ ๋ฐ˜๋“œ์‹œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ช…์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
<provider android:authorities="${applicationId}.co.ab180.airbridge.unity.AirbridgeContentProvider" android:name="co.ab180.airbridge.unity.AirbridgeContentProvider" android:exported="false" />

2. Android ๊ธฐ๊ธฐ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ Custom Activity๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • Airbridge Unity๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋”ฅ๋งํฌ์˜ ํ˜ธ์ถœ์„ ์œ„ํ•ด Custom Activity๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ Custom Activity๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น Custom Activity์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); } @Override protected void onResume() { super.onResume(); AirbridgeUnity.processDeeplinkData(getIntent()); }

3. Android Manifest ํŒŒ์ผ์ด ์ œ๋Œ€๋กœ Merge ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

  • Airbridge Unity์—์„œ ์ œ๊ณต๋˜๋Š” Android Manifest Merger๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” Project > Plugins > Android > AndroidManifest.xml๋ฅผ ์ฝ์–ด๋“ค์—ฌ Airbridge Unity์—์„œ ์ œ๊ณต๋˜๋Š” Project > Plugins > Airbridge > Android> AndroidManifest.xml๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ Merge ํ•ด์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ์„œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ์ผ€์ด์Šค์— ๋งž์ถฐ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ•ด๋‹น AndroidManifest.xml๋ฅผ Merge ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. Missing 'package' key attribute on element package at ...

์•ˆ๋“œ๋กœ์ด๋“œ 11 ๋ฒ„์ „์˜ Package Visibility ์ •์ฑ… ์ถ”๊ฐ€๋กœ ํ•ด๋‹น ๋ฒ„์ „์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ํŒจํ‚ค์ง€์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ์ด๋ฃจ์–ด ์ง€๋Š”์ง€์— ๋Œ€ํ•ด์„œ manifest์˜ <queries>๋ฅผ ํ†ตํ•ด ์œ ์ €์—๊ฒŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ณ ์ง€ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Airbridge์—์„œ๋Š” ํ•ด๋‹น ์ •์ฑ…์„ ์ค€์ˆ˜๋ฅผ ์œ„ํ•ด ์•ˆ๋“œ๋กœ์ด๋“œ SDK ๋ชจ๋“ˆ์ด ํ•ด๋‹น ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ <queries> ํƒœ๊ทธ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Gradle ์ตœ์†Œ 5.6.4 ๋ฒ„์ „ ์ด์ƒ ๊ทธ๋ฆฌ๊ณ  Android Gradle Plugin ์ตœ์†Œ 3.6.0 ๋ฒ„์ „ ์ด์ƒ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์œ ๋‹ˆํ‹ฐ ๋ฒ„์ „์— ๋”ฐ๋ผ ์–ด๋– ํ•œ Gradle ๋ฒ„์ „์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”๊ฐ€์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์‚ฌ์šฉํ•˜๋Š” ์œ ๋‹ˆํ‹ฐ์˜ Gradle ๋ฒ„์ „์ด 5.6.4 ๋ฒ„์ „ ๋ฏธ๋งŒ ํ˜น์€ ๋ฐ Android Gradle Plugin ๋ฒ„์ „์ด 3.6.0 ๋ฒ„์ „ ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ๋‹ˆํ‹ฐ ์„ค์ •์„ ํ†ตํ•ด ๋ฒ„์ „์„ ํŠน์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ์œ ๋‹ˆํ‹ฐ 2020.1 ๋˜๋Š” ์ดํ›„ ๋ฒ„์ „

๋‹ค์Œ ๋ฒ„์ „๋“ค์€ Gradle 5.6.4 ์ดํ›„ ๋ฒ„์ „๊ณผ Android Gradle Plugin 3.6.0 ์ดํ›„ ๋ฒ„์ „์„ ์ด๋ฏธ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

- ์œ ๋‹ˆํ‹ฐ 2019.3 ๋ฒ„์ „ ~ 2019.4 ๋ฒ„์ „

๐Ÿ“˜

ํ•ด๋‹น ์ปค์Šคํ…€ ์˜ต์…˜์€ ์œ ๋‹ˆํ‹ฐ 2019.3 patch 7 ์ดํ›„์˜ ๋ฒ„์ „์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  1. Gradle Build Tool ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ Gradle 5.6.4 ์ด์ƒ์˜ ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•ด ์ฃผ์„ธ์š”.
  2. Preferences > External Tools๋กœ ์ด๋™ํ•˜์—ฌ Gradle Installed with Unity (recommended) ์ฒดํฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ Gradle ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

  1. Project Settings > Player > Android tab > Publishing Settings > Build๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ ์˜ต์…˜๋“ค์„ ๋ชจ๋‘ ์„ ํƒํ•ด ์ฃผ์„ธ์š”.

a. Custom Main Gradle Template
b. Custom Launcher Gradle Template

  1.   ๋‹ค์Œ ์ž๋™ ์ƒ์„ฑ๋œ ๋‘๊ฐ€์ง€ ํŒŒ์ผ ๋ชจ๋‘ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด ์ฃผ์„ธ์š”.
  • Assets/Plugins/Android/mainTemplate.gradle
  • Assets/Plugins/Android/launcherTemplate.gradle
buildscript { repositories { google() jcenter() } dependencies { // Must be Android Gradle Plugin 3.6.0 or later. For a list of // compatible Gradle versions refer to: // https://developer.android.com/studio/releases/gradle-plugin classpath 'com.android.tools.build:gradle:3.6.0' } } allprojects { repositories { google() jcenter() flatDir { dirs 'libs' } } }
- ์œ ๋‹ˆํ‹ฐ 2019.1 ๋ฒ„์ „ ~ 2019.2 ๋ฒ„์ „
  1. Gradle Build Tool ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ Gradle 5.6.4 ์ด์ƒ์˜ ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•ด ์ฃผ์„ธ์š”.
  2. Preferences > External Tools๋กœ ์ด๋™ํ•˜์—ฌ Gradle Installed with Unity (recommended) ์ฒดํฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ Gradle ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

  1. Project Settings > Player > Android tab > Publishing Settings > Build๋กœ ์ด๋™ํ•˜์—ฌ Custom Gradle Template ์˜ต์…˜์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ํƒํ•ด ์ฃผ์„ธ์š”.

  1. ์ƒ์„ฑ๋œ Assets/Plugins/Android/mainTemplate.gradle ํŒŒ์ผ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด ์ฃผ์„ธ์š”.
buildscript { dependencies { // Must be Android Gradle Plugin 3.6.0 or later. For a list of // compatible Gradle versions refer to: // https://developer.android.com/studio/releases/gradle-plugin classpath 'com.android.tools.build:gradle:3.6.0' } }
์œ ๋‹ˆํ‹ฐ 2018.4 ๋ฒ„์ „

๐Ÿ“˜

ํ•ด๋‹น ์ปค์Šคํ…€ ์˜ต์…˜์€ ์œ ๋‹ˆํ‹ฐ 2018.4 patch 24 ์ดํ›„์˜ ๋ฒ„์ „์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  1. Gradle Build Tool ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ Gradle 5.6.4 ์ด์ƒ์˜ ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•ด ์ฃผ์„ธ์š”.
  2. Build Settings > Android๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด Build System์—์„œ Gradle์„ ์„ ํƒํ•ด ์ฃผ์„ธ์š”.

  1. Preferences > External Tools๋กœ ์ด๋™ํ•˜์—ฌ Gradle Installed with Unity (recommended) ์ฒดํฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ Gradle ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

  1. Project Settings > Player > Android tab > Publishing Settings > Build๋กœ ์ด๋™ํ•˜์—ฌ Custom Gradle Template ์˜ต์…˜์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ํƒํ•ด ์ฃผ์„ธ์š”.

  1. ์ƒ์„ฑ๋œ Assets/Plugins/Android/mainTemplate.gradle ํŒŒ์ผ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด ์ฃผ์„ธ์š”.
buildscript { dependencies { // Must be Android Gradle Plugin 3.6.0 or later. For a list of // compatible Gradle versions refer to: // https://developer.android.com/studio/releases/gradle-plugin classpath 'com.android.tools.build:gradle:3.6.0' } }

์œ ๋‹ˆํ‹ฐ 2018.3 ์ดํ•˜ ๋ฒ„์ „

Gradle ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ ์˜ต์…˜์€ 2018.3 ๋ฒ„์ „ ์ดํ•˜์˜ ์œ ๋‹ˆํ‹ฐ์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

iOS

1. iOS ์—์„œ Custom AppController ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • Airbridge Unity iOS์˜ ๊ฒฝ์šฐ ์œ ๋‹ˆํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” IMPL_APP_CONTROLLER_SUBCLASS๋ฅผ ์ด์šฉํ•˜์—ฌ Custom AppController๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ IMPL_APP_CONTROLLER_SUBCLASS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Custom AppController ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น Custom AppController ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.
- (BOOL) application:(UIApplication*)application continueUserActivity:(NSUserActivity*)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>>* _Nullable))restorationHandler { [AUAppDelegate.instance application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; return YES; }
  • ํ•ด๋‹น ์ž‘์—… ์™„๋ฃŒ ํ›„ ๊ธฐ์กด์˜ Airbridge Unity SDK Assets > Plugins > Airbridge > iOS > Delegate > AUAppController.mm ํŒŒ์ผ ์ œ๊ฑฐํ•ด ์ฃผ์„ธ์š”.

์ƒ˜ํ”Œ ์•ฑ

Unity Sample App