콘텐츠로 이동

iOS App Tracking Transparency Guide

ios에서 Google admob 광고 송출한다면 필요 작업

머리말

모바일 앱 시장이 성장함에 따라 사용자 데이터의 보호와 프라이버시가 점점 더 중요해지고 있습니다. 이에 따라 Apple은 iOS 14.5부터 App Tracking Transparency(이하 ATT 라 칭함) 프레임워크를 도입하여, 앱이 사용자의 동의 없이 광고 목적으로 데이터를 추적하는 것을 엄격히 제한하고 있습니다.
ATT는 앱 개발자와 마케터에게 새로운 도전과 기회를 동시에 제공하며, 사용자에게는 자신의 개인정보를 직접 관리할 수 있는 권한을 부여합니다.

이 가이드는 iOS 앱 개발자와 서비스 운영자를 위해 ATT의 기본 개념부터 구현 방법, 실무 적용 시 유의사항까지 단계별로 설명합니다. ATT의 도입 배경과 목적을 이해하고, 올바른 구현을 통해 사용자 신뢰를 높이며, 앱의 지속적인 성장을 도모할 수 있도록 도움을 드리고자 합니다.


마지막 업데이트: 2025-06-07
작성자: Heesung Jin (kage2k)


1. Xcode localizations 설정

Image

Image

반복하여, 대표적인 언어 3가지(en,ja,ko)를 추가합니다.

2. 각 언어별 파일 만들기

VSCODE(사용하는 ide)에서 ios/Runner/ 폴더 내에 다음과 같은 구조 생성:

1
2
3
4
5
ios/Runner/
├── en.lproj/InfoPlist.strings
├── ko.lproj/InfoPlist.strings
├── ja.lproj/InfoPlist.strings
├── Info.plist                # 작업시 주의해야할 파일

각 폴더는 해당 언어에 맞는 번역을 제공하는 역할입니다.

Info.plist에는 1개만 작성

Info.plist 파일은 민감한 파일입니다. 필요 이외에 작업은 하지면 안됩니다.

1
2
3
4
**~~생략**
<key>NSUserTrackingUsageDescription</key>
<string>This app uses your data to deliver personalized ads.</string>
**~~생략**

🇺🇸 영어 (en.lproj/InfoPlist.strings)

"NSUserTrackingUsageDescription" = "This app requires permission to track your activity for personalized ads and app usage analytics.";

🇯🇵 일본어 (ja.lproj/InfoPlist.strings)

"NSUserTrackingUsageDescription" = "このアプリでは、パーソナライズされた広告とアプリの利用状況分析のために、ユーザーのアクティビティを追跡する許可が必要です。";

🇰🇷 한국어 (ko.lproj/InfoPlist.strings)

"NSUserTrackingUsageDescription" = "이 앱은 맞춤형 광고 및 앱 사용 분석을 위해 사용자의 활동을 추적할 수 있는 권한이 필요합니다.";

핵심 결론부터

Info.plistNSUserTrackingUsageDescription 키를 여러 개 만들면 안 됩니다.
Info.plist에는 단 _하나의 키_만 설정하고, 나머지 언어는 **Localization(.strings 파일)**을 통해 처리합니다.


왜 하나만 써야 하나요?

iOS에서는 Info.plist 안의 키-값 쌍이 기본 언어(예: 영어) 기준으로만 존재하며, 다른 언어는 각자의 .lproj 디렉토리에 있는 InfoPlist.strings 파일로 분리된 현지화 처리를 합니다.


요약 정리

항목 설명
Info.plist 기본 메시지 1개만 작성
다국어 처리 각 언어에 대해 InfoPlist.strings 파일 생성
위치 ios/Runner/{언어코드}.lproj/InfoPlist.strings
키 이름 항상 "NSUserTrackingUsageDescription"로 동일

Podfile

필자는아래와 같이 추가 사용합니다. # ATT관련 광고 추척 권한 설정

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)

    target.build_configurations.each do |config|
      # 기본 설정
      config.build_settings['ENABLE_BITCODE'] = 'NO'
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'

      # 시뮬레이터 ARM64 제외 (Intel Mac 호환성)
      config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'

      # ATT관련 광고 추적 권한 설정 (Google Mobile Ads용)
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',
        'PERMISSION_APP_TRACKING_TRANSPARENCY=1',
      ]
    end
  end
end


App Tracking Transparency(ATT) 관련 리젝 이슈의 핵심은 다음과 같습니다:

항목 리젝 가능성 이유
NSUserTrackingUsageDescription 누락 100% 리젝됨 필수 권한 설명이 없기 때문
설명이 부적절하거나 모호함 ⚠ 리젝 가능 "We need this for ads" 같은 애매한 설명
일부 언어 번역이 없음 ❌ 리젝되지 않음 시스템이 기본 언어 메시지를 대신 보여줌
문맥과 다른 현지화 메시지 ⚠ 가능성 있음 예: 영어는 광고 목적, 일본어는 보안 목적 → 불일치 시 지적 가능

