iOS 프라이버시 대응 (ATT & SKAN)
ATT 프롬프트 허용률을 끌어올리고, SKAdNetwork 4.0 Conversion Value 스키마를 비즈니스 KPI에 맞춰 설계한다. ATT 허용률 0.1pp 차이가 iOS CPI 5~10% 영향으로 직결된다.
ATT(App Tracking Transparency)는 IDFA 사용 동의를 묻는 시스템 프롬프트이며, 미허용 시 어트리뷰션이 SKAdNetwork(SKAN) 단일 채널로 강제 다운그레이드된다. SKAN 4.0은 3개 시점(0~2일/3~7일/8~35일)에 Coarse(low/medium/high) + Fine(0~63) 값을 전송한다. 본 가이드는 (1) ATT 프롬프트 최적화, (2) SKAN CV 스키마 설계, (3) Adjust 매핑 셋업을 다룬다.
§1ATT 프롬프트 설계
업계 평균 ATT 허용률: 게임 ~28%, 커머스 ~35%, 핀테크 ~42% (2025 기준). 허용률 끌어올리는 3가지 레버:
- Pre-prompt(설명 다이얼로그) 삽입 — 시스템 프롬프트 호출 직전 자체 디자인 화면에서 "왜 동의가 필요한지"를 카피로 설명. 거부 의도가 있는 사용자는 Pre-prompt에서 걸러 시스템 프롬프트 거부율을 낮춤.
- 호출 시점 지연 — 첫 실행 즉시가 아니라 가치 인지 후(온보딩 완료 직후, 첫 구매 전, 푸시 동의 직후 등) 호출. 30~60초 지연 권장.
- NSUserTrackingUsageDescription 카피 — Info.plist의 ATT 설명 문구. "개인 맞춤 광고" 대신 "더 적합한 콘텐츠 추천" 등 사용자 효익 중심 카피.
import AppTrackingTransparency
import AdjustSdk
func showATTFlow(from vc: UIViewController) {
class="c">// 1. 가치 인지 시점 체크 (예: 온보딩 완료)
guard OnboardingState.shared.isCompleted else { return }
class="c">// 2. Pre-prompt 표시
let pre = PrePromptViewController(
title: "개인화된 콘텐츠 추천을 위한 동의",
body: "다음 화면에서 039;허용039;을 선택하시면 더 관심에 맞는 콘텐츠를 추천드릴 수 있습니다.",
primaryAction: "계속",
secondaryAction: "지금은 건너뛰기"
)
pre.onPrimary = { requestSystemATT() }
pre.onSecondary = { /* 7일 후 재시도 큐잉 */ }
vc.present(pre, animated: true)
}
func requestSystemATT() {
ATTrackingManager.requestTrackingAuthorization { status in
class="c">// Adjust SDK는 결과를 자동 수신
Analytics.track("att_response", [
"status": status.rawValue,
"is_authorized": status == .authorized
])
}
}
{
"NSUserTrackingUsageDescription": "더 관심에 맞는 콘텐츠와 혜택을 추천드리기 위해 활동 데이터를 사용합니다."
}
§2SKAdNetwork 4.0 스키마
SKAN 4.0의 핵심 변경점:
- 3-postback 윈도우: 설치 후 0~2일 / 3~7일 / 8~35일에 각각 1개씩 postback 발화
- Coarse Conversion Value:
low/medium/high3단계 — 트래픽이 적은 캠페인도 신호 수집 가능 - Fine Conversion Value: 0~63 (6bit) — 충분한 트래픽이 있는 캠페인만 허용
- Hierarchical Source ID: 캠페인/광고그룹/소재 단위 시그널 가능 (이전 2-digit → 4-digit)
§3Conversion Value 매핑 (커머스 앱 예시)
매출 누적액 + 핵심 이벤트 발생 여부의 조합으로 64개 슬롯에 매핑한다. 0~2일차에 Fine 64단계, 3~7일차와 8~35일차에 Coarse 3단계만 활용 가능.
| Fine CV | 조건 | Coarse | 비즈니스 의미 |
|---|---|---|---|
| 0 | install only | low | 설치만 |
| 1 | session_start ≥ 2 | low | 재방문 |
| 5 | add_to_cart 1회 | low | 관여 시작 |
| 10 | add_to_cart ≥ 2 OR begin_checkout | medium | 고관여 |
| 20 | purchase 1회 · revenue < $5 | medium | 저액 구매 |
| 30 | purchase 1회 · revenue $5~$20 | medium | 중간 구매 |
| 45 | purchase 1회 · revenue $20~$50 | high | 고액 구매 |
| 55 | purchase ≥ 2 OR revenue ≥ $50 | high | 충성 구매 |
| 63 | subscribe (월 구독) | high | 구독 전환 |
§4Adjust SKAN 셋업
- Adjust 대시보드 → App Setup → SKAdNetwork →
Enable SKAN 4.0 - Conversion Value Schema: Revenue + Events 조합 모드 선택
- 이벤트별 Coarse Tier 매핑 (위 표 §3 기준)
- 매체별 SKAN 채널 활성화: Meta/Google/TikTok/AppLovin 별도 토글
- Apple Console에서 Test Mode로 postback 발화 검증 (xcrun simctl)
class SKANDelegateHandler: NSObject, AdjustDelegate {
static let shared = SKANDelegateHandler()
func adjustConversionValueUpdated(_ conversionValue: NSNumber?) {
class="c">// Adjust가 자동으로 conversion value 계산 후 호출
guard let cv = conversionValue?.intValue else { return }
Analytics.track("skan_cv_updated", [
"fine_value": cv,
"coarse_tier": cv < 10 ? "low" : cv < 45 ? "medium" : "high"
])
}
}
§5트러블슈팅
1) NSUserTrackingUsageDescription Info.plist 누락. 2) iOS 14.5 미만 디바이스. 3) 이미 응답한 사용자(설정 → 개인정보 보호 → 추적에서 초기화 후 재테스트). 4) Adjust SDK 초기화가 ATT 호출 이전에 완료되어야 함.
1) Apple Console의 SKAdNetwork Identifier(.skadnetworkidentifier)가 Info.plist에 등록되었는지 확인 — 매체별 식별자가 모두 들어가야 함 (보통 30~50개). 2) Adjust는 자동으로 매체사 redirect를 처리하지만, 매체사가 SKAN 채널을 별도 활성화해야 함. 3) postback 지연 정상 범위: 0~24시간.
CV 매핑이 너무 빡빡하게 설정된 경우. 매출 임계값을 낮추거나, 이벤트만으로도 CV가 올라가도록 mid-tier 슬롯을 확장. Apple Privacy Threshold(25 install/일) 미달 캠페인은 CV가 NULL로 마스킹되므로 작은 캠페인은 합쳐서 운영.