SDK 버전: 5.4.3 (릴리즈 노트)
중요!
2020년 3월 1일부터 앱스플라이어는 레거시 SDK 버전을 더 이상 사용하지 않습니다. 사용 중지될 버전과 그에 따른 영향 및 최신 SDK 버전으로 업데이트하는 방법에 대해 알아 보시려면 여기를 클릭하십시오.
1. 개요
앱스플라이어 안드로이드 SDK는 앱스플라이어의 어트리뷰션 솔루션의 일부로, 앱 설치 및 인앱 이벤트를 기록하는 기능을 제공합니다. 이 SDK는 시장에서 입증되었으며, 안전하고 가벼우면서도 장착하기 간단합니다.
내장된 SDK를 통해 설치, 세션 및 추가 인앱 이벤트 (예 : 인앱 구매, 게임 레벨 등)을 기록하고 사용자 참여 수준 및 ROI를 평가하십시오!
1.1 SDK 연동 - 필요한 작업
항목 | 목적 | 완료 후 |
---|---|---|
SDK 연동 (필수) |
SDK 연동 및 설정 |
|
핵심 APIs (추천) |
인앱 이벤트와 수익 측정, 딥링크 수행 및 전환 데이터 수집 |
|
추가 API |
선택적 API 구현 및 사용 일부 선택적 API는 특정 앱의 비즈니스 계획에 필수적 일 수 있으므로 이 목록을 확인하는 것을 권장합니다. 예, 앱 삭제 측정 또는 사용자 추천 어트리뷰션 |
|
개발자를 위한 SDK API 관련 빠른 참조 |
1.2 안드로이드 플랫폼과 SDK 호환성
- 안드로이드 OS 버전 4.0 및 그 이상
- 모바일이 아닌 안드로이드 기반 플랫폼 (예, Amazon Fire TV를 포함한 스마트 TV 등)
- 구글플레이 외 안드로이드 앱 마켓 예, 아마존, 바이두
이 탭은 앱 개발자 분들께 앱스플라이어 SDK를 연동하고 초기 설정하는 방법을 설명하기 위해 작성되었습니다. 이 탭의 작업을 완료하고 나면, 앱의 대시보드에 두 개의 앱 설치가 표시될 것입니다. (오가닉 앱 설치 한 개, 논오가닉 앱 설치 한 개)
2. 앱에 SDK 추가
2.1 프로젝트에 SDK 추가하기
앱에 SDK를 추가하는 방법에는 두 가지가 있습니다:
- Gradle 사용하기 (권장)
- 수동으로 SDK 추가
- 다음 코드를 모듈 레벨 /app/build.gradle 파일의
dependencies
앞에 추가합니다:repositories { mavenCentral() }
- 최신 버전의 앱스플라이어 SDK를 dependency로 추가합니다. 최신 버전 SDK는 여기 에서 찾을 수 있습니다.
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:5.4.0' }
- 프로젝트를 동기화하여 dependencies를 확인하십시오 - 스크린 샷 참고:
2.2 앱에 안드로이드 인스톨 리퍼러(install referrer) 추가하기
안드로이드 인스톨 리퍼러는 어트리뷰션 정확도를 높이고 인스톨 사기 등을 방지합니다. 이는 앱스플라이어 안드로이드 SDK 4.8.6 버전 이상에서 지원됩니다.
참고
구글은 BroadcastReceiver를 2020년 3월부터 사용하지 않습니다.
- 이 변경은 앱에 영향을 주지 않습니다.
- 구글플레이 외 안드로이드 스토어(out-of-store) 어트리뷰션을 위해 BroadcastReceiver가 여전히 필요할 수 있습니다. 정확한 확인을 위해, 앱이 등록된 스토어에 확인해보십시오.
- 인스톨 리퍼러 구현은 이제 필수입니다.
앱에 인스톨 리퍼러를 추가하는 방법은 두 가지가 있습니다.
- Gradle 사용하기 (권장)
- 수동으로 인스톨 리퍼러 추가하기
Android Install Referrer를 dependency로 추가하십시오. 최신 버전은 여기에서 찾을 수 있습니다.
-
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:5.+' implementation 'com.android.installreferrer:installreferrer:1.1' }
- 프로젝트를 동기화하여 dependencies를 확인하십시오 - 스크린 샷 참고:
ProGuard를 사용하고 구글의 신규 리퍼러 API를 사용하고자 한다며, 다음과 같이 ProGuard 규칙을 설정하십시오. -keep public class com.android.installreferrer.** { *; }
- Install Referrer aar을 다운로드 하기
- 프로젝트에 추가하기
- Manifest에 다음 권한을 추가합니다:
com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE
2.3 필요 권한 설정
권한을 추가하면 확률적 모델링 어트리뷰션의 매칭 확률을 더욱 높일 수 있습니다. 또한 SDK에서 Wifi나 통신사 네트워크 데이터와 같은 더 많은 데이터를 전송할 수 있습니다. 이런 데이터를 로데이터 보고서 에서 확인하고 캠페인 분석 및 최적화에 사용할 수 있습니다.
필요한 권한 추가하기
- 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" /> <!-- Optional : --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
2.4 구글플레이에서 데이터를 가져오도록 BroadcastReceiver 설정하기
참고
구글은 BroadcastReceiver를 2020년 3월부터 사용하지 않습니다.
- 이 변경은 앱에 영향을 주지 않습니다.
- 구글플레이 외 안드로이드 스토어(out-of-store) 어트리뷰션을 위해 BroadcastReceiver가 여전히 필요할 수 있습니다. 정확한 확인을 위해, 앱이 등록된 스토어에 확인해보십시오.
- 인스톨 리퍼러 구현은 이제 필수입니다.
BroadcastReceiver는 구글플레이에서 앱스플라이어가 어트리뷰션에 사용하는 정보를 가져옵니다. BroadcastReceiver를 사용하면 어트리뷰션 확률이 높아집니다.
인스톨 리퍼러 BroadcastReceiver는 다음 두가지 방법으로 구현할 수 있습니다:
AndroidManifest.xml에 INSTALL_REFERRER
를 수신하는 리시버가 없다면, application tag 안에 다음 리시버를 추가합니다:
<application>
<receiver android:name="com.appsflyer.SingleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
<application>
<receiver android:name="com.appsflyer.MultipleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
팁
리시버를 AndroidManifest.xml에 추가한 후에, "Unresolved class SingleInstallBroadcastReceiver" 에러가 발생하면, 먼저 앱을 빌드했는지 확인하세요.
3. SDK 연동 및 실행
이 섹션에서는 앱스플라이어 안드로이드 SDK를 연동하고 초기화 하는 방법에 대해 설명합니다.
3.1 Dev key 확인
앱스플라이어는 dev key를 사용하여 계정을 고유하게 식별합니다. Dev key는 SDK가 앱스플라이어 계정에 속한 데이터를 안전하게 송수신 하도록 만드는 필수 값입니다.
중요: SDK를 초기화 할 때 올바른 dev key를 사용해야 합니다. 철자가 틀렸거나 잘못된 dev key를 사용하면 SDK에서 전송된 모든 트래픽에 영향을 미치고 어트리뷰션과 보고서에 문제가 발생합니다.
Dev key를 확인하려면:
- 앱의 대시보드에 접속합니다.
- 대시보드의 설정 아래 앱 설정 을 클릭하십시오.
- Dev key를 복사하십시오.
3.2 SDK 초기화 하기
앱의 global application class 내에서 SDK를 초기화 하는 것을 추천합니다. 이를 통해 SDK는 딥링크를 포함한 모든 시나리오에서 초기화 할 수 있습니다.
아래의 단계들은 앱의 global application class 내부에서 이루어집니다.
- 앱의 global application class 내에서 다음 라이브러리를 가져옵니다.
import android.app.Application; import android.util.Log; import com.appsflyer.AppsFlyerLib; import com.appsflyer.AppsFlyerConversionListener; import java.util.Map;
- 글로벌 클래스 내에서, dev key를 AF_DEV_KEY라는 이름으로 변수에 할당하십시오.
중요: SDK를 초기화 할 때 올바른 dev key를 사용해야 합니다. 철자가 틀렸거나 잘못된 dev key를 사용하면 SDK에서 전송된 모든 트래픽에 영향을 미치고 어트리뷰션과 보고서에 문제가 발생합니다.
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; //... }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; //... }
- Global class 내부에서
super.onCreate ()
을 호출한 후,AppsFlyerConversionListener
를 구현하십시오. 코드는 아래 4번 설명을 참고하십시오. ConversionListener
이후 글로벌 클래스 내에서,init()
메서드를 사용하여 SDK를 구동합니다.
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; @Override public void onCreate() { super.onCreate(); AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() { @Override public void onConversionDataSuccess(Map<String, Object> conversionData) { for (String attrName : conversionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName)); } } @Override public void onConversionDataFail(String errorMessage) { Log.d("LOG_TAG", "error getting conversion data: " + errorMessage); } @Override public void onAppOpenAttribution(Map<String, String> attributionData) { for (String attrName : attributionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + attributionData.get(attrName)); } } @Override public void onAttributionFailure(String errorMessage) { Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage); } }; AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, this); } }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; override fun onCreate() { super.onCreate() val conversionDataListener = object : AppsFlyerConversionListener{ override fun onConversionDataSuccess(data: MutableMap<String, Any>?) { data?.let { cvData -> cvData.map { Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}") } } } override fun onConversionDataFail(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } override fun onAppOpenAttribution(data: MutableMap<String, String>?) { data?.map { Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}") } } override fun onAttributionFailure(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } } AppsFlyerLib.getInstance().init(devKey, conversionDataListener, this) } }
- 앱의 글로벌 클래스에서
start()
을 호출합니다.
AppsFlyerLib.getInstance().start(this);
AppsFlyerLib.getInstance().start(this)
3.3 Global application class 등록
3.4 SDK 실행 지연시키기
SDK 실행을 지연키키기 위해, Activity 클래스에서 start을 호출할 수 있습니다.
이 옵션은 가령, GDPR이나 CCPA 요건에 따라 사용자의 개인정보 사용 동의를 얻을 때까지 start을 지연시켜야 할 때, 사용할 수 있습니다.
Activity 클래스에서 start을 호출할 때:
- Activity 인스턴스를 애플리캐이션이 아니라 인수(argument)로 전달하도록 하십시오.
- 딥링킹 기능을 사용하려면,
start()
API를 start이 없는 딥링크를 할 수 있는 다른 Activity에 추가하십시오.
4. 인스톨 테스트
이제 오가닉 및 논오가닉 인스톨을 시뮬레이션하여 SDK 연동을 테스트 할 수 있습니다.
4.1 테스트 기기 등록하기
인스톨 테스트를 시작하기 전에, 테스트에 사용할 기기를 테스트 기기로 등록해야 합니다.
4.2 오가닉 인스톨 시뮬레이션
오가닉 설치는 보통 앱스토어에서 직접 다운로드 받는 인스톨로 어트리뷰트 되지 않는 앱 설치입니다.
오가닉 인스톨을 시뮬레이션하려면:
- 컴퓨터에 모바일 기기가 잘 연결되어 있는지 확인하십시오.
- 안드로이드 스튜디오에서 Logcat을 엽니다.
- 안드로이드 스튜디오에서 앱을 기기 또는 에뮬레이터에 설치하십시오.
- 앱이 시작될 때까지 기다립니다.
- Logcat에서 앱의 패키지 이름을 찾으십시오.
다음이 표시되어야 합니다:
스크린샷에서 강조 표시된 부분은 SDK가 오가닉 인스톨을 확인하였음을 나타냅니다. 이 데이터는 AFApplication 클래스의 onConversionDataSuccess
메서드에서 가져옵니다. 전환 데이터를 가져오는 것은 이 가이드에 후반부에 설명되어 있습니다.
참고: SDK 버전 5 부터, onConversionDataSuccess
는 전환 데이터를 가져 오는 메소드의 이름입니다. SDK 버전 5.0.0 보다 낮은 버전을 사용하는 경우 메소드 이름은 onInstallConversionDataLoaded
입니다. SDK 5.0.0으로 업그레이드 하는 것을 추천드립니다. 더 자세한 내용은 여기를 클릭하여 볼 수 있습니다.
이제 오가닉 인스톨이 앱 대시보드의 개요 페이지에 나타납니다.
앱의 대시보드에서 오가닉 인스톨 숫자를 확인할 수 없으면 SDK 문제 해결 안내서 를 참조하십시오.
4.3 논오가닉 인스톨 시뮬레이션
논오가닉 인스톨은 보통 마케팅 캠페인에 참여하고 일어나는 앱 설치로, 어트리뷰트 성과로 기록되는 인스톨입니다. 어트리뷰션 링크를 사용하여 논오가닉 인스톨을 시뮬레이션 할 수 있습니다.
논오가닉 인스톨을 시뮬레이션하려면:
- Manifest에서 앱의 패키지 이름이 무엇인지 확인하십시오. 예, com.company.app .
- 아래 URL에서 <app_id> 을 귀하의 앱 패키지 이름으로 바꾸십시오.
https://app.appsflyer.com/<app_id>?pid=Test&c=Test
- c 파라미터는 캠페인 이름을 나타냅니다.
- pid 파라미터는 인스톨이 어트리뷰션되는 미디어 소스의 이름을 나타냅니다.
- 컴퓨터로 클릭 테스트시, 광고 ID(GAID)를 추가해야 합니다. (1 단계의 링크 끝에
&advertising_id=<GAID>
를 추가하십시오.)
- 아래 URL에서 <app_id> 을 귀하의 앱 패키지 이름으로 바꾸십시오.
- 이 url을 기기로 전송합니다. 이메일이나 메신저 앱을 통해 url 링크를 보내면 됩니다.
- 기기에서 url을 클릭하십시오.
- 만약 앱이 이미 앱 마켓에 등록되어 있다면 앱 마켓으로 리디렉트됩니다. 연결된 앱 마켓에서 앱을 다운로드 받지 마시고 5번 단계를 진행하십시오.
- 아직 앱이 앱 마켓에 등록되지 않았고 개발단계라면, 링크를 클릭했을 때 앱스토어에서 해당 앱을 찾을 수 없다는 메시지가 보여질 것입니다. 무시하고 5번 단계를 진행하십시오.
- 안드로이드 스튜디오에서 Logcat을 엽니다.
- USB 케이블을 통해 기기를 컴퓨터에 연결하십시오.
- 안드로이드 스튜디오에서 기기에 앱을 설치하십시오.
- Logcat에서 앱의 패키지 이름을 찾으십시오.
다음이 표시되어야 합니다:
이제 논오가닉 인스톨이 앱 대시보드의 개요 페이지에 나타납니다.
참고
SDK 연동 테스트 및 디버깅을 완료하면 SDK 로그를 끕니다.
SDK 연동 관련 알려진 문제
SDK 연동시 발생할 수 있는 문제와 이를 해결하는 방법에 대해 아래 내용을 참고하십시오.
ProGuard 경고
ProGuard 사용 중 AFKeystoreWrapper
클래스에 관한 경고가 표시된다면, ProGuard 규칙 파일에 다음 코드를 추가하십시오.
-keep class com.appsflyer.** { *; }
백업 규칙
AndroidManifest.xml의 <application> 태그에 android:fullBackupContent="true"
를 추가하면, 오류가 발생할 수 있습니다:
Manifest merger failed : Attribute application@fullBackupContent value=(true)
이 오류를 해결하려면, AndroidManifest.xml 파일의 <application> 태그에 tools:replace="android:fullBackupContent"
를 삽입하세요.
위 가이드 외에 백업 룰(android:fullBackupContent="@xml/my_rules"
)이 있는 경우, 다음 규칙에 따라 앱스플라이어 규칙과 병합하십시오.
<full-backup-content>
...//your custom rules
<exclude domain="sharedpref" path="appsflyer-data"/>
</full-backup-content>
누락된 리소스 파일
If you are using Android SDK V5 and above, make sure that in the APK file, in addition to the classes.dex and resources files, you also have folder com > appsflyer > internal with files a- and b- inside.
Note: Before SDK 5.3.0, file names are a. and b.
안드로이드 스튜디오에서 APK를 열어 필요한 파일이 있는지 확인하십시오. 다음 스크린샷을 참고하십시오.
해당 파일이 누락되어 있다면, SDK가 앱스플라이어 서버에 네트워크 요청을 할 수 없어서 담당 고객 성공 매니저나 지원팀에 연락해야 합니다.
이 탭에서는 인앱 이벤트 및 수익을 기록하는 방법과 딥링크를 설정하는 방법에 대해 설명합니다.
인앱 이벤트 및 수익을 기록하면 사용자 퀄리티를 측정할 수 있습니다. 딥링크를 사용하면 사용자에게 더 나은 사용자 경험을 제공할 수 있습니다.
이 탭은 개발자 분들을 위한 안내이지만, 다음과 같은 이유로 마케팅 담당자가 꼭 입력해야하는 부분이 있습니다:
- 마케팅 담당자는 사용자 퀄리티를 측정하기 위해 어떤 인앱 이벤트를 기록해야하는지 결정해야합니다.
- 마케팅 담당자는 원링크(OneLink)를 통한 딥링킹을 설정하기 위해 앱스플라이어 대시보드에 접속해야만 합니다.
5. 인앱 이벤트 기록하기
인앱 이벤트는 앱에서 어떤 일이 일어나는지 인사이트를 제공합니다. 제일 먼저, 어떤 이벤트를 기록하고 싶은지 정의하는 것을 추천드립니다. 인앱 이벤트를 기록하면 ROI (Return on Investment)나 LTV (Lifetime Value)와 같은 성과지표들을 측정할 수 있습니다.
인앱 이벤트를 기록하는 방법에는 여러 가지가 있습니다. 가장 일반적인 방법은 SDK를 통해 이벤트를 보내는 것으로 아래에서 설명하고 있습니다. 인앱 이벤트를 기록하는 다른 방법에 대한 자세한 내용은 인앱 이벤트 개요 가이드 참고하십시오.
여행, 게임, 이커머스 등 앱이 속한 업종에 따라, 여기에서 업종별 추천 측정 인앱 이벤트를 참고하십시오.
5.1 인앱 이벤트 이름 및 파라미터
SDK에는 인앱 이벤트 관련 두 가지 인터페이스가 있습니다:
- AFInAppEventType - 인앱 이벤트 이름에 대한 상수.
- AFInAppEventParameterName - 인앱 이벤트 파라미터 이름에 대한 상수.
아래의 이유로, 이 두 가지 인터페이스를 사용하시는 것을 강력하게 추천드립니다:
- 표준 방식의 이름 지정을 통해 앱스플라이어는 자동으로 페이스북, 구글, 트위터, 스냅챗과 같은 Self-reporting networks(SRNs)의 이벤트와 매핑할 수 있습니다.
- 이전 버전과의 호환성 - 앱스플라이어가 특정 이벤트의 이름이나 이벤트 파라미터를 변경하더라도, 기존의 구현 내용이 이전 버전과 호환됩니다.
이 두 인터페이스를 사용하려면, 아래처럼 임포트 하십시오:
import com.appsflyer.AFInAppEventParameterName;
import com.appsflyer.AFInAppEventType;
여기에서 추천하는 이벤트 이름과 구조의 리스트를 확인하십시오.
5.2 수익 값 (revenue) 기록
어떤 인앱 이벤트로도 수익 값을 보낼 수 있습니다. af_revenue
(AFInAppEventParameterName.REVENUE
)이벤트 파라미터를 사용하여 수익을 인앱 이벤트의 일부로서 계산할 수 있습니다. 양수 또는 음수의 모든 숫자를 입력할 수 있습니다.
af_revenue
는 앱스플라이어가 로데이터와 대시보드에서 실제 수익으로 집계하는 유일한 이벤트 파라미터입니다. 더 자세한 내용을 보시려면 여기를 클릭하십시오.
수익 값이 있는 이벤트를 보낼 때 다음을 명심하십시오:
- 통화 코드를 설정하려면 (아래 예시 참고), 반드시 3 글자 ISO 4217 코드 이어야 합니다. (기본은 USD).
- 다음 메서드를 호출하여 모든 이벤트에 대한 통화 코드를 설정할 수 있습니다:
AppsFlyer.setCurrencyCode ( " ZZZ " )
통화 설정, 표시 및 통화 변환에 대한 자세한 내용은 수익 통화에 대한 안내서 를 참조하십시오. - 수익 값에는 쉼표 구분 기호, 통화 기호 또는 텍스트가 절대로 포함되면 안됩니다. 예를 들어 수익 이벤트 값은 1234.56과 같은 형태가 되어야 합니다.
예 : 수익 값이 있는 인앱 구매 이벤트
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt")
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD")
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue)
위의 구매 이벤트에는 $1234.56의 수익이 있으며, 대시보드에 수익(revenue)으로 표시됩니다.
마이너스 수익 기록하기
마이너스 수익을 기록해야하는 상황이 있을 수 있습니다.
예를 들어, 사용자가 앱에서 구매한 신발에 대해 환불을 받는 경우.
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,-200);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"shoes");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"4875");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , "cancel_purchase" , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE, -200)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE, "category_a")
eventValue.put(AFInAppEventParameterName.CONTENT_ID, "1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY, "USD")
AppsFlyerLib.getInstance().logEvent(applicationContext, "cancel_purchase", eventValue)
참고
위의 코드에서 다음 사항을 참고하세요.
- 수익 값은 마이너스 기호와 함께 표시됩니다.
- 대시보드 및 로데이터 보고서에서 마이너스 수익 이벤트를 식별할 수 있도록 이벤트 이름에 "cancel_purchase"라는 특정한 값이 있습니다.
5.3 인앱 구매 검증
앱스플라이어의 SDK는 인앱 구매에 대해서 서버 구매 영수증 검증 기능을 제공합니다. 구매 내역을 검증하기 위해서는 validateAndLogInAppPurchase
를 호출하십시오.
구매가 확인되면 이 호출은 자동으로 af_purchase
인앱 이벤트를 생성합니다.
public static void validateAndLogInAppPurchase(Context context,
String publicKey, String signature, String purchaseData,
String price, String currency, HashMap<String, String> additionalParameters);
메서드 파라미터
- String publicKey – 구글 개발자 콘솔의 퍼블릭 키 .
- String signature – 거래 서명 (구매가 완료되었을 때 구글 API에서 리턴된).
- String purchaseData – JSON 형식으로 구매한 제품 (구매가 완료되었을 때 구글 API에서 리턴된).
- String price – 앱스플라이어에 전송될 인앱 이벤트 수익 값.
- String currency – 앱스플라이어에 전송될 인앱 이벤트 통화 설정.
- HashMap<String, String> additionalParameters – 인앱 이벤트 내역의 추가 파라미터로 인앱 이벤트 로데이터 event_value 필드에 표시됩니다.
구매 검증이 성공했을 때와 실패했을 때의 콜백
구매 검증 시도가 성공했는지 여부를 확인하려면 애플리케이션 클래스에서 registerValidatorListener를 구현하십시오. 이 리스너는 '성공'한 경우와 '실패'한 경우(검증 실패나 다른 원인때문에) 두 개의 콜백 블록을 가집니다.
AppsFlyerLib.getInstance().registerValidatorListener(this,new
AppsFlyerInAppPurchaseValidatorListener() {
public void onValidateInApp() {
Log.d(TAG, "Purchase validated successfully");
}
public void onValidateInAppFailure(String error) {
Log.d(TAG, "onValidateInAppFailure called: " + error);
}
});
AppsFlyerLib.getInstance().registerValidatorListener(this, object : AppsFlyerInAppPurchaseValidatorListener {
override fun onValidateInApp() {
Log.d(LOG_TAG, "Purchase validated successfully")
}
override fun onValidateInAppFailure(error: String) {
Log.d(LOG_TAG, "onValidateInAppFailure called: $error")
}
})
구매 검증 사용 예시:
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private void handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
Map<String, String> additional_event_values = new HashMap<>();
additional_event_values.put("some_parameter", "some_value");
String price= "10";
String currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(getApplicationContext(), PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private fun handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
val additional_event_values = HashMap<String, String>()
additional_event_values.put("some_parameter", "some_value");
val price= "10";
val currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(this, PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
구매 검증을 통과하면 앱스플라이어로 인앱 구매 이벤트가 자동 전송됩니다. 아래에서 event_value 파라미터에 전송된 샘플 데이터를 참고하십시오:
{
"some_parameter":"some_value", // from additional_event_values
"af_currency":"USD", // from currency
"af_content_id":"test_id", // from purchase
"af_revenue":"10", // from revenue
"af_quantity":"1", // from purchase
"af_validated":true // flag that AF verified the purchase
}
참고
validateAndLogInAppPurchase
를 호출하면, 자동으로 af_purchase 인앱 이벤트를 발송합니다. 그러므로 이 이벤트를 따로 직접 전송하면 인앱 구매 내역이 이중으로 기록됩니다.
5.4 인앱 이벤트 제한점
- 이벤트 이름: 45자 까지만 가능
- 이벤트 밸류: 1000자를 넘지 않아야 합니다. 더 긴 경우, 잘려서 보여집니다.
- 가격 및 수익: 숫자 또는 소수만 사용하십시오. (예: 5 또는 5.2)
- 가격 및 수익 값은 마침표 뒤로 최대 5 자리까지 가능합니다. 예, 5.12345
- 안드로이드 SDK 버전 4.8.1부터 인앱 이벤트나 다른 SDK API에서 영어가 아닌 문자도 사용할 수 있도록 지원합니다.
5.5 인앱 이벤트 기록 예시
인앱 이벤트는 logEvent
을 event name과 value 파라미터와 함께 호출하여 기록할 수 있습니다. 더 자세한 내용은 인앱 이벤트 문서를 참조하십시오.
아래는 구매 이벤트를 기록한 간단한 예입니다. 업종에 따라 이미 정리해둔 코드 스니펫 리스트를 확인하시려면, 업종 별 리치 인앱 이벤트 가이드 항목을 참고하십시오.
예시: 인앱 구매 이벤트
Map<String,Object> eventValues = new HashMap<>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200);
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY");
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes");
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues);
val eventValues = HashMap<String, Any>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200)
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY")
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes")
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues)
5.6 오프라인 인앱 이벤트 기록하기
사용자가 인터넷에 연결되지 않았을 때 이벤트가 발생한 경우라도 앱스플라이어는 여전히 이벤트를 기록할 수 있습니다. 작동원리는 이렇습니다:
- SDK가 앱스플라이어 서버에 이벤트를 보내고 응답을 기다립니다.
- SDK에서 200 응답을 받지 못하는 경우는 이벤트가 캐시에 저장됩니다.
- 저장된 이벤트는 다음 200 응답을 받을 때 서버로 다시 전송됩니다.
- 캐시에 다수의 이벤트가 있는 경우에는 순서대로 하나씩 빠르게 서버로 전송됩니다.
참고
SDK의 캐시는 최대 40개의 이벤트를 저장할 수 있습니다. 따라서 오프라인 상태에서 발생한 첫 40개의 이벤트는 저장되지만, 그 이후 다음 200 응답을 받을 때까지의 모든 이벤트는 저장되지 못하고 버려집니다.
로데이터에 표시된 이벤트 시간(event time)은 기기가 다시 온라인 상태가 된 후 앱스플라이어로 이벤트가 전송된 시간입니다. 그러므로 이벤트가 실제로 일어난 시간이 아닙니다.
5.7 인앱 이벤트 기록시 성공 및 실패 처리
인앱 이벤트를 기록할 때 리스너를 설정할 수 있습니다. 이 리스너를 사용하여 두 가지 시나리오에 대한 논리를 정의할 수 있습니다.
- 인앱 이벤트가 성공적으로 기록되었습니다.
- 인앱 이벤트를 기록할 때 오류가 발생했습니다.
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Event sent successfully");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Event sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
인앱 이벤트를 기록할 때 에러가 발생하면, 아래와 같이 에러 코드와 설명이 제공됩니다.
오류 코드 | 설명 |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param |
11 |
"Skipping event because 'isStoped' enabled" |
40 |
Network error: Error description comes from Android |
41 |
"No dev key" |
50 |
"Status code failure" + 서버에서 받은 실제 응답 코드 |
6. 원링크(OneLink)를 통한 딥링킹
OneLink는 여러 플랫폼에서의 성과 측정과 리다이렉션 및 딥링킹 을 위한 앱스플라이어의 솔루션입니다.
6.1 기기 확인 및 리다이렉션
OneLink는 클릭 시 기기 유형을 감지하고, 사용자를 일치하는 랜딩 페이지로 리다이렉션합니다. 예, 구글 플레이, iOS 앱스토어, 그 외 앱 마켓들 또는 웹 페이지.
원링크 리다이렉션 가이드에서 멀티 플랫폼 어트리뷰션 링크에 대해 설명하고 있습니다. (별도의 SDK 코드는 필요하지 않음). 딥링킹에 대한 기본 설명도 포함하고 있습니다.
6.2 딥링킹
딥링킹을 통해 사용자를 특정 활동 페이지로 보내고 그에 맞춘 컨텐츠를 제공할 수 있습니다. 리타겟팅 캠페인을 운영할 때 특히 유용합니다.
원링크로 딥링크를 설정하려면, 앱스플라이어 대시보드에 접속할 수 있는 마케팅 담당자와 앱 코드에 작업할 수 있는 개발자가 반드시 협업해야만 합니다.
원링크로 딥링킹 설정하기 가이드에서 상세 설명을 확인하십시오.
6.3 디퍼드 딥링킹 (Deferred deep linking)
디퍼드 딥링킹을 사용하면, 신규 사용자가 앱을 다운로드 받은 이후에 딥링크 동작하여 특정 맞춤 콘텐츠를 제공 할 수 있습니다. 이는, 앱이 사용자 기기에 이미 설치되어 있어야 동작하는 일반적인 딥링크와 다릅니다.
원링크를 통해 디퍼드 딥링킹을 설정하려면, 앱 개발자도 앱스플라이어 대시보드에 접속할 수 있어야 합니다.
디퍼드 딥링킹 설정은 일반 딥링킹 설정과 동일합니다. 유일한 차이점은, 앱을 설치하고 시작한 후에 사용자를 딥링크하여 맞춤 콘텐츠를 보여줄 수 있도록, 앱에서 추가 논리를 구현해야한다는 것입니다.
자세한 내용은 디퍼드 딥링킹에 대한 가이드를 참고하십시오.
6.4 딥링크 데이터 확보하기
SDK는 모든 설치와 딥링킹 이벤트 후에 전환(conversion) 또는 참여(engagement) 데이터를 제공합니다. 이 데이터를 사용하여 콘텐츠 및 앱의 동작을 계획적으로 맞춤 지정할 수 있습니다.
디렉트 딥링크가 사용되어 앱이 열렸을 때의 딥링킹 데이터를 얻으려면 onAppOpenAttribution 메서드를 구현하십시오.
언제든지 수작업으로 딥링킹 리인게이지먼트 데이터를 얻으려면, performOnAppAttribution 메서드를 구현하십시오.이 메서드로 새로운 리인게이지먼트를 기록하지 않고 리인게이지먼트 데이터에 액세스할 수 있습니다.
자세한 내용은 딥링크 데이터에 대한 가이드를 참고하십시오.
7. 전환 데이터 얻기
새 인스톨이 일어날 때마다, SDK 내에서 사용자 어트리뷰션 데이터에 실시간으로 액세스 할 수 있습니다.
이렇게 함으로써, 사용자에게 맞춤형 콘텐츠를 제공하거나, 사용자를 앱 내부의 특정 액티비티로 연결(이 문서의 디퍼드 딥링킹 항목 참고) 할 수 있습니다. 이는 앱에 대한 사용자 인게이지먼트를 향상할 수 있습니다.
앱스플라이어의 전환 데이터를 안드로이드 SDK에서 확보하기 위해서는 AppsFlyerConversionListener
를 구현하십시오.
import android.app.Application;
import com.appsflyer.AppsFlyerLib;
import com.appsflyer.AppsFlyerConversionListener;
import java.util.Map;
import android.util.Log;
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
@Override
public void onConversionDataSuccess(Map<String, String> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
@Override
public void onConversionDataFail(String errorMessage) {
Log.d("LOG_TAG", "error getting conversion data: " + errorMessage);
}
@Override
public void onAppOpenAttribution(Map<String, String> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
@Override
public void onAttributionFailure(String errorMessage) {
Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage);
}
};
AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, getApplicationContext());
AppsFlyerLib.getInstance().start(this);
}
}
import com.appsflyer.AppsFlyerConversionListener
import com.appsflyer.AppsFlyerLib
import com.appsflyer.AppsFlyerLibCore.LOG_TAG
class AFApplication : Application() {
private val devKey = "qrdZGj123456789";
override fun onCreate() {
super.onCreate()
val conversionDataListener = object : AppsFlyerConversionListener{
override fun onConversionDataSuccess(data: MutableMap<String, Any>?) {
data?.let { cvData ->
cvData.map {
Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}")
}
}
}
override fun onConversionDataFail(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
override fun onAppOpenAttribution(data: MutableMap<String, String>?) {
data?.map {
Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}")
}
}
override fun onAttributionFailure(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
}
AppsFlyerLib.getInstance().init(devKey, conversionDataListener, applicationContext)
AppsFlyerLib.getInstance().start(this)
}
}
AppsFlyerConversionListener
인터페이스에서 가장 중요한 API는 다음과 같습니다:
onInstallConversionData
- 신규 앱 설치에 대한 전환 데이터를 제공합니다.
참고: SDK 버전 V5 부터,onConversionDataSuccess
는 전환 데이터를 가져 오는 메소드의 이름입니다. SDK 버전 5.0.0 보다 낮은 버전을 사용하는 경우, 메소드 이름은onInstallConversionDataLoaded
입니다. SDK 5.0.0으로 업그레이드 하십시오. 더 자세한 내용은 여기를 클릭하십시오.onAppOpenAttribution
- 이미 설치되어 있는 앱이 수동이나 딥링킹을 통해 실행되었을 때, 리타겟팅 전환 데이터를 제공합니다.
전환 데이터에 대해 자세히 알아보시려면 전환 데이터 시나리오에 대한 가이드를 참고하십시오.
8. 어트리뷰션
구글플레이 외 앱 마켓(out-of-store) 안드로이드 앱
앱스플라이어를 사용하면, 구글 플레이 외 앱 마켓을 통한 인스톨까지 성과 측정 할 수 있습니다. 이를 통해 구글 플레이를 사용할 수 없는 시장에서도 앱을 홍보하고 더 많은 잠재 고객에게 도달 할 수 있습니다.
구글플레이 외 앱 마켓의 앱 설치를 어떻게 어트리뷰트하는지에 대한 더 상세한 내용은 여기를 참고하세요 .
사전 설치된(pre-installed) 앱
사전 설치 캠페인은, 앱 개발사가 모바일 기기 제조사와 계약하여 기기 생산 시에 앱이 미리 설치되어 있도록 하는 경우입니다.
앱스플라이어를 사용하면, 이렇게 사전 설치된 앱의 인스톨을 쉽게 어트리뷰트 할 수 있습니다. 사용자가 앱을 최초 실행할 때, 앱스플라이어는 해당 인스톨을 기기 제조사 이름 미디어 소스로 어트리뷰트 합니다.
더 자세한 내용을 보려면 여기를 클릭하세요.
앱 삭제 측정
앱 삭제 측정을 셋팅하는 방법에 대해서는 여기를 읽어보십시오.
트래킹 요청 리스너 설정
앱스플라이어 서버가 트래킹 요청을 성공적으로 수신했다는 확인 신호를 받길 원하시면, AppsFlyerRequestListener 리스너를 구현하십시오.
onRequestSuccess()
콜백 메서드가 SDK가 실행한 어트리뷰션 요청에 대해 매 200회 응답
마다 호출됩니다.
onRequestFailure(String error)
콜백 메서드가 다른 응답에 대해 호출되고 오류 메시지를 반환합니다.
구현 예
AppsFlyerLib.getInstance().start(getApplicationContext(), "devKey", new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully, got 200 response code from server");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().start(this, "devKey", object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
Request Listner에서 에러가 발생하면, 다음과 같은 에러 코드와 설명이 제공됩니다.
오류 코드 | 설명 |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param |
11 |
"Skipping event because 'isStopped' enabled" |
40 |
Network error: Error description comes from Android |
41 |
"No dev key" |
50 |
"Status code failure" + 서버에서 받은 실제 응답 코드 |
추가 사용자 정의 데이터 설정
setAdditionalData
API는 SDK 수준에서 Segment, Adobe및 Urban Airship과 같은 몇몇 외부 파트너 플랫폼과 연동할 때 필요합니다.
이 API는 해당 플랫폼의 연동 안내 문서에서 setAdditionalData API가 필요하다고 특별히 명시된 경우에만 사용하십시오.
setAdditionalData
코드 예시:
HashMap<String,Object> CustomDataMap = new HashMap<>();
CustomDataMap.put("custom_param_1","value_of_param_1");
AppsFlyerLib.getInstance().setAdditionalData(CustomDataMap);
val customDataMap = HashMap<String, Any>()
customDataMap.put("custom_param_1","value_of_param_1")
AppsFlyerLib.getInstance().setAdditionalData(customDataMap)
9. 세션
세션 간 시간 정의
기본 설정으로는, 앱을 실행할 때의 간격이 적어도 5초 이상이 되어야 두 개의 별도 세션으로 집계합니다(세션 집계에 대해 알아보기).
다음 API를 사용하여 세션 사이의 최소 필요시간을 설정합니다:
AppsFlyerLib.setMinTimeBetweenSessions(int seconds);
너무 높은 값을 세션 간격 시간으로 설정하면 딥링킹과 같이 세션 데이터를 사용하는 API에 문제가 생길 수 있습니다.
유틸리티 앱을 위한 백그라운드 세션
새로운 사용자 세션을 이 SDK 메서드를 통해 기록할 수 있습니다. 이 방법은 예를 들어, 백그라운드에서 동작하는 유틸리티 앱에 유용할 수 있습니다.
이 API를 액티비티 onCreate(): 에 사용하십시오
public void logSession(Context context);
사용 예:
AppsFlyerLib.getInstance().logSession(context);
10. 온드 미디어(Owned Media)
래핑된 딥링크 URL 분석하기
이메일 서비스 제공 업체들 과 같은 몇몇 외부 업체 서비스 사는 이메일 내의 링크를 자체 클릭 기록 도메인으로 래핑(wrapping)합니다. 어떤 업체는 자신의 클릭 기록 도메인을 직접 설정하도록 허용하기도 합니다. 만약 원링크가 이런 도메인들에서 래핑된다면, 원링크의 기능이 제한될 수 있습니다.
이 문제를 해결하기 위해 setResolveDeepLinkURLs
API를 사용할 수 있습니다. 이 API를 사용하여 앱을 시작하는 클릭 도메인에서 원링크를 가져 오십시오. 반드시 SDK 초기화 전에 이 API를 호출해야합니다.
예를 들어, 당신의 원링크(https://mysubdomain.onelink.me/abCD)로 리다이렉션되는 세 개의 클릭 도메인이 있습니다. 이 API를 사용하여 클릭 도메인이 리다이렉션하는 원링크를 가져오십시오. 이 API 메서드는 SDK가 분석하는 도메인 목록을 수신합니다. SDK 초기화 전에 다음 코드를 추가하십시오.
AppsFlyerLib.getInstance().setResolveDeepLinkURLs("clickdomain.com", "myclickdomain.com", "anotherclickdomain.com");
위의 코드를 사용하면 원링크 기능을 유지하면서 자체 클릭 도메인을 사용할 수 있습니다. 여기에서 클릭 도메인은 앱 실행을 담당합니다. 대신 API가 이 클릭 도메인에서 원링크를 가져오고, 이 원링크에서 데이터를 확보하여 맞춤식 콘텐츠로 딥링크 하는데 사용할 수 있습니다.
푸시 알림 기록하기
앱스플라이어를 사용하여, 리타겟팅 캠페인 중 일부인 푸시 알림 성과를 측정할 수 있습니다.
이 기능을 사용하려면, 푸시 알림 클릭 이후 실행되는 모든 액티비티의 onCreate
메서드에서, sendPushNotificationData
메서드를 호출하십시오:
AppsFlyerLib.getInstance().sendPushNotificationData(this);
푸쉬 알림 측정에 대한 더 자세한 내용은 여기에서 확인하실 수 있습니다.
사용자 초대 어트리뷰션
기존 사용자가 친구나 아는 사람을 앱의 신규 사용자로 초대하도록 하는 것은 앱 사용자를 늘리는데 크게 기여할 수 있습니다. 앱스플라이어를 사용하면 앱 내 사용자 초대에서 발생한 설치를 어트리뷰트하고 기록할 수 있습니다.
더 자세한 내용은 사용자 초대 어트리뷰션 안내를 참조하십시오.
크로스 프로모션 어트리뷰션
11. 사용자 식별자
앱스플라이어 ID 확보하기
AppsFlyer ID는 앱의 모든 신규 설치가 일어날 때마다 발급됩니다. 다양한 목적으로 AppsFlyer ID를 활용할 수 있습니다:
- 서버 간 인앱 이벤트(server-to-server in-app events) 보내기.
- 백엔드 시스템의 사용자 기록을 AppsFlyer ID와 맞추기.
- 풀(pull) 혹은 푸시(push) API로 수신한 데이터 병합하기.
AppsFlyer ID를 확보하기 위해서 다음 API를 사용하세요:
public String getAppsFlyerUID(Context context);
사용 예:
String appsFlyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(this);
고객 사용자 ID 설정
고객 사용자 ID를 설정하려면 다음 코드를 사용하세요.
public void setCustomerUserId(String id);
사용 예:
AppsFlyerLib.getInstance().setCustomerUserId("myId");
고객 ID를 설정한 이후에만 인앱 이벤트 기록이 연결되어 보고되므로, 가능한 앱 활동 흐름 초기에 고객 사용자 ID 셋팅하는 것을 추천드립니다.
- 만약에
setCustomerUserId
가start
을 호출하기 이전에 호출된다면, 로데이터 상, 고객 ID 정보가 인스톨과 이벤트에 포함되어 표시됩니다. - 만약에 이 호출이 이후에 이루어진다면, 고객 ID 정보는 고객 사용자 ID 셋팅한 이후의 이벤트에서만 연결되어 보여집니다.
고객 사용자 ID 가져오기:
첫 번째 앱 실행 후 고객 사용자 ID 값이 다시 설정되지 않도록 하기 위하고, 고객 사용자 ID를 얻기 위한 서버 호출을 줄이기 위해서, 다음 구문을 사용하여 값이 비어 있는지 여부를 확인할 수 있습니다:
AppsFlyerProperties.getInstance().getString(AppsFlyerProperties.APP_USER_ID)
고객 사용자 ID에 대해 더 자세히 알아보려면 여기를 클릭하세요.
고객 사용자 ID (customerUserID)를 위해 SDK 초기화 지연시키기
customerUserID가 설정될 때까지 SDK 초기화를 지연시킬 수 있습니다.
고객 사용자 ID 호출할 때까지 SDK 초기화를 지연시키기 위해서는 다음을 수행하십시오:
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
메서드를 init() 메서드 바로 앞에서 호출합니다. SDK 초기화의 나머지 부분은 변경되지 않아야 합니다.
일단 customerUserID가 부여되고 나면,
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
SDK에 관련 고객 사용자 ID를 제공하고 SDK가 시작되도록 합니다.
코드는 다음과 같이 작성되어야 합니다.
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
AppsFlyerConversionListener conversionDataListener =
new AppsFlyerConversionListener() {
...
};
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
AppsFlyerLib.getInstance().init(AF_DEV_KEY, getConversionListener(), getApplicationContext());
AppsFlyerLib.getInstance().start(this);
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
//Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
}
}
class AFApplication: Application() {
private val afDevKey = ""
override fun onCreate() {
super.onCreate()
val conversionDataListener = object: AppsFlyerConversionListener {
...
}
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
AppsFlyerLib.getInstance().init(afDevKey, conversionDataListener, this)
AppsFlyerLib.getInstance().start(this)
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
// Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this)
}
}
고객 사용자 ID가 가능할 때까지 SDK 초기화를 지연시키는 것에 대해 더 자세한 내용을 보시려면 여기로 이동하십시오.
주의
이 API는 비즈니스 로직에 적합한 경우에만 사용하십시오. 이 API를 사용하면 수치 차이가 발생할 가능성이 높아지고, 앱이 fraud에 더 노출될 수도 있습니다.
Google 광고 ID
SDK 4.8.0 버전부터 AppsFlyer는 google_advertising_id
를 자동으로 수집합니다.
Google Advertising ID 수집에 관한 요구 사항은 SDK 4.7.x 이하 버전에서만 적용됩니다.
OAID, IMEI 및 Android ID
어트리뷰션을 하기 위해서는, 적어도 하나의 기기 식별자가 수집되어야만 합니다. 다음 ID들이 가능합니다: 구글 광고 ID, 안드로이드 ID, IMEI, OAID
GAID - Google Advertising ID (구글 광고 ID)
구글 플레이 서비스가 포함된 앱이라면 자동으로 수집됩니다. 구글 광고 ID를 사용 가능한 경우라면, 구글 플레이 정책 위반을 피하기 위해, IMEI와 안드로이드 ID를 수집해서는 안됩니다.
IMEI 및 안드로이드 ID
기본 설정으로는 비활성화 되어 있습니다. 구글 플레이 서비스를 포함하지 않은 앱에서만 수집될 수 있습니다.
참고 2019년 말에 출시된 안드로이드 10 (API 레벨 29) 부터, IMEI 에 대한 접근이 제한됩니다.
식별자 ID를 앱스플라이어로 전송하기 위해서는:
- 앱이 오픈될 때 기기 IMEI 또는 안드로이드 ID를 수집합니다.
start
메서드를 호출하기 전에 다음 API들을 호출합니다:
AppsFlyerLib.getInstance().setImeiData("IMEI_HERE"); AppsFlyerLib.getInstance().setAndroidIdData("ANDROID_ID_HERE");
OAID - Open Advertiser Identifier
디바이스 ID 수집 옵트 아웃
다음 API를 사용하여 IMEI와 안드로이드 ID, OAID 수집을 옵트아웃할 수 있습니다:
AppsFlyerLib.getInstance().setCollectIMEI(false);
AppsFlyerLib.getInstance().setCollectAndroidID(false);
AppsFlyerLib.getInstance().setCollectOaid(false);
12. 사용자 프라이버시
옵트아웃
몇몇 심각한 경우에는 법률 및 개인 정보 보호 준수를 위해서 모든 SDK 트래킹을 중지해야 하는 경우도 있을 수 있습니다. 이 작업은 isStopped API를 사용하여 수행할 수 있습니다. 이 API가 호출되고 나면, 앱스플라이어 SDK의 작동이 중지되고 더 이상 앱스플라이어 서버와 통신하지 않습니다.
AppsFlyerLib.getInstance().stop(true, context);
서로 다른 몇 가지 사용자 옵트아웃 시나리오가 있습니다. 앱과 관련된 각 시나리오에 맞는 정확한 지침을 따르는 것을 권장합니다.
어떤 이벤트에서든 이 API에 False를 넘기면서 호출하면 SDK를 다시 활성화할 수 있습니다.
중요 정보
isStopped
이 true
로 설정된 경우, start
을 호출하지 마십시오.
stop
을 false
로 설정하고 나서 트래킹을 다시 시작하려면 다음 SDK API를 사용합니다.
AppsFlyerLib.getInstance().start(getApplicationContext(), AF_DEV_KEY);
주의
모든 트래킹에서 이 사용자를 완전히 무시하려는 경우에만 stop API를 사용합니다. 이 API를 사용하면 어트리뷰션, 데이터 수집 및 딥링킹 동작에 심각한 영향을 줄 수 있습니다.
사용자 데이터 익명 처리
SDK를 초기화하는 동안 다음 API를 사용하면, 사용자의 설치, 이벤트, 세션을 명시적으로 익명처리 할 수 있습니다:
public void anonymizeUser(boolean isDisabled);
사용 예:
AppsFlyerLib.getInstance().anonymizeUser(true);
anonymizeUser
를 false로 설정하고 호출하면, 트래킹을 다시 시작할 수 있습니다.
주의
사용자를 익명 처리하면 어트리뷰션 정보에 심각한 영향을 줄 수 있습니다.사용자 정보 수집이 법적으로 금지된 지역에서만 이 옵션을 사용하십시오.
파트너사와 데이터 공유 차단하기
광고주는 특정 사용자들의 사용자 레벨 데이터를 애드 네트워크/파트너사와 공유하지 않을 경우가 있습니다. 사용자 정보를 공유하지 않는 이유는 다음과 같습니다.
- CCPA나 GDPR과 같은 개인정보 보호 정책 준수
- 사용자 옵트아웃(개인정보 제 3자와의 공유 거부)
- 파트너사(애드 네트워크, 제 3자 기업)가 경쟁사이기도 한 경우
앱스플라이어는 일부 또는 모든 파트너와 데이터 공유를 중단하는 API 메서드를 다음과 같이 두 가지 제공합니다.
- setSharingFilter: 광고주가 이 메서드를 이용하여 일부(하나 혹은 복수) 애드 네트워크/연동 파트너를 데이터 공유 대상에서제외할 수 있습니다.
- setSharingFilterForAllPartners: 광고주가 모든 애드 네트워크/연동 파트너와 데이터 공유를 중단할 때 사용합니다.
이 필터링 메서드는 SDK V5.4.1.에서 지원됩니다.
이 필터링 메서드는 SDK가 구동을 시작할 때마다 호출되어야 하고 전체 세션에 영향을 미칩니다. 파트너와의 데이터 공유 필터를 설정해야할지 판단하는데 시간이 걸리면, SDK 구동 시작을 지연시키십시오.
이 메서드가 start 호출 이전에 활성화되면:
- SRN에서 유입된 사용자들이 오가닉으로 기록되고 사용자 정보는 연동 파트너와 공유되지 않습니다.
- 애드 네트워크(SRN 제외) 클릭으로 유입된 사용자 는 논오가닉으로 기록되지만 사용자 정보는 포스트백, API, 로데이터 리포트 혹은 다른 어떤 방법으로도 애드 네트워크와 공유되지 않습니다.
그런데 앱 삭제 데이터는 이 메서드를 이용하여 필터링할 수 없습니다. 대신, 앱스플라이어 대시보드 설정 화면에서 앱 삭제 이벤트를 파트너사에 전송하는 것을 중단할 수 있습니다.
getAppsFlyerUID
설명 |
AppsFlyer ID 확보하기 더 자세한 정보는 여기에서 볼 수 있습니다. |
Method signature |
|
사용법 예시 |
|
onAppOpenAttribution
설명 |
앱이 딥링크를 통해 열렸을 때 딥링크 정보를 가져옵니다. |
Method signature |
|
onAttributionFailure
설명 |
딥링크 정보를 가져올 때 발생하는 오류를 처리합니다. |
Method signature |
|
onConversionDataSuccess
설명 |
앱 설치 후 전환 데이터를 가져옵니다. 디퍼드 딥링킹에 활용하기에 유용합니다. 참고: SDK 버전 5 부터, |
Method signature |
|
onConversionDataFail
설명 |
앱 설치 후 전환 데이터를 가져 오지 못한 경우 오류를 처리합니다. |
Method signature |
|
onRequestFailure
설명 |
AppsFlyerRequestListener에 대한 콜백 메서드. SDK가 앱 시작을 보고하지 못하면 호출됩니다. |
Method signature |
|
사용법 예시 |
트래킹 요청 리스너 설정하기 항목을 참고하십시오. |
onRequestSuccess
설명 |
AppsFlyerRequestListener에 대한 콜백 메서드. SDK가 앱 시작을 성공적으로 보고하면 호출됩니다. |
Method signature |
|
사용법 예시 |
트래킹 요청 리스너 설정하기 항목을 참고하십시오. |
performOnAppAttribution
설명 |
이 함수를 이용하여 새 리어트리뷰션을 기록하지 않고 개발자가 직접 만든 링크 (URI or URL)로 onAppOpenAttribution을 다시 트리거할 수 있습니다. 이 메서드는 세션이 사용자의 화면 전경(foreground)에 있거나 열려있을 때 지정된 링크를 클릭시 특정 화면으로 넘어가도록 하거나 앱스플라이어 숏링크 한계를 극복하기 위해 사용할 수 있습니다. 일반적으로 onAppOpenAttribution 콜백은 앱이 딥링크로 열릴 때에만 호출되기 때문에 이 메서드가 필요할 수 있습니다. |
Method signature |
|
사용법 예시 |
|
logSession
설명 |
앱이 백그라운드에서 실행되는 유틸리티 앱 과 같은 경우에 세션을 보고합니다. |
Method signature |
|
사용법 예시 |
|
sendDeepLinkData (SDK V5.3.0 부터 더 이상 사용하지 않음)
설명 |
이 메서드는 사용자가 특정 액티비티로 딥링크 되더라고 어트리뷰션 데이터를 얻기 위해 사용되지 않습니다. 대신, start() 메서드가 호출되는 것을 확인하십시오. 더 자세한 정보는 여기에서 참조하십시오. |
Method signature |
|
사용법 예시 |
|
sendPushNotificationData
설명 |
푸시 알림 캠페인에서 데이터를 측정하고 가져올 수 있게 합니다. 자세한 내용은 푸시 알림 측정하기 가이드를 참조하십시오. |
Method signature |
|
사용법 예시 |
|
setAdditionalData
설명 |
외부 파트너 플랫폼으로 보낼 부가 정보를 추가합니다. |
Method signature |
|
사용법 예시 |
부가 정보 추가 설정 항목을 참고하십시오. |
setAndroidIdData
설명 |
앱스플라이어에 Android ID를 발송합니다. OAID, IMEI 및 Android ID 항목을 참조하십시오. |
Method signature |
|
사용법 예시 |
|
setAppInviteOneLink
설명 |
사용자 초대 캠페인를 위한 커스텀 어트리뷰션 링크용 원링크 템플릿 ID를 설정합니다. |
Method signature |
|
사용법 예시 |
친구 초대 어트리뷰션을 위한 원링크 설정하기 항목을 참조하십시오. |
setCollectAndroidID
설명 |
Android ID를 앱스플라이어로 보낼 것인지 여부를 나타냅니다. |
Method signature |
|
사용법 예시 |
OAID, IMEI 및 Android ID 항목을 참조하십시오. |
setCollectIMEI
설명 |
IMEI를 앱스플라이어로 보낼 것인지 여부를 나타냅니다. |
Method signature |
|
사용법 예시 |
OAID, IMEI 및 Android ID 항목을 참조하십시오. |
setCustomerIdAndLogSession
설명 |
고객 사용자 ID가 가능해지면 SDK를 시작합니다. 더 자세한 정보는 고객 ID를 위한 SDK 초기화 지연 부분을 참고하십시오. |
Method signature |
|
사용법 예시 |
|
setCustomerUserId
설명 |
고객 사용자 ID를 설정합니다. 자세한 정보는 고객 사용자 ID 설정하기 안내를 참고하십시오. |
Method signature |
|
사용법 예시 |
|
setDebugLog
설명 |
디버깅 로그를 동작시킵니다. 자세한 내용은 안드로이드 디버깅하기 안내를 참조하십시오. |
Method signature |
|
사용법 예시 |
|
anonymizeUser
설명 |
사용자의 설치, 이벤트 및 세션을 익명 처리 합니다. 자세한 정보는 사용자 데이터 익명처리 부분을 참고하십시오. |
Method signature |
|
사용법 예시 |
|
setLogLevel
설명 |
앱스플라이어 SDK 로그 레벨을 설정합니다. |
Method signature |
|
사용법 예시 |
|
setMinTimeBetweenSessions
설명 |
세션 간 최소 필요 시간을 설정합니다. 자세한 정보는 세션 간 최소 필요시간 설정하기를 참고하십시오. |
Method signature |
|
사용법 예시 |
|
setOaidData
설명 |
OAID를 앱스플라이어로 발송합니다. OAID, IMEI 및 Android ID 항목을 참조하십시오. |
Method signature |
|
사용법 예시 |
|
setOutOfStore
설명 |
앱이 다운로드 될, 구글 플레이 외 대체 앱스토어를 지정합니다. |
Method signature |
|
사용법 예시 |
|
setPreinstallAttribution
설명 |
사전 설치된 앱이 첫 실행될 때 사전 설치를 기록하도록 SDK를 설정합니다. |
Method signature |
|
사용법 예시 |
안드로이드 사전설치 캠페인 항목을 참조하십시오. |
setResolveDeepLinkURLs
설명 |
클릭 도메인에서 원링크를 분석합니다. 자세한 내용은 래핑된 딥링크 URL 분석하기 항목을 참고하십시오. |
Method signature |
|
사용법 예시 |
|
setSharingFilter
설명 |
광고주가 이 메서드를 이용하여 일부(하나 혹은 복수의) 애드 네트워크/연동 파트너를 데이터 공유 대상에서 제외되도록 설정할 수 있습니다. 더 알아보기 |
Method signature |
|
사용법 예시 |
|
setSharingFilterForAllPartners
설명 |
광고주가 모든 애드 네트워크/연동 파트너에게 데이터를 보내지 않도록 할 때 사용합니다. 더 알아보기 |
Method signature |
|
사용법 예시 |
|
start
설명 |
앱이 시작될 때 SDK를 구동시킵니다. 자세한 내용은 SDK 초기화 부분을 참조하십시오. |
Method signature |
|
사용법 예시 |
|
stop
설명 |
SDK의 모든 기능을 종료합니다. 자세한 내용은 사용자 개인 정보 - 옵트아웃 부분을 참고하십시오. |
Method signature |
|
사용법 예시 |
|
trackAppLaunch (SDK V5.2.0부터 더 이상 사용하지 않음)
설명 |
이 메서드는 더 이상 사용되지 않습니다. 대신 start을 사용하십시오. 두가지 기능을 합니다:
|
Method signature |
|
사용법 예시 |
|
logEvent
설명 |
앱스플라이어에 인앱 이벤트를 보냅니다. 자세한 내용은 핵심 API - 인앱 이벤트 기록하기 부분을 참조하십시오. |
Method signature |
|
사용법 예시 |
|
updateServerUninstallToken
설명 |
Firebase를 앱 삭제 측정 외 다른 목적으로도 사용하는 개발자들을 위한 것입니다. 더 자세한 내용은 앱 삭제 측정하기 를 참조하십시오. |
Method signature |
|
사용법 예시 |
|
waitForCustomerUserId
설명 |
사용자 ID가 설정될 때까지 SDK 초기화를 지연시킵니다. |
Method signature |
|
사용법 예시 |
|
사용 중단된 API
사용 중단된 API란 새로운 코드로 대체되는 메서드입니다. 개발자가 코드를 업그레이드 해야합니다.
지원 종료일은 메서드가 동작을 중단하거나 기능이 제한되는 시점입니다.
API 이름 | 사용 중단 시작 버전 | 운영 종료 일자 |
---|---|---|
sendDeepLinkData |
5.3.0 |
미정 |
trackAppLaunch |
5.2.0 |
미정 |
댓글
댓글을 남기려면 로그인하세요.