미제공 시에도 시스템은 영어(기본 메시지)로 처리하며 리젝되지 않습니다.


같이 봐야하는 글


Github Flutter project 예시

project 머리말

ATT 를 module(모듈)화 해서 쉽게 적용하고자 만들었습니다.

적용팩키지

  app_tracking_transparency: ^2.0.6+1
  flutter_riverpod: ^2.6.1

Github 링크

iOS App Tracking Transparency Project - iOS App Tracking Transparency Project

설명

android 는 att 필요없으니 root page로 이동 ios 필요하므로 4개의 단계에 거쳐서 확인을 받음, 앱 심사에서 유용함.

Image Image
Image Image

Admob 모튤 추가

기존 ATT에 admob 추가 하였습니다.

적용팩키지

  google_mobile_ads: ^6.0.0

android / ios 필수 추가 사항

android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 필수 권한 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
     <!--20.4.0 이하는 admob 사용시 선언 필수-->
    <uses-permission android:name="com.google.android.gms.permission.AD_ID" />

생략

        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-3940256099942544~3347511713"/>
    </application>

ios/Runner/Info.plist

    <!-- 📈 Google AdMob 설정 -->
    <key>GADApplicationIdentifier</key>
    <string>ca-app-pub-5673747993774414~2343851447</string>
    <key>NSAdvertisingAttributionReportEndpoint</key>
    <string>https://adservice.google.com</string>

    <!-- 🎯 SKAdNetwork 식별자 -->
    <key>SKAdNetworkItems</key>
    <array>
        <dict>
            <key>SKAdNetworkIdentifier</key>
            <string>cstr6suwn9.skadnetwork</string>
        </dict>
    </array>

admob 사용방법

활용방법은 아래 내용으로 하시고 대부분은 아래 하단에 위치 시킵니다.

1
2
3
bottomNavigationBar: SafeArea(
        child: AdMobBannerWidget(),
      ),
// 정상 작동하는 코드들:

// 1. 배너 광고
AdMobBannerWidget() // ✅ 작동

// 2. 카운터 표시
AdMobCounterWidget(isVertical: true) // ✅ 작동

// 3. 액션 버튼
AdMobActionButtonWidget(
  text: 'Study 완료',
  contextType: AdMobContextType.study,
) // ✅ 작동

// 4. 리셋 버튼
AdMobResetButtonWidget() // ✅ 작동

Github 링크

iOS App Tracking Transparency Project - iOS App Tracking Transparency Project

Debug console sample

광고는 시뮬레이터에서는 작동을 안합니다(경우에따라 되지만), 실제 디바이스에서 테스트 하세요. github에서 최신 package를 확인하세요.

flutter: 🚀 Root 페이지로 이동 시도
flutter: ✅ Root 페이지 이동 명령 완료
flutter: 🎮 AdMob 테스트 버튼 클릭됨
flutter: 🚀 AdMob 테스트 화면으로 이동 시도
flutter: 🛡️ 안전한 AdMob 테스트 화면 로딩 중
flutter: 🔧 AdMob 초기화 확인 중...
flutter: 📱 AdMob 초기화 상태 확인 중...
2
flutter: 🔍 실기기/시뮬레이터 정확한 체크 시작...
flutter: 🍎 iOS 기기 정보:
flutter: - 모델: iPhone
flutter: - 기기명: iPhone
flutter: - 시스템명: iOS
flutter: - 시스템 버전: 18.5
flutter: - 실기기 여부: true
flutter: - 결과: iOS 실제 기기
flutter: 🔧 실제 기기용 설정 적용 중...
flutter: 🍎 iOS 기기 정보:
flutter: - 모델: iPhone
flutter: - 기기명: iPhone
flutter: - 시스템명: iOS
flutter: - 시스템 버전: 18.5
flutter: - 실기기 여부: true
flutter: - 결과: iOS 실제 기기
flutter: 🔧 실제 기기용 설정 적용 중...
flutter: ✅ AdMob 초기화 완료
flutter: ✅ 실제 기기용 설정 완료
flutter: 🎯 배너 광고 로딩 시작 (실제 기기)
flutter:    - 광고 ID: ca-app-pub-3940256099942544/2934735716
flutter:    - 환경: test
flutter: ✅ 실제 기기용 설정 완료
flutter: 🎯 전면 광고 로딩 시작 (실제 기기)
flutter:    - 광고 ID: ca-app-pub-3940256099942544/4411468910
flutter:    - 환경: test
2
flutter: 🔧 실제 기기용 광고 요청 생성
flutter: ✅ 배너 광고 로딩 성공! (실제 기기)
flutter: ✅ 배너 광고 로딩 성공
flutter: ✅ 전면 광고 로딩 성공! (실제 기기)
flutter: ✅ 전면 광고 로딩 성공