iOS 앱 삭제 추적 설정
iOS에서 앱 제거를 추적하여 사용자 리텐션을 측정하고, 저품질 트래픽 소스를 식별하며, Singular SDK와 Apple 푸시 알림 서비스(APN)를 연동하여 캠페인 성과를 최적화할 수 있습니다.
개요
앱 삭제 추적의 작동 방식
Singular는 Apple 푸시 알림 서비스를 통해 무음 푸시 알림을 전송하고 전송 응답을 모니터링하여 앱이 디바이스에 계속 설치되어 있는지 확인함으로써 iOS 앱 제거를 감지합니다.
기술적 프로세스:
- 토큰 등록: Singular SDK가 APN 디바이스 토큰을 Singular 서버에 등록합니다.
- 사용자 옵트인: 사용자가 iOS의 메시지가 표시되면 푸시 알림 권한을 부여합니다.
- 무음 알림: Singular는 등록된 디바이스에 주기적으로 무음 푸시 알림을 보냅니다.
- 배달 피드백: APN이 전송 성공 또는 실패를 보고합니다.
- 제거 감지: 배달 실패는 앱 제거를 나타냅니다.
- 이벤트 기록: 원래 인스톨 소스에 기인한 제거 이벤트
요구 사항
- SDK 버전: 앱 제거 추적을 위해 iOS SDK 8.0 이상 필요
- APN 인증서: Apple 개발자 계정의 프로덕션 SSL 인증서
- 푸시 알림 지원: 앱이 APN 등록 및 토큰 처리를 구현해야 합니다.
- 사용자 동의: 사용자가 트래킹을 위한 푸시 알림에 동의해야 작동합니다.
- 앱 업데이트: 사용자가 앱 삭제 추적이 활성화된 업데이트된 앱 버전을 설치해야 합니다.
중요 고려 사항
사용자 옵트인 요구 사항: Apple의 정책에 따라 사용자는 푸시 알림을 받으려면 명시적으로 옵트인해야 합니다. Singular는 알림 권한을 부여한 사용자에 대해서만 앱 제거를 추적할 수 있습니다.
핵심 사항
- 무음 알림: Singular의 앱 삭제 추적은 사용자에게 눈에 보이는 중요를 표시하지 않는 무음 푸시 알림을 사용합니다.
- 어트리뷰션 보존: 제거는 원래 어트리뷰션 링크를 제거하지 않고 이벤트로 추적됩니다. 사용자가 여러 번 제거하고 다시 설치할 수 있으므로 제거율이 100%를 초과할 수 있습니다.
- 일괄 처리: 제거 감지는 일괄 처리 기반이며, APN의 응답 피드백에 의존합니다. 제거 데이터가 Singular 대시보드에 표시되는 데 최대 24시간이 소요될 수 있습니다.
- 권한 종속성: 추적 범위는 푸시 알림 옵트인 비율과 직접적인 상관관계가 있습니다. 옵트인 비율이 낮은 앱은 불완전한 제거 데이터를 갖게 됩니다.
- 네트워크 종속성: 무음 푸시 알림을 사용하려면 네트워크 연결이 활성화되어 있어야 합니다. 장시간 오프라인 상태인 디바이스는 제거 감지가 지연될 수 있습니다.
설정 지침
Singular SDK를 연동하고, Apple 푸시 알림을 구현하고, APN 인증서를 Singular에 업로드하여 iOS 제거 추적을 구성합니다.
1단계: iOS SDK 8.x+ 연동하기
SDK 버전 업데이트
제거 추적 기능을 사용하려면 iOS SDK 8.0 이상으로 업그레이드하세요.
코코아팟 설치:
platform :ios, '12.0'
use_frameworks!
target 'YourApp' do
# Singular iOS SDK
pod 'Singular-SDK', '~> 12.6.2'
end
Swift 패키지 관리자:
// File > Add Package Dependencies
// Enter repository URL:
https://github.com/singular-labs/Singular-iOS-SDK
// Select version: 12.6.2 or later
전체 연동 가이드: iOS SDK 연동 가이드
2단계: Apple 푸시 알림 구성하기
푸시 알림 기능 활성화
Xcode 프로젝트에 푸시 알림 기능을 추가하고 앱에서 APN 등록을 구현하세요.
Xcode 구성:
- 프로젝트 설정을 엽니다: Xcode 탐색기에서 프로젝트를 선택합니다.
- 대상을 선택합니다: 대상 선택: 앱 대상 선택
- 기능 추가: 서명 및 기능 탭으로 이동합니다.
- 푸시 활성화: "+ 기능"을 클릭하고 "푸시 알림"을 추가합니다.
- 백그라운드 모드: 백그라운드 모드 기능에서 "원격 알림"을 사용 설정합니다.
처음 설정하기: iOS용 푸시 알림을 처음 구현하는 경우 포괄적인 Apple 푸시 알림 서비스(APN) 설정 가이드를 참조하세요.
APN 등록 구현하기
푸시 알림을 등록하는 코드를 추가하고 APNs 디바이스 토큰을 Singular SDK에 전달합니다.
import UIKit
import UserNotifications
import Singular
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Request push notification permissions
requestPushNotificationPermissions()
// Initialize Singular SDK
let config = SingularConfig(apiKey: "SDK KEY", secret: "YOUR_SECRET")
Singular.start(config)
return true
}
func requestPushNotificationPermissions() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if granted {
print("Push notification permission granted")
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
} else {
print("Push notification permission denied")
}
}
}
// Called when APNs successfully registers device
func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// Pass token to Singular for uninstall tracking
Singular.registerDeviceToken(forUninstall: deviceToken)
// Convert token to hex string for logging
let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print("APNs device token registered: \(tokenString)")
}
// Called if APNs registration fails
func application(_ application: UIApplication,
didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("Failed to register for remote notifications: \(error.localizedDescription)")
}
// Handle incoming push notifications
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// Pass notification data to Singular
Singular.handleNotification(userInfo)
completionHandler(.newData)
}
}
iOS 13+ 요구 사항: iOS 13부터는 인증을 받은 후 메인 스레드에서 registerForRemoteNotifications() 으로 호출해야 합니다. 위와 같이 DispatchQueue.main.async 을 사용하세요.
전체 구현 가이드: Singular iOS SDK 구현 가이드
3단계: Apple 푸시 알림 인증서 만들기
APNs SSL 인증서 생성
Apple 개발자 계정에서 프로덕션 SSL 인증서를 생성하여 Singular가 제거 추적을 위한 푸시 알림을 전송할 수 있도록 합니다.
- Apple 개발자 포털을 엽니다: Apple Developer로이동합니다.
- 인증서에 액세스합니다: 인증서, 식별자 및 프로필로 이동합니다.
- 식별자를 선택합니다: 왼쪽 사이드바에서 식별자를 클릭합니다.
- 앱 ID를 선택합니다: 목록에서 앱의 식별자를 선택합니다.
- 푸시 알림을 구성합니다: 애플리케이션 서비스로 스크롤하여 푸시 알림을 찾습니다.
- 인증서 만들기를 클릭합니다: 푸시 알림 옆의 "구성"을 클릭합니다.
- 유형을 선택합니다: 프로덕션 인증서에 대해 "Apple 푸시 알림 서비스 SSL(샌드박스 및 프로덕션)"을 선택합니다.
인증서 유형 요구 사항: Singular 제거 추적에는 라이브 앱용 프로덕션 SSL 인증서가필요합니다. 개발 인증서는 내부 테스트용으로만 사용할 수 있습니다.
CSR(인증서 서명 요청) 만들기
Mac에서 CSR을 생성하여 APNs 인증서를 만듭니다.
- 키체인 액세스를 엽니다: Mac에서 키체인 액세스 앱을 실행합니다.
- 인증서 요청: 키체인 액세스 메뉴 → 인증서 도우미 → 인증 기관에 인증서 요청하기
- 이메일을 입력합니다: 이메일 주소 입력: 이메일 주소를 입력합니다.
- 일반 이름: 설명이 포함된 이름을 입력합니다(예: "yourApp 푸시 알림").
- 디스크에 저장: 디스크에 저장: "디스크에 저장" 옵션을 선택합니다.
- 계속: 계속을 클릭하여 CSR 파일을 저장합니다.
CSR 업로드 및 인증서 다운로드
CSR을 Apple 개발자 포털에 업로드하여 APNs SSL 인증서를 생성합니다.
- CSR 업로드: Apple 개발자 포털에서 생성한 CSR 파일을 업로드합니다.
- 인증서 생성: 계속을 클릭하여 인증서를 생성합니다.
- 인증서 다운로드: 생성된 .cer 파일을 다운로드합니다.
- 인증서 설치:.cer 파일을 두 번 클릭하여 Mac 키체인에 추가합니다.
4단계: 인증서를 .p12 파일로 내보내기
키체인에서 P12 생성
키체인에서 APNs 인증서와 개인 키를 .p12 파일로 내보내 Singular에 업로드합니다.
- 키체인 액세스를 엽니다: 키체인 액세스 앱을 시작합니다.
- 인증서를 선택합니다: "내 인증서" 카테고리에서 APNs 인증서를 찾습니다.
- 인증서를 펼칩니다: 공개 삼각형을 클릭하여 인증서와 페어링된 개인 키를 표시합니다.
- 두 항목을 모두 선택합니다: Command 키를 누른 상태에서 인증서와 개인 키를 모두 클릭하여 선택합니다.
- 내보내기: 내보내기: 마우스 오른쪽 버튼을 클릭하고 "2개 항목 내보내기..."를 선택합니다.
- P12로 저장:.p12 형식을 선택하고 의미 있는 파일 이름(예: "YourApp_APNs_Production.p12")으로 저장합니다.
- 비밀번호 설정:.p12 파일을 보호할 비밀번호를 입력합니다(Singular에 업로드할 때 이 비밀번호가 필요합니다).
- 확인: 확인을 클릭하여 파일을 내보냅니다.
보안 참고:.p12 파일을 안전하게 보관하고 비밀번호를 기억하세요. Singular에 인증서를 업로드하려면 이 두 가지가 모두 필요합니다. 이러한 자격 증명을 공개적으로 공유하지 마세요.
5단계: Singular에 인증서 업로드
Singular 앱 설정 구성
.p12 인증서 파일을 Singular의 앱 구성에 업로드하여 제거 추적을 사용 설정합니다.
- Singular 앱을 엽니다: Singular 앱 페이지로이동합니다.
- 앱을 선택합니다: 앱 선택: 목록에서 iOS 앱을 선택합니다.
- 고급 설정으로 이동합니다: 고급 설정 섹션으로 스크롤합니다.
- 추적 제거를 클릭합니다: 추적 제거 구성을 찾습니다.
- 인증서를 업로드합니다: "파일 선택"을 클릭하고 .p12 파일을 선택합니다.
- 비밀번호 입력:.p12 파일을 내보낼 때 생성한 비밀번호를 입력합니다.
- 구성 저장: 저장을 클릭하여 설정을 적용합니다.
확인: 업로드 후 Singular에서 인증서의 유효성을 검사합니다. 유효성 검사에 실패하면 프로덕션 인증서를 사용하고 있고 비밀번호가 올바른지 확인하세요.
제거 추적 테스트
업데이트된 앱을 프로덕션에 릴리스하기 전에 제거 추적이 올바르게 구성되었는지 확인하세요.
테스트 절차
유효성 검사 단계
- 테스트 빌드를 설치합니다: 제거 추적이 활성화된 앱을 테스트 기기에 배포합니다.
- 권한 부여: 앱을 실행하고 메시지가 표시되면 푸시 알림 권한을 수락합니다.
- 등록 확인: Xcode 콘솔에서 APNs 디바이스 토큰 등록 메시지를 확인합니다.
- SDK 등록을 확인합니다: SDK 로그에 Singular에 토큰 등록이 성공했는지 확인합니다.
- 일괄 처리를 기다립니다: Singular가 첫 번째 무음 알림을 보낼 때까지 24-48시간 기다립니다.
- 앱을 제거합니다: 테스트 기기에서 앱 삭제
- 대시보드 모니터링: 24-48시간 후 Singular 대시보드에서 제거 이벤트를 확인합니다.
테스트 타임라인: 제거 추적은 배치 기반이며 제거를 감지하고 보고하는 데 최대 48시간이 걸릴 수 있습니다. 이 지연은 예상되는 동작입니다.
Xcode 콘솔 확인
Xcode 콘솔 출력에서 올바른 구성을 확인하는 Singular SDK 메시지를 확인합니다.
예상 로그 메시지:
[Singular] APNs device token registered successfully
[Singular] Uninstall tracking enabled
[Singular] Device token sent to Singular servers
일반적인 문제
| 문제 | 원인 | 해결 방법 |
|---|---|---|
| 푸시 권한 대화 상자가 나타나지 않음 | 권한이 이미 거부되었거나 요청되지 않음 | 권한을 재설정하세요: 설정 → 일반 → 이전 또는 재설정 iPhone → 재설정 → 위치 및 개인정보 재설정 |
| 디바이스 토큰이 생성되지 않음 | 푸시 알림 기능이 활성화되지 않음 | Xcode 서명 및 기능에서 푸시 알림이 활성화되어 있는지 확인하십시오. |
| 오류와 함께 등록 실패 | 누락되거나 잘못된 프로비저닝 프로필 | 프로비저닝 프로필에 푸시 알림 권한이 포함되어 있는지 확인 |
| 인증서 유효성 검사가 Singular에서 실패함 | 잘못된 인증서 유형 또는 만료된 인증서 | 프로덕션 SSL 인증서를 사용 중이고 만료되지 않았는지 확인합니다. |
| 토큰이 Singular에 도달하지 않음 | SDK가 초기화되지 않았거나 네트워크 연결 문제 | registerDeviceToken() 전에 Singular.start()가 호출되었는지 확인합니다. |
| 대시보드에 제거가 표시되지 않음 | 사용자가 푸시 권한을 부여하지 않음 | 제거 추적은 알림에 동의한 사용자에게만 작동합니다. |
시뮬레이터 제한 사항
물리적 장치가 필요합니다: iOS 시뮬레이터에서는 APN 디바이스 토큰 생성이 작동하지 않습니다. 실제 iOS 디바이스에서 앱 삭제 추적을 테스트해야 합니다.
푸시 알림 옵트인 비율 최적화하기
푸시 알림 권한을 부여하는 사용자의 비율을 개선하여 제거 추적 범위를 극대화하세요.
모범 사례
사전 권한 프롬프트
iOS 시스템 권한 대화 상자를 표시하기 전에 사용자 지정 인앱 설명을 표시하여 수락률을 높입니다.
- 가치 설명: 알림을 활성화하면 사용자가 얻을 수 있는 이점을 명확하게 전달하세요.
- 타이밍: 사용자가 가치를 이해할 수 있는 적절한 타이밍에 권한을 요청하세요.
- 사용자 지정 UI: 시스템 프롬프트 전에 '허용' 및 '지금 안 함' 버튼이 있는 사용자 지정 대화 상자 표시
- 재시도 로직: 사용자가 거부하면 나중에 앱 가치를 경험한 후 다시 프롬프트합니다.
구현 예시
class NotificationManager {
func showPrePermissionPrompt() {
// Check if permission already requested
UNUserNotificationCenter.current().getNotificationSettings { settings in
if settings.authorizationStatus == .notDetermined {
DispatchQueue.main.async {
self.displayCustomPrompt()
}
}
}
}
private func displayCustomPrompt() {
let alert = UIAlertController(
title: "Stay Updated",
message: "Enable notifications to receive important updates about your orders and exclusive offers.",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "Enable Notifications", style: .default) { _ in
self.requestSystemPermission()
})
alert.addAction(UIAlertAction(title: "Not Now", style: .cancel) { _ in
// User declined - mark for retry later
UserDefaults.standard.set(Date(), forKey: "last_notification_prompt")
})
// Present from root view controller
UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true)
}
private func requestSystemPermission() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if granted {
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
}
}
}
}
상황에 맞는 권한 요청
효과적인 타이밍 전략:
- 첫 번째 거래 이후: 사용자가 첫 구매 또는 의미 있는 행동을 완료한 후 요청합니다.
- 기능 소개: 알림 의존적 기능 도입 시 프롬프트
- 가치 시연: 사용자가 앱에서 가치를 경험한 후 요청
- 첫 실행을 피하세요: 사용자가 앱 가치를 이해하기 전에 앱을 처음 열 때 요청하지 않기
앱 삭제 데이터 분석
Singular 리포트에서 iOS 앱 삭제 데이터를 사용하여 캠페인 성과를 최적화하고 트래픽 품질 문제를 파악하세요.
사용 가능한 지표
앱 제거 추적 지표
- 제거 횟수: 앱 제거 횟수: 감지된 총 앱 제거 횟수
- 제거율: 제거율: 제거로 이어진 인스톨의 백분율
- 추적 가능한 사용자 비율: 푸시 알림을 수신하기로 선택한 사용자의 백분율
- 제거까지 걸린 일수: 설치와 제거 이벤트 사이의 평균 시간
- 소스별 제거 횟수: 캠페인, 퍼블리셔, 광고 소재별 앱 삭제 분석
- 코호트 분석: 다양한 사용자 코호트의 앱 제거 패턴
커버리지 고려 사항
추적 범위: iOS 앱 제거 추적은 푸시 알림 권한을 부여한 사용자만 대상으로 합니다. 앱의 알림 옵트인 비율을 모니터링하여 앱 제거 추적 범위 비율을 파악하세요.
범위 계산:
Tracking Coverage % = (Users with Push Enabled / Total Installs) × 100
사용 사례
캠페인 최적화:
- 제거율이 높은 저품질 트래픽을 유도하는 캠페인 식별
- 다양한 트래픽 소스에서 앱 제거율 비교
- 예상 사용자 리텐션에 기반한 입찰 전략 최적화
- 양질의 사용자를 유치하기 위한 크리에이티브 메시지 조정
사기 탐지:
- 인스톨 사기를 나타내는 비정상적인 제거 패턴 탐지
- 제거율이 의심스럽게 높은 퍼블리셔 플래그 지정
- 봇 트래픽의 징후가 있는지 제거까지 걸리는 시간 모니터링
- 신속한 제거를 통해 클릭 인젝션 패턴 식별
사용자 리텐션 분석:
- 시간 경과에 따른 앱 고착화 및 참여도 추적
- 앱 업데이트 또는 기능 릴리스와 앱 제거의 상관관계 파악
- 사용자 이탈에 기여하는 요인 파악
- 사용자 인구 통계 및 행동에 따른 앱 삭제율 세분화
모범 사례
최적화 전략
- 벤치마크 설정: 다양한 캠페인 유형에 대해 허용 가능한 이탈률 임계값을 설정합니다.
- 트렌드 모니터링: 시간 경과에 따른 제거율을 추적하여 계절별 패턴이나 이상 징후를 파악하세요.
- 세그먼트 분석: 사용자 인구 통계, 지역 및 디바이스별로 앱 제거율을 비교합니다.
- 어트리뷰션 윈도우: 캠페인 성과를 평가할 때 제거 타이밍을 고려하세요.
- 품질 점수: 트래픽 품질 점수 모델에 앱 제거율을 연동하세요.
- 도달 범위 추적: 알림 옵트인 비율을 모니터링하여 데이터 완전성 파악
- 비교 분석: 플랫폼별 인사이트를 위해 iOS와 안드로이드의 앱 삭제 패턴을 비교하세요.