앱 삭제 트래킹
Firebase Cloud Messaging (FCM)을 Singular SDK와 연동하여 앱 삭제를 트래킹함으로써 사용자 리텐션을 측정하고 리인게이지먼트 캠페인을 최적화하세요.
중요: Google은 2018년 4월에 GCM API를 지원 중단했습니다. 모든 앱 삭제 트래킹 구현에는 Firebase Cloud Messaging (FCM)을 사용하세요.
사전 요구사항
Singular 플랫폼 구성
앱에서 앱 삭제 트래킹을 구현하기 전에 Singular 플랫폼에서 앱을 구성하고 Android 앱 삭제 트래킹 설정 에 설명된 Android SDK + FCM 연동 단계를 완료하세요.
시스템 요구사항
앱 삭제 트래킹에는 Firebase Cloud Messaging과 특정 기기 구성이 필요합니다.
FCM 요구사항 ( 출처 ):
- Android 버전: 기기는 Android 4.1 (API 16) 이상에서 실행되어야 합니다
- Google Play 서비스: 기기에 Google Play Store 앱이 설치되어 있어야 합니다
- 에뮬레이터 지원: Google API가 포함된 Android 4.1+ 에뮬레이터가 지원됩니다
- 배포: Google Play Store 외부에서 배포되는 앱도 앱 삭제 트래킹을 지원할 수 있습니다
참고: 지원되지 않는 Android 버전이나 Google Play 서비스가 없는 기기의 사용자는 앱 삭제 트래킹 대상에서 제외됩니다.
구현 단계
1단계: Firebase Cloud Messaging 연동
아직 구성되지 않은 경우 앱에 Firebase Cloud Messaging을 설정하세요.
Google의 공식 가이드인 Android에서 Firebase Cloud Messaging 클라이언트 앱 설정 을 따르세요. 여기에는 다음이 포함됩니다:
- Android 프로젝트에 Firebase 추가
-
FCM SDK 종속성을
app/build.gradle에 추가 - Firebase Messaging Service 클래스 생성
- 알림 권한 요청 (Android 13+)
2단계: AndroidManifest.xml FCM 설정 확인
FCM 서비스 및 권한 확인
앱이 이미 Firebase Cloud Messaging과 연동되어 있고, Android 매니페스트가 FCM 메시지를 수신하기 위한 FirebaseMessagingService를 선언하고 있는지 확인하세요.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.your.package">
<!-- FCM Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application>
<!-- App Firebase Messaging Service -->
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>
중요:
.MyFirebaseMessagingService
를
FirebaseMessagingService
를 확장하는 클래스의 정규화된 이름으로 바꾸세요. 앱에서
com.google.firebase.MESSAGING_EVENT
인텐트를 처리하는 서비스는 하나만 있어야 합니다.
3단계: FCM 디바이스 토큰 등록
FCM 디바이스 토큰을 가져와 앱 삭제 트래킹을 위해 Singular로 전송하세요.
토큰 가져오기 및 설정
FCM 토큰을 가져오고 SDK 초기화 직후 Singular에 등록하세요.
import com.google.firebase.messaging.FirebaseMessaging
import com.singular.sdk.Singular
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Initialize Singular SDK
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
Singular.init(applicationContext, config)
// Retrieve and register FCM token
FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w("FCM", "Fetching FCM token failed", task.exception)
return@addOnCompleteListener
}
// Get FCM token
val token = task.result
// Register token with Singular
Singular.setFCMDeviceToken(token)
Log.d("FCM", "FCM token registered with Singular: $token")
}
}
}
import com.google.firebase.messaging.FirebaseMessaging;
import com.singular.sdk.Singular;
import com.singular.sdk.SingularConfig;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize Singular SDK
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET");
Singular.init(getApplicationContext(), config);
// Retrieve and register FCM token
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w("FCM", "Fetching FCM token failed", task.getException());
return;
}
// Get FCM token
String token = task.getResult();
// Register token with Singular
Singular.setFCMDeviceToken(token);
Log.d("FCM", "FCM token registered with Singular: " + token);
}
});
}
}
모범 사례:
첫 앱 세션부터 앱 삭제 트래킹이 활성화되도록
Singular.init()
직후 FCM 토큰을 등록하세요.
Singular.setFCMDeviceToken()
은
Singular.init()
이 완료되기 전에 호출되거나 토큰 인수가
null
또는 빈 값일 경우 자동으로 무시됩니다. 토큰 등록이 작동하지 않는 것처럼
보이면 SDK가 먼저 초기화되었는지, Firebase에서 반환된 FCM 토큰이
비어 있지 않은 문자열인지 확인하세요.
토큰 갱신 처리
정확한 앱 삭제 트래킹을 유지하기 위해 FCM 토큰이 갱신될 때마다 Singular에 업데이트하세요.
import com.google.firebase.messaging.FirebaseMessagingService
import com.singular.sdk.Singular
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
super.onNewToken(token)
// Send updated token to Singular
Singular.setFCMDeviceToken(token)
Log.d("FCM", "New FCM token registered: $token")
// Also send token to your server if needed
sendTokenToServer(token)
}
private fun sendTokenToServer(token: String) {
// Implement your server communication logic here
}
}
import com.google.firebase.messaging.FirebaseMessagingService;
import com.singular.sdk.Singular;
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(@NonNull String token) {
super.onNewToken(token);
// Send updated token to Singular
Singular.setFCMDeviceToken(token);
Log.d("FCM", "New FCM token registered: " + token);
// Also send token to your server if needed
sendTokenToServer(token);
}
private void sendTokenToServer(String token) {
// Implement your server communication logic here
}
}
중요:
FCM 토큰은 언제든지 갱신될 수 있습니다(앱 업데이트,
기기 복원 등). Singular를 최신 상태로 유지하려면 항상
onNewToken()
을 구현하세요.
대체 구성 방법
초기화 중 토큰 설정
SDK 초기화 전에 FCM 토큰을 사용할 수 있는 경우
SingularConfig
객체에서 구성하세요.
// Get token synchronously (if cached)
val cachedToken = getStoredFCMToken() // Your caching logic
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withFCMDeviceToken(cachedToken)
Singular.init(applicationContext, config)
// Get token synchronously (if cached)
String cachedToken = getStoredFCMToken(); // Your caching logic
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withFCMDeviceToken(cachedToken);
Singular.init(getApplicationContext(), config);
메서드 시그니처:
public SingularConfig withFCMDeviceToken(String fcmDeviceToken);
withFCMDeviceToken
은 초기화 시점에 보유한 토큰으로 SDK를 시드할 뿐입니다. 토큰 갱신을
구독하지는 않습니다. Singular의 기록을 최신 상태로 유지하려면 여전히
FirebaseMessagingService.onNewToken
을 구현하고 거기에서
Singular.setFCMDeviceToken(newToken)
을 호출해야 합니다. 이 구성 메서드 또한 제공된 토큰이
null
이거나 비어 있는 경우 자동으로 무시됩니다.
검증 및 문제 해결
구현 검증
앱 삭제 트래킹이 올바르게 작동하는지 확인하세요.
- 로그 확인: FCM 토큰 등록이 로그에 나타나는지 확인
- 토큰 생성 테스트: 첫 앱 실행 시 토큰이 생성되는지 확인
- 대시보드 모니터링: 24~48시간 후 Singular 대시보드에서 앱 삭제 트래킹 데이터 확인
- 토큰 갱신 테스트: 앱 데이터를 삭제하고 토큰이 올바르게 업데이트되는지 확인
일반적인 문제
- 토큰이 생성되지 않음: FCM 종속성이 올바르게 추가되었고 프로젝트에 Firebase가 구성되어 있는지 확인
-
토큰이 업데이트되지 않음:
onNewToken()콜백이 FirebaseMessagingService에 구현되어 있는지 확인 - 데이터 누락: 기기가 FCM 요구사항(Android 4.1+, Google Play 서비스 설치)을 충족하는지 확인
- 구성 오류: Singular 플랫폼 설정에서 앱 삭제 트래킹이 활성화되어 있는지 확인
추가 자료: 자세한 문제 해결은 앱 삭제 트래킹 설정 가이드 와 Firebase Cloud Messaging 문서 를 참조하세요.