Unity SDK
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 μμ μ λͺ¨λ μλμΌλ‘ κ°μ Έμ€κΈ° λλ¬Έμ λ³λμ μ λν° ν¨ν€μ§ μ€μ μ νμ€ νμκ° μμ΅λλ€.
ν¨ν€μ§ μ€μΉ
- μ΅μ λ²μ μ Airbridge Unity SDKλ₯Ό λ€μ΄λ‘λ λ°μμ£ΌμΈμ.
- μ λν° μλ¨μ
Assets > Import Package > Custom Package ...
λ₯Ό ν΄λ¦νμ¬ ν¨ν€μ§λ₯Ό μΆκ°ν΄ μ£ΌμΈμ. - μ€μΉκ° μλ£λλ©΄ μ λν° μλ¨μ
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
νμμ νμΈνμ€ μ μμ΅λλ€.
μ΄κΈ°ν
Airbridge Unity SDKμ κ²½μ° λ³λμ μ΄κΈ°ν μμ μ νμλ‘ νμ§ μμΌλ νΉμν κ²½μ° κ° νλ«νΌλ§λ€ λ³λμ λ§μ΄κ·Έλ μ΄μ μμ μ΄ νμν μλ μμ΅λλ€.
SDK μ€μΉ νμΈ
μμ΄λΈλ¦Ώμ§ SDKμ κΈ°λ³Έ μ€μΉ λ° μ€μ μ΄ μλ£ ν λ€μκ³Ό κ°μ λ°©λ²λ€μ ν΅ν΄μ μ¬λ°λ₯΄κ² μ€μ λμλμ§ νμΈνμ€ μ μμ΅λλ€.
λ‘κ·Έλ‘ νμΈ
ν΄λΉ μ±μ μμΈν λ‘κ·Έ μ 보λ₯Ό νμΈνκ³ μΆμΌμ κ²½μ°, μ λν° μλ¨μ AB180 > Airbridge Settings
μ Log Level
νλ μ€μ μ ν΅νμ¬ νμΈνμ€ μ μμ΅λλ€.
λμ보λμμ νμΈ
μ€μ μ΄ μλ£λλ©΄ μ΄ν리μΌμ΄μ
μ€μΉ ν Airbridge λμ보λμ β Raw Data
β App Real-time Log
νμμ ν΄λΉ μ΄ν리μΌμ΄μ
μ μ΄λ²€νΈλ₯Ό νμΈνμ€ μ μμ΅λλ€.
Real-time Logλ μ΅μ₯ 5λΆμ μ§μ°μκ°μ΄ μμ μλ μμ΅λλ€.
λ₯λ§ν¬ μ€μ
λμ보λ μ€μ
κ°κ° iOS λ° Android νλ«νΌ λ³ λ₯λ§ν¬ λμ보λ μ€μ μ λ€μκ³Ό κ°μ΅λλ€.
- 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μ νΈλνΉ λ§ν¬λ‘ μ¬μ©ν μ μμ΅λλ€.
-
μ¬μ©ν 컀μ€ν λλ©μΈμ λ€μ κ°μ΄λμ κ°μ΄ μ€μ ν΄ μ£ΌμΈμ.
-
μμ μ€μ ν 컀μ€ν λλ©μΈ μ£Όμλ₯Ό μ λν° μλ¨μ
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
λλ μ΄ν λ²μ
2020.1
λλ μ΄ν λ²μ λ€μ λ²μ λ€μ Gradle
5.6.4 μ΄ν λ²μ κ³Ό Android Gradle Plugin
3.6.0 μ΄ν λ²μ μ μ΄λ―Έ ν¬ν¨νκ³ μκΈ° λλ¬Έμ μΆκ°μ μΈ μμ
μ νμλ‘ νμ§ μμ΅λλ€.
- μ λν° 2019.3
λ²μ ~ 2019.4
λ²μ
2019.3
λ²μ ~ 2019.4
λ²μ ν΄λΉ 컀μ€ν μ΅μ μ μ λν°
2019.3 patch 7
μ΄νμ λ²μ μμλ§ κ°λ₯ν©λλ€.
Gradle Build Tool
νμ΄μ§λ‘ μ΄λνμ¬Gradle
5.6.4 μ΄μμ λ²μ μ λ€μ΄λ‘λν΄ μ£ΌμΈμ.Preferences > External Tools
λ‘ μ΄λνμ¬Gradle Installed with Unity (recommended)
체ν¬λ₯Ό ν΄μ νκ³ λ€μ΄λ‘λ λ°μGradle
νμΌμ κ²½λ‘λ₯Ό λ€μκ³Ό κ°μ΄ μ€μ ν΄ μ£ΌμΈμ.
Project Settings > Player > Android tab > Publishing Settings > Build
λ‘ μ΄λνμ¬ λ€μ μ΅μ λ€μ λͺ¨λ μ νν΄ μ£ΌμΈμ.
a. Custom Main Gradle Template
b. Custom Launcher Gradle Template
- Β Β λ€μ μλ μμ±λ λκ°μ§ νμΌ λͺ¨λ λ€μκ³Ό κ°μ΄ λ³κ²½ν΄ μ£ΌμΈμ.
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
λ²μ
2019.1
λ²μ ~ 2019.2
λ²μ Gradle Build Tool
νμ΄μ§λ‘ μ΄λνμ¬Gradle
5.6.4 μ΄μμ λ²μ μ λ€μ΄λ‘λν΄ μ£ΌμΈμ.Preferences > External Tools
λ‘ μ΄λνμ¬Gradle Installed with Unity (recommended)
체ν¬λ₯Ό ν΄μ νκ³ λ€μ΄λ‘λ λ°μGradle
νμΌμ κ²½λ‘λ₯Ό λ€μκ³Ό κ°μ΄ μ€μ ν΄ μ£ΌμΈμ.
Project Settings > Player > Android tab > Publishing Settings > Build
λ‘ μ΄λνμ¬Custom Gradle Template
μ΅μ μ λ€μκ³Ό κ°μ΄ μ νν΄ μ£ΌμΈμ.
- μμ±λ
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
λ²μ ν΄λΉ 컀μ€ν μ΅μ μ μ λν°
2018.4 patch 24
μ΄νμ λ²μ μμλ§ κ°λ₯ν©λλ€.
Gradle Build Tool
νμ΄μ§λ‘ μ΄λνμ¬Gradle
5.6.4 μ΄μμ λ²μ μ λ€μ΄λ‘λν΄ μ£ΌμΈμ.Build Settings > Android
λ‘ μ΄λνμ¬ λ€μ μ΄λ―Έμ§μ κ°μ΄Build System
μμGradle
μ μ νν΄ μ£ΌμΈμ.
Preferences > External Tools
λ‘ μ΄λνμ¬Gradle Installed with Unity (recommended)
체ν¬λ₯Ό ν΄μ νκ³ λ€μ΄λ‘λ λ°μGradle
νμΌμ κ²½λ‘λ₯Ό λ€μκ³Ό κ°μ΄ μ€μ ν΄ μ£ΌμΈμ.
Project Settings > Player > Android tab > Publishing Settings > Build
λ‘ μ΄λνμ¬Custom Gradle Template
μ΅μ μ λ€μκ³Ό κ°μ΄ μ νν΄ μ£ΌμΈμ.
- μμ±λ
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
μ΄ν λ²μ
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
νμΌ μ κ±°ν΄ μ£ΌμΈμ.
μν μ±
Updated 12 months ago