요약: Unity로 개발한 안드로이드 또는 iOS 앱에 앱스플라이어 SDK를 연공하여 설치합니다. 기본 연동 태스크가 완료되면 앱은 어트리뷰션 인스톨 및 인앱 이벤트 측정 준비됩니다.
관련 자료
앱에 Unity 플러그인을 연동하는 방법에 대해 완전히 이해하려면 다음 문서를 읽어보십시오.
- Unity 플러그인 V6 연동 가이드 - 개요
- Unity 플러그인 V6 연동 가이드—기본 SDK 연동(본 기사)
- Unity 플러그인 V6 연동 가이드 - 추가 SDK 연동
- Unity 플러그인 V6 연동 가이드 - API 참조
앱에 플러그인 추가
중요!
앱스플라이어 유니티 SDK는 유니티 인터널 빌드(Unity Internal Build) 시스템을 지원하지 않습니다.
앱스플라이어 Unity 플러그인 다운로드
GitHub에서 최신 Unity 플러그인을 다운로드하십시오.
플러그인 인스톨
다음 설치 방법 중 하나를 이용하십시오.
Unity의 외부 종속성 관리자(EDM4U)는 기본적으로 앱스플라이어 Unity 플러그인을 통해 배포됩니다. 이렇게 하면 플러그인과 프로젝트의 다른 플러그인 간의 종속성 충돌을 해결하여 연동 프로세스를 쉽게 수행할 수 있습니다.
플러그인 설치 방법:
앱스플라이어 플러그인과 EDM4U에 둘 다 필요한 모든 자산을 자동으로 가져오기 위해 appsflyer-unity-plugin.v*.unitypackage를 추가합니다.
EDM4U가 없이 플러그인을 설치하는 방법:
- appsflyer-unity-plugin.v*.unitypackage를 사용자의 앱으로 가져오되 EDM4U 종속성 선택을 삭제하십시오.
- 필요한 다음 안드로이드 종속성을 자산/플러그인/안드로이드 폴더에 다운로드하여 추가합니다.
- 필요한 다음 iOS 종속성을 자산/플러그인/iOS/앱스플라이어 폴더에 다운로드하여 추가합니다.
안드로이드 설정
필요한 안드로이드 권한 설정 방법:
AndroidManifest.xml
에 다음 권한을 설정하십시오.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
API 수준 31(안드로이드 12)을 타케팅하는 앱은 AndroidManifest.xml
에 다음 권한을 추가하여 안드로이드 광고 식별자에 액세스할 수 있어야 합니다.
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
플러그인 초기화
이 섹션에서는 플러그인을 구현하고 초기화하는 방법에 대해 설명합니다.
dev key 확인
- 키는 고유하며 계정을 식별하는 데 사용됩니다. 어떤 경우에는 앱 수준 키가 있습니다.
- Dev 키는 필수입니다.
Dev 키를 가져오는 방법:
- 앱스플라이어에서 설정 > 앱 설정 메뉴로 이동합니다.
- Dev 키를 가져옵니다.
플러그인 초기화
프리팹을 사용하여 플러그인을 초기화하는 방법:
- 자산 > 앱스플라이어로 이동합니다.
- AppsFlyerObject.prefab을 화면에 끌어놓습니다.
- 다음 필드를 설정합니다.
설정 설명 개발 키 이전에 검색한 Dev 키를 붙여넣습니다. 앱 ID iOS: iOS 앱 ID를 입력합니다(
id
접두사 없이).안드로이드: 공백으로 둡니다.
전환 데이터 얻기 앱이 앱스플라이어 딥링킹을 구현하는 경우 "True"로 설정합니다. 기본값은 "False"로 기본적으로 딥링킹이 구현되지 않았음을 의미합니다. 디버그 여부 개발 중 디버그 로그를 보는 방법: true로 설정합니다.
일러두기: 프로덕션으로 앱을 릴리스하기 전에 비활성화(false로 설정)해야 합니다.
- 자산 > 앱스플라이어 > AppsFlyerObjectScript.cs의 코드를 사용 가능한 다른 API로 업데이트합니다.
수동으로 연동하는 방법:
게임 개체를 만들고 다음 init 코드를 추가합니다.
using AppsFlyerSDK;
public class AppsFlyerObjectScript : MonoBehaviour , IAppsFlyerConversionData
{
void Start()
{
/* AppsFlyer.setDebugLog(true); */
AppsFlyer.initSDK("devkey", "appID", this);
AppsFlyer.startSDK();
}
public void onConversionDataSuccess(string conversionData)
{
AppsFlyer.AFLog("onConversionDataSuccess", conversionData);
Dictionary<string, object> conversionDataDictionary = AppsFlyer.CallbackStringToDictionary(conversionData);
// add deferred deeplink logic here
}
public void onConversionDataFail(string error)
{
AppsFlyer.AFLog("onConversionDataFail", error);
}
public void onAppOpenAttribution(string attributionData)
{
AppsFlyer.AFLog("onAppOpenAttribution", attributionData);
Dictionary<string, object> attributionDataDictionary = AppsFlyer.CallbackStringToDictionary(attributionData);
// add direct deeplink logic here
}
public void onAppOpenAttributionFailure(string error)
{
AppsFlyer.AFLog("onAppOpenAttributionFailure", error);
}
}
일러두기: 게임 개체에서 destroy를 호출하지 않도록 하십시오.
인앱 이벤트 기록
인앱 이벤트를 기록하여 수익, ROI 및 LTV(유저생애가치) 등의 KPI를 측정합니다.
사용자 이벤트를 기록하려면 인앱 이벤트를 구현해야 합니다. 이벤트는 다음의 여러 방법으로 전송할 수 있습니다.
- [모범 사례] 본 가이드에서 설명한 대로 앱을 통해 이벤트 전송.
- 추가적인 방법에 대해서는 인앱 이벤트 개요 가이드를 참조하십시오.
예를 들어 여행, 게임 또는 이커머스와 같은 수직 구조에 속하는 앱인 경우 수직 구조별로 권장되는 인앱 이벤트 목록을 참조하십시오.
인앱 이벤트 이름 및 파라미터
이벤트를 보내려면:
- 이벤트 이름과 파라미터를 지정하십시오.
- 관련 리스트:
- 권장 이벤트 이름 및 구조 목록
AFInAppEvents
클래스에있는 목록
[모범 사례] 다음의 이유로 이벤트 이름과 파라미터를 사용합니다.
- 표준 방식의 이름 지정: 앱스플라이어는 자동으로 이벤트를 페이스북, 구글, 트위터와 같은 SRN에 매핑할 수 있습니다.
- 이전 버전과의 호환성: 앱스플라이어가 이벤트의 이름이나 파라미터를 변경하더라도 문제가 발생하지 않습니다. 구현 내용이 이전 버전과 호환됩니다.
수익 기록
인앱 이벤트에 af_revenue
파라미터를 추가하여 수익을 리포트합니다.
af_revenue
를 숫자 값으로 채웁니다. 음수의 값이 허용됩니다.af_revenue
파라미터는 앱스플라이어 수익 카운터 및 로데이터 필드를 채웁니다. 이를 통해 마케터는 대시보드에서 수익을 확인할 수 있습니다.- 수익은 다른 파라미터를 사용하여 전송할 수 있지만 앱스플라이어 플랫폼은 그것을 수익으로 인식하지 않습니다. 자세한 내용은 여기를 클릭하십시오.
- 수익 값에는 쉼표 구분 기호, 통화 기호 또는 텍스트가 절대로 포함되지 말아야 합니다.
수익 값 예: 1234.56
모범 사례: 통화 설정, 표시 및 기준 통화로의 환전에 대해 알아보십시오.
수익 이벤트를 전송할 때 통화 코드 요구사항
- 기본 통화 설정: USD
- 3자로 된 ISO 4217 코드를 사용하십시오(아래 예시 참조).
- API를 호출하여 통화 코드를 설정합니다.
AppsFlyer.setCurrencyCode("ZZZ")
예시: 수익 값이 있는 인앱 구매 이벤트
이 구매 이벤트는 200.12유로입니다. 대시보드에서 반영할 수익의 경우 다음을 사용하십시오.
System.Collections.Generic.Dictionary<string, string> purchaseEvent = new
System.Collections.Generic.Dictionary<string, string> ();
purchaseEvent.Add(AFInAppEvents.CURRENCY, "EUR");
purchaseEvent.Add(AFInAppEvents.REVENUE, "200.12");
purchaseEvent.Add(AFInAppEvents.QUANTITY, "1");
purchaseEvent.Add(AFInAppEvents.CONTENT_TYPE, "category_a",);
AppsFlyer.sendEvent ("af_purchase", purchaseEvent);
마이너스 수익 기록하기
마이너스 부호를 사용하여 마이너스 수익을 기록합니다.
- 수익 값은 마이너스 기호와 함께 표시됩니다.
- 이벤트 이름에는 "cancel_purchase"라는 특정한 값이 있습니다. 이를 통해 대시보드 및 로데이터 보고서에서 마이너스 수익 이벤트를 식별할 수 있습니다.
예시: 앱 사용자가 환불을 받거나 구독을 취소합니다.
System.Collections.Generic.Dictionary<string, string> purchaseEvent = new
System.Collections.Generic.Dictionary<string, string> ();
purchaseEvent.Add(AFInAppEvents.CURRENCY, "USD");
purchaseEvent.Add(AFInAppEvents.REVENUE, "-200");
purchaseEvent.Add(AFInAppEvents.QUANTITY, "1");
purchaseEvent.Add(AFInAppEvents.CONTENT_TYPE, "category_a");
AppsFlyer.sendEvent ("cancel_purchase", purchaseEvent);
인앱 구매 검증
플러그인은 인앱 구매에 대해서 서버 확인 기능을 제공합니다.
구매 검증을 위해서는, OS에 따른 가이드를 참조하십시오.
#if UNITY_ANDROID && !UNITY_EDITOR
AppsFlyerAndroid.validateAndSendInAppPurchase(
"publicKey",
"signature",
"purchaseData",
"price",
"currency",
null,
this);
#endif
Apple 샌드박스 서버 호출에 대해 꼭 테스트하십시오:
#if UNITY_IOS && !UNITY_EDITOR
AppsFlyeriOS.validateAndSendInAppPurchase(
"productIdentifier",
"price",
"currency",
"tranactionId",
null,
this);
#endif
메서드 파라미터
파라미터 | 설명 |
---|---|
String publicKey | 구글 개발자 콘솔의 퍼블릭 키 |
String signature |
거래 서명; 구매가 완료되었을 때 구글 API에서 리턴된 |
String purchaseData |
JSON 형식으로 구매된 제품 구매가 완료되었을 때 구글 API에서 리턴된 |
String revenue | 앱스플라이어에 전송될 인앱 이벤트 수익 값 |
String currency | 앱스플라이어에 전송될 인앱 이벤트 통화 설정 |
사전 <String, String> additionalParameters |
인앱 이벤트 내역의 추가 파라미터로 인앱 이벤트 로데이터 event_value 필드에 표시 |
파라미터 | 설명 |
---|---|
String productIdentifier | 제품 식별자 |
String price | 앱스플라이어에 전송될 인앱 이벤트 수익 값 |
String currency | 앱스플라이어에 전송될 인앱 이벤트 통화 설정 |
사전 <String, String> additionalParameters |
인앱 이벤트 내역의 추가 파라미터로 인앱 이벤트 로데이터 event_value 필드에 표시 |
일러두기
validateReceipt
을 호출하면, af_purchase 인앱 이벤트가 자동으로 발송됩니다.
구매 검증 이후 구매 이벤트를 보내지 마십시오. 이벤트를 보내면 이벤트 리포트가 중복됩니다.
인앱 이벤트 고려사항
- 이벤트 이름: 최대 45자
- 이벤트 값: 1000자를 넘지 않아야 합니다. 더 긴 경우, 잘릴 수 있습니다.
- 인앱 이벤트(및 다른 API)에서 비영어 문자 지원
- 가격 및 수익:
- 5 또는 5.2와 같이 숫자와 소수만 사용하십시오.
- 소수점이 허용된 경우 최대 5자리. 예를 들어, 5.12345
인앱 이벤트 기록 예시
인앱 이벤트는 sendEvent
를 호출하여 기록하며 이벤트 이름과 값 파라미터를 포함하십시오.더 자세한 내용은 인앱 이벤트 문서에서 찾아볼 수 있습니다.
예시: 인앱 구매 이벤트를 기록하는 방법
업종에 따라 이미 정리해둔 코드 스니펫 리스트를 확인하시려면, 업종별 리치 인앱 이벤트 가이드 항목을 참고하십시오.
System.Collections.Generic.Dictionary<string, string> purchaseEvent = new
System.Collections.Generic.Dictionary<string, string> ();
purchaseEvent.Add(AFInAppEvents.CURRENCY, "USD");
purchaseEvent.Add(AFInAppEvents.REVENUE, "200");
purchaseEvent.Add(AFInAppEvents.QUANTITY, "2");
purchaseEvent.Add(AFInAppEvents.CONTENT_TYPE, "category_a");
purchaseEvent.Add(AFInAppEvents.CONTENT_ID, "092");
AppsFlyer.sendEvent (AFInAppEvents.PURCHASE, purchaseEvent);
오프라인 인앱 이벤트 기록
때때로 사용자는 인터넷에 연결되어 있지 않은 동안 인앱 이벤트를 생성합니다. 가능한 경우 앱스플라이어는 이벤트를 캐시하고 리포트합니다.
- 플러그인은 앱스플라이어 서버에 이벤트를 보내고 응답을 기다립니다.
- 만약 플러그인이 200 응답을 받지 못한다면, 그 이벤트는 캐시에 저장됩니다.
- 다음 200 응답을 받게되면, 캐시된 이벤트를 서버로 다시 전송합니다.
- 캐시에 다수의 이벤트가 있는 경우에는 하나씩 차례대로 서버에 전송됩니다.
일러두기
캐시는 최대 40개의 이벤트를 저장할 수 있습니다.
- 오직 처음 40개의 오프라인 이벤트만 저장됩니다.
- 그 이후 다음 200 응답을 받을 때까지의 모든 이벤트는 저장되지 못하고 버려집니다.
- 로데이터 보고서에서,
- 이벤트 시간(event time) = 기기가 온라인으로 돌아간 후, 이벤트가 앱스플라이어로 전송된 시간.
- 이것은 이벤트가 실제로 발생한 시간이 아닙니다.
원링크와의 딥링크
앱스플라이어의 원링크는 여러 플랫폼의 어트리뷰션과 리디렉션 및 딥링킹을 위한 솔루션입니다.
기기 감지 및 리디렉션
원링크는
- 사용자가 클릭할 때, 기기 유형 (안드로이드, iOS, 데스크톱 등)을 감지한 다음
- 사용자를 일치하는 랜딩페이지로 리다이렉션 합니다: 구글플레이, iOS 앱스토어, 그 외 앱 마켓들 또는 웹페이지.
멀티 플랫폼 어트리뷰션 링크를 구현하고 딥링킹 기본 사항을 검토하려면, 원링크 리디렉션 가이드를 참조하십시오.
딥링킹
딥링킹을 사용하여 기존 사용자를 특정 활동이나 맞춤 컨텐츠로 연결하십시오.
앱 소유자/마케팅 담당자와 개발자는 원링크를 통한 딥링킹 설정을 위해 협력해야만 합니다.
- 앱 소유자/마케팅 담당자는 앱스플라이어 대시보드에 접속해야합니다.
- 개발자는 앱에 액세스해야합니다.
원링크로 딥링킹 설정하기 안내를 참조하십시오.
디퍼드 딥링킹(Deferred Deep Linking)
디퍼드 딥링킹을 사용하면, 신규 사용자가 앱을 인스톨한 이후에 앱을 처음 실행할 때 딥링크 동작하여 특정 맞춤 콘텐츠를 제공할 수 있습니다.
일반 딥링킹 또한 사용자를 특정 활동 및 사용자 맞춤 콘텐츠로 안내하지만, 앱이 이미 사용자의 기기에 설치되어 있어야만 합니다.
원링크를 통해 디퍼드 딥링킹을 설정하려면:
- 개발자가 앱스플라이어 플랫폼에 접속해야합니다.
- 지연된 딥링크나 일반 딥링크에 대한 앱스플라이어 플랫폼 설정은 동일합니다.
- 앱을 설치하고 시작한 후에 사용자를 딥링크하여 맞춤 콘텐츠를 보여줄 수 있도록, 앱에서 추가 논리를 구현해야만 합니다.
자세한 내용은 디퍼드 딥링킹에 대한 가이드를 참고하십시오.
딥링크 데이터 가져오기
플러그인은 모든 설치와 딥링킹 이벤트 후에 전환 또는 인게이지먼트 데이터를 제공합니다. 이 데이터를 사용하여 콘텐츠 또는 앱의 프로그래밍 동작을 계획적으로 맞춤 지정하십시오.
딥링크 데이터를 수신하려면:
onAppOpenAttribution
(IAppsFlyerConversionData
클래스에서 찾을 수 있는) 콜백을 구현합니다. 이는 앱스플라이어 플러그인에 의해 호출됩니다.- 반환된 원링크/어트리뷰션 링크 파라미터는 앱이 열리도록 트리거합니다.
- 이 값을 분석하여 관련 앱 페이지를 열 때 논리를 적용합니다.
public void onAppOpenAttribution(string attributionData)
{
AppsFlyer.AFLog("onAppOpenAttribution", attributionData);
Dictionary<string, object> attributionDataDictionary = AppsFlyer.CallbackStringToDictionary(attributionData);
// add direct deeplink logic here
}
자세한 내용은 딥링킹 데이터 안내를 참조하십시오.
전환 데이터 얻기
각 인스톨에 대해 실시간 사용자 어트리뷰션 데이터에 액세스할 수 있습니다. 이를 통해 다음을 제공함으로써 사용자 인게이지먼트를 향상합니다.
- 사용자 맞춤 콘텐츠
- 사용자를 앱 내 특정 활동으로 연결. 이 가이드의 디퍼드 딥링킹 부분을 참고하십시오.
앱스플라이어 전환 데이터 얻기
앱스플라이어 전환 데이터를 수신하려면:
IAppsFlyerConversionDatabase
를 구현합니다.- 이를 통해 마지막 파라미터로
initSDK
메서드를 호출합니다. onConversionDataSuccess
메서드를 사용하여 사용자를 리디렉션합니다.
onConversionDataSuccess 관련 API 참조 항목을 참고하십시오.
using AppsFlyerSDK;
public class AppsFlyerObjectScript : MonoBehaviour , IAppsFlyerConversionData
{
void Start()
{
/* AppsFlyer.setDebugLog(true); */
AppsFlyer.initSDK("devkey", "appID", this);
AppsFlyer.startSDK();
}
public void onConversionDataSuccess(string conversionData)
{
AppsFlyer.AFLog("onConversionDataSuccess", conversionData);
Dictionary<string, object> conversionDataDictionary = AppsFlyer.CallbackStringToDictionary(conversionData);
// add deferred deeplink logic here
}
public void onConversionDataFail(string error)
{
AppsFlyer.AFLog("onConversionDataFail", error);
}
public void onAppOpenAttribution(string attributionData)
{
AppsFlyer.AFLog("onAppOpenAttribution", attributionData);
Dictionary<string, object> attributionDataDictionary = AppsFlyer.CallbackStringToDictionary(attributionData);
// add direct deeplink logic here
}
public void onAppOpenAttributionFailure(string error)
{
AppsFlyer.AFLog("onAppOpenAttributionFailure", error);
}
}