에어브릿지 유니티 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의 경우 별도의 초기화 작업은 필요로 하지 않으나 특수한 경우 각 플랫폼마다 별도의 마이그레이션 작업이 필요할 수도 있습니다.
유니티 2023.1
또는 이후 버전을 사용하시면, 프로젝트에서 설정한 [Android Player Settings] > [Other Settings] > [Configuration] > [Application Entry Point]가 무엇이냐에 따라 다르게 설정해주세요.
별도로 설정하지 않으셨다면 Unity 6 버전은 GameActivity 가이드를, Unity 6 버전 미만은 Activity 가이드를 따라 설정해주시면 됩니다.
유니티 프로젝트 설정에서 설정된 값으로 Android Manifest 파일이 자동 업데이트되기 때문에 추가적인 작업을 필요로 하지 않습니다.
유니티 프로젝트 설정에서 설정된 값으로 Android Manifest 파일이 자동 업데이트되기 때문에 추가적인 작업을 필요로 하지 않습니다.
Airbridge Unity SDK에서 제공하는 커스텀 Activity는 com.unity3d.player.UnityPlayerActivity를 상속받은 Activity이기 때문에 아래와 같은 추가적인 작업을 필요로 합니다.
Assets/Plugins/Airbridge/Android/java/co/ab180/airbridge/unity/AirbridgeActivity.java
파일을 제거해주세요.
Custom Activity 파일(AirbridgeGameActivity.java
)을 아래와 같이 생성해주세요.
package co.ab180.airbridge.unity;
import android.content.Intent;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerGameActivity;
public class AirbridgeGameActivity extends UnityPlayerGameActivity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
@Override
protected void onResume() {
super.onResume();
AirbridgeUnity.processDeeplinkData(getIntent());
}
}
Android Manifest 파일({UNITY_PROJECT}/Plugins/Android/AndroidManifest.xml
)에 Custom Activity를 아래와 같이 등록해주세요.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="co.ab180.airbridge.unity.AirbridgeGameActivity"
android:theme="@style/BaseUnityGameActivityTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="android.app.lib_name" android:value="game" />
</activity>
</application>
</manifest>
주의하세요
development 목적으로만 Android 애플리케이션의 진입점을 2개 설정 가능합니다.
{UNITY_PROJECT}/Plugins/Airbridge/Android/java/co/ab180/airbridge/unity
폴더 내부에 위치한 AirbridgeActivity.java.template
파일과 AirbridgeGameActivity.java.template
파일을 참조하여 각각의 액티비티를 생성해주세요.
Android Manifest 파일에 각각의 액티비티를 적용해주세요.
이후 유니티 프로젝트 설정에서 설정된 값으로 Android Manifest 파일이 자동 업데이트됩니다.
Airbridge Unity SDK는 com.unity3d.player.UnityPlayerGameActivity를 상속받은 커스텀 Activity를 별도로 제공하지 않고, 유니티 프로젝트 설정에서 설정된 값으로 Intent Filter 설정하는 작업을 하나의 Activity에만 자동 설정하기 때문에 아래와 같은 추가적인 작업을 필요로 합니다.
Custom Activity 파일(AirbridgeGameActivity.java
)을 아래와 같이 생성해주세요.
package co.ab180.airbridge.unity;
import android.content.Intent;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerGameActivity;
public class AirbridgeGameActivity extends UnityPlayerGameActivity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
@Override
protected void onResume() {
super.onResume();
AirbridgeUnity.processDeeplinkData(getIntent());
}
}
Android Manifest 파일({UNITY_PROJECT}/Plugins/Android/AndroidManifest.xml
)을 아래와 같이 설정해주세요.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<!--Used when Application Entry is set to Activity, otherwise remove this activity block-->
<activity android:name="co.ab180.airbridge.unity.AirbridgeActivity"
android:theme="@style/UnityThemeSelector"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="YOUR_APP_NAME.abr.ge" />
<data android:scheme="https" android:host="YOUR_APP_NAME.abr.ge" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
<data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="YOUR_APP_URI_SCHEME" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<!--Used when Application Entry is set to GameActivity, otherwise remove this activity block-->
<activity android:name="co.ab180.airbridge.unity.AirbridgeGameActivity"
android:theme="@style/BaseUnityGameActivityTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="YOUR_APP_NAME.abr.ge" />
<data android:scheme="https" android:host="YOUR_APP_NAME.abr.ge" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
<data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="YOUR_APP_URI_SCHEME" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="android.app.lib_name" android:value="game" />
</activity>
</application>
</manifest>
YOUR_APP_NAME
: 유니티 상단의 AB180 > Airbridge Settings
의 App Name
YOUR_APP_URI_SCHEME
: 유니티 상단의 AB180 > Airbridge Settings
의 Android URI Scheme
에어브릿지 SDK의 기본 설치 및 설정이 완료 후 다음과 같은 방법들을 통해서 올바르게 설정 되었는지 확인하실 수 있습니다.
해당 앱의 자세한 로그 정보를 확인하고 싶으신 경우, 유니티 상단의 AB180 > Airbridge Settings
의 Log Level
필드 설정을 통하여 확인하실 수 있습니다.
설정이 완료되면 어플리케이션 설치 후 Airbridge 대시보드의 → Raw Data
→ App Real-time Log
탭에서 해당 어플리케이션의 이벤트를 확인하실 수 있습니다.
주의하세요
Real-time Log는 최장 5분의 지연시간이 있을 수도 있습니다.
각각 iOS 및 Android 플랫폼 별 딥링크 대시보드 설정은 다음과 같습니다.
유니티 상단의 AB180 > Airbridge Settings
의 iOS URI Scheme
필드에 대시보드에서 설정된 iOS URI Scheme
정보를 입력해 주세요.
해당 정보는 Airbridge 대시보드의 → Tracking Link
→ Deep Link
탭에서 확인하실 수 있습니다.
유니티 상단의 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() {
AirbridgeUnity.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("personID");
user.SetEmail("persondoe@airbridge.io");
user.SetPhoneNumber("1(123)123-1234");
user.SetAlias("key", "value");
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("key", "value");
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.SetValue(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.SetValue(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.ADDED_TO_CART);
@event.SetProducts(cocacola);
@event.SetCurrency("USD");
@event.SetValue(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.99f);
fanta.SetCurrency("USD");
fanta.SetQuantity(1);
fanta.SetPosition(2);
beverages.Add(fanta);
AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.ORDER_COMPLETED);
@event.SetTransactionId("transaction_123");
@event.SetProducts(beverages.ToArray());
@event.SetCurrency("USD");
@event.SetInAppPurchased(true);
@event.SetValue(1.25);
AirbridgeUnity.TrackEvent(@event);
Airbridge Unity SDK에서는 다음과 같은 방법을 통해 커스터마이즈 된 이벤트를 전송할 수 있습니다.
AirbridgeEvent @event = new AirbridgeEvent("category");
@event.SetAction("action");
@event.SetLabel("label");
@event.SetValue(9999);
@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
탭에서 다음과 같이 확인하실 수 있습니다.
Airbirdge Unity SDK에서는 유니티 상단의 AB180 > Airbridge Settings
의 Sdk Signature Secret ID
필드와 Sdk Signature Secret
필드의 설정을 통해 SDK 를 SDK Spoofing 으로 부터 보호할 수 있습니다.
SDK Signature를 설정하기 위해서는 SDK Signature 보안 정보가 필요합니다. SDK Signature 보안 정보를 생성하기 위한 자세한 내용은 에어브릿지 가이드를 참고해 주세요.
내부의 데이터 분석 등의 목적을 위해 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();
알립니다
필수 설정 기능이 아닙니다. 필요한 기능인지 확인한 후에 설정해 주세요.
옵트아웃(Opt-Out)은 유저가 거부하기 전에 유저 정보를 사용하는 정책입니다.
setAutoStartTrackingEnabled
설정을 true로 설정한 후에 이벤트를 수집할 수 없는 시점에 stopTracking
함수를 호출합니다. stopTracking
함수가 호출된 시점부터 이벤트를 수집하지 않습니다.
AirbridgeUnity.stopTracking();
광고주의 앱 내에서 다수의 딥링크 동작으로 인해 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
가 인스톨 이벤트에 포함되도록 설정할 수 있습니다.
앱 추적 투명성(App Tracking Transparency, ATT) 정책에 따라 iOS 버전 14.5 이상에서 IDFA를 수집하기 위해서는 AppTrackingTransparency
를 사용한 팝업창을 제공해야 합니다. AppTrackingTransparency
를 사용한 팝업창에서 개인정보 사용에 동의한 유저의 IDFA만 수집할 수 있습니다.
void Start() {
AppTrackingTransparency.RequestTrackingAuthorization();
}
또는 유니티 가이드를 참고해 팝업창을 제공할 수 있습니다. 2가지 방법 중에서 1가지 방법만 활용해 주세요.
메타 인스톨 리퍼러(Meta Install Referrer) 수집에 필요한 설정입니다.
Airbridge Unity SDK에서는 유니티 상단의 AB180 > Airbridge Settings
의 Meta Install Referrer (Facebook App ID)
에 Facebook App ID 를 전달합니다.
설정한 이후에 암호 해독 키를 에어브릿지 대시보드에 입력해야 복호화된 메타 인스톨 리퍼러를 확인할 수 있습니다. 암호 해독 키를 입력하는 방법은 에어브릿지 가이드를 참고해 주세요.
앱 삭제 추적 설정은 Airbridge Unity SDK
v1.9.0
이후 버전 부터 사용 가능합니다.
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
}
// Make sure the notification is not shown on the device if the remote message value is airbridge-uninstall-tracking.
public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
if (e.Message.Data.ContainsKey("airbridge-uninstall-tracking")) return;
...
}
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 를 제어 할 수 있습니다.
아래 연동가이드를 확인 해주세요.
주의하세요
Airbridge Unity SDK 1.9.3 버전 부터 하이브리드 앱 설정 기능을 제공합니다.
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" />
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());
}
Airbridge Unity에서 제공되는 Android Manifest Merger는 이미 존재하는 Project > Plugins > Android > AndroidManifest.xml
를 읽어들여 Airbridge Unity에서 제공되는 Project > Plugins > Airbridge > Android> AndroidManifest.xml
를 단순하게 Merge 해주는 컴포넌트로서 모든 사용자의 케이스에 맞춰 원하는 형태로 출력하는데 있어서는 한계가 있습니다. 이와 같은 경우 사용자가 직접 해당 AndroidManifest.xml
를 Merge 해야 합니다.
안드로이드 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
버전 미만인 경우, 다음과 같은 유니티 설정을 통해 버전을 특정하여 사용하실 수 있습니다.
다음 버전들은 Gradle
5.6.4 이후 버전과 Android Gradle Plugin
3.6.0 이후 버전을 이미 포함하고 있기 때문에 추가적인 작업을 필요로 하지 않습니다.
해당 커스텀 옵션은 유니티
2019.3 patch 7
이후의 버전에서만 가능합니다.
1. Gradle Build Tool
페이지로 이동하여 Gradle
5.6.4 이상의 버전을 다운로드해 주세요.
2. Preferences > External Tools
로 이동하여 Gradle Installed with Unity (recommended)
체크를 해제하고 다운로드 받은 Gradle
파일의 경로를 다음과 같이 설정해 주세요.
3. Project Settings > Player > Android tab > Publishing Settings > Build
로 이동하여 다음 옵션들을 모두 선택해 주세요.
a. Custom Main Gradle Template
b. Custom Launcher Gradle Template
4. 다음 자동 생성된 두가지 파일 모두 다음과 같이 변경해 주세요.
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'
}
}
}
1. Gradle Build Tool
페이지로 이동하여 Gradle
5.6.4 이상의 버전을 다운로드해 주세요.
2. Preferences > External Tools
로 이동하여 Gradle Installed with Unity (recommended)
체크를 해제하고 다운로드 받은 Gradle
파일의 경로를 다음과 같이 설정해 주세요.
3. Project Settings > Player > Android tab > Publishing Settings > Build
로 이동하여 Custom Gradle Template
옵션을 다음과 같이 선택해 주세요.
4. 생성된 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
을 선택해 주세요.
3. Preferences > External Tools
로 이동하여 Gradle Installed with Unity (recommended)
체크를 해제하고 다운로드 받은 Gradle
파일의 경로를 다음과 같이 설정해 주세요.
4. Project Settings > Player > Android tab > Publishing Settings > Build
로 이동하여 Custom Gradle Template
옵션을 다음과 같이 선택해 주세요.
5. 생성된 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'
}
}
Gradle
커스터마이즈 옵션은 2018.3
버전 이하의 유니티에서는 지원하지 않습니다.
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 SDKAssets > Plugins > Airbridge > iOS > Delegate > AUAppController.mm
파일 제거해 주세요.
Error loading /var/containers/Bundle/Application/…/Frameworks/UnityFramework.framework/UnityFramework (…)
: dlopen(/var/containers/Bundle/Application/…/Frameworks/UnityFramework.framework/UnityFramework, …)
: Library not loaded: @rpath/AirBridge.framework/AirBridge
Airbridge Unity SDK 1.14.1 ~ 1.16.2 이상의 버전을 사용하는 경우, 1.16.3버전으로 업데이트 해 주세요.
[!] CocoaPods could not find compatible versions for pod "AirBridge":
In Podfile:
AirBridge (= {MISSING_VERSION})
iOS 에서 호환되는 AirBridge 버전을 찾지 못하는 경우,
아래의 명령어를 실행하여 소스 레포지토리 업데이트를 진행해 주세요.
pod repo update
pod install --repo-update
소스 레포지토리 업데이트 후, pod search AirBrdige
명령어를 실행하여 올바른 AirBridge 버전이 레포지토리 내에 존재하는지 확인한 후, iOS 빌드를 진행해 주세요.
SDK 업데이트 시, `이전버전` ~ `이후버전` 사이에 해당하는 버전들에 해당하는 내용들을 고려해주세요.
Privacy manifest를 지원함에 따라 Static Library가 Dynamic Library로 변경 되었습니다. EDM4U를 사용하여 설치하는 경우, 유니티 상단의 Assets > External Dependency Manager > iOS Resolver > Settings
을 클릭하여 표시된 iOS Resolver Settings 창의 Podfile Configurations 섹션에서 아래의 체크목록을 확인 한 후, iOS 빌드를 진행해주세요.
옵션 | 체크 여부 |
Add use_frameworks! to Podfile | ✓ |
Link frameworks statically | X |
딥링크 콜백에서 제공하는 딥링크 URL 이 에어브릿지 대시보드에 입력된 내용을 2번 디코딩하여 제공하는 문제가 1.12.2 에 있었던 것이 해결되었습니다.
딥링크 콜백에서 제공하는 딥링크 URL 에 더이상 airbridge_referrer 가 추가되지 않게 됩니다.
ios app 업데이트 하시는 경우, 마지막으로 계산된 SKAdNetwork Conversion Value 로 확정되고, 추가적으로 계산하지 않습니다.
1.12.0 미만 버전에서는 SKAdNetwork Conversion Value 를 최대 24시간 동안만 계산합니다.
새로 설치하시는 유저에 대해서는 문제되지 않습니다.
deeplink.page
가 deprecated 되었습니다. 1.12.0 부터는 abr.ge
로 딥링크 도메인을 사용 하여 코드를 작성 하도록 권장 드립니다
deeplink.page
는 하위 호환을 위해 여전히 지원 및 동작은 되고 있습니다.
trackingAuthorizeTimeout 의 기본값이 30초로 변경됩니다.
도움이 되었나요?