← 모든 글

프라이버시 매니페스트 심층 분석: 무엇이 데이터 수집으로 간주되는가

2024년 5월 1일부터 App Store Connect에 업로드되는 모든 앱과 서드파티 SDK은 “필수 사유 API”의 사용, 추적 동작, 수집 데이터 유형을 선언하는 프라이버시 매니페스트를 갖춰야 합니다1. 매니페스트는 프로퍼티 리스트(PrivacyInfo.xcprivacy)로, App Store가 제출 시점에 수집하여 알려진 프라이버시 민감 API의 표면과 대조해 검증하고, 사용자에게 노출되는 프라이버시 영양 표시 라벨에 반영합니다. 매니페스트를 누락하거나, 승인된 사유를 선언하지 않은 채 프라이버시 민감 API을 사용하는 앱은 제출 시 ITMS-91053 또는 관련 코드로 거부됩니다2.

대부분의 팀은 매니페스트를 일회성 컴플라이언스 작업으로 취급합니다. 한번 작성하고 출시하고는 다시는 들여다보지 않습니다. 매니페스트는 그 이상입니다. 매니페스트는 앱이 비공개 데이터를 가지고 무엇을 하는지 명문화한, 앱과 Apple 사이의 구조화된 계약이며, 이 계약이 기계가 읽을 수 있는 형태로 존재하는 유일한 곳입니다. 이를 꼼꼼히 읽어보면 Apple이 프라이버시 민감으로 간주하는 것이 무엇인지(표면적은 대부분의 개발자가 예상하는 것보다 넓습니다), 사용자가 영양 표시 라벨에서 실제로 보는 것이 무엇인지(대부분의 팀이 인식하는 것보다 세분화되어 있습니다), 서드파티 SDK이 공개해야 하는 것이 무엇인지(예의가 아니라 실제 의무입니다)가 드러납니다.

TL;DR

  • 프라이버시 매니페스트는 4개의 최상위 섹션을 갖습니다. NSPrivacyTracking, NSPrivacyTrackingDomains, NSPrivacyCollectedDataTypes, NSPrivacyAccessedAPITypes입니다3.
  • 필수 사유 API 목록은 5개의 초기 카테고리를 다룹니다. 파일 타임스탬프, 시스템 부팅 시간, 디스크 공간, 활성 키보드, User Defaults입니다. 각 카테고리에는 승인된 사유 코드의 닫힌 목록이 있으며, 앱은 그중 하나를 선택하거나 해당 API을 피하도록 다시 작성해야 합니다4.
  • 추적은 좁게 정의됩니다. 광고를 위해 또는 데이터 브로커와 공유하기 위해 사용자 데이터를 다른 회사의 데이터와 연결하는 것입니다. NSPrivacyTrackingtrue이면, 추적에 사용되는 모든 도메인이 NSPrivacyTrackingDomains에 나타나야 합니다3.
  • 서드파티 SDK은 자체 매니페스트를 함께 제공해야 합니다. 앱의 매니페스트는 제출 시점에 링크된 모든 SDK의 매니페스트와 병합됩니다. Apple이 게시한 목록에 있는 SDK의 매니페스트가 누락되면 앱이 차단됩니다5.
  • 가장 큰 함정은 UserDefaults 접근이 항상 필수 사유 API 호출로 간주된다는 점입니다. 표준적인 UserDefaults.standard.set(...) 호출에도 선언된 사유 코드가 필요합니다.

4개의 섹션

완전한 PrivacyInfo.xcprivacy 파일은 4개의 최상위 키를 갖습니다3. 구조는 프로퍼티 리스트이며, 원시 형태에서는 XML로 편집하거나 Xcode의 프라이버시 매니페스트 편집기를 통해 편집합니다.

NSPrivacyTracking (Boolean)

앱 또는 SDK이 다른 회사의 앱과 웹사이트 전반에 걸쳐 사용자를 추적하는지 여부를 선언합니다. 이 의미론적 정의는 App Tracking Transparency와 일치합니다. 즉, 타겟 광고를 위한 목적, 타겟 광고 전달, 또는 데이터 브로커와의 사용자 데이터 공유를 위해 사용자 데이터를 다른 회사의 데이터와 연결하는 것입니다6.

NSPrivacyTrackingtrue이면, 추적에 사용되는 모든 도메인이 NSPrivacyTrackingDomains 목록에 나타나야 합니다. false이면 목록은 생략되거나 비어 있게 됩니다.

좁은 정의가 중요합니다. 광고를 표시하는 많은 앱(Apple 자체 SKAdNetwork 또는 비추적 광고 SDK을 통해)이 NSPrivacyTrackingfalse로 선언할 수 있습니다. 추적은 외부 데이터와의 연결이지, 광고를 보여주는 것 자체가 아닙니다.

NSPrivacyTrackingDomains (문자열 배열)

앱 또는 SDK이 추적 목적으로 접속하는 도메인 목록입니다. NSPrivacyTrackingtrue로 선언하는 앱은 모든 추적 엔드포인트를 여기에 열거해야 합니다.

이 목록은 App Privacy Report를 통해 런타임에 적용됩니다. 앱이 추적으로 표시되었지만 선언되지 않은 도메인에 접속하면, App Privacy Report가 사용자에게 그 불일치를 노출합니다. 반복적인 위반은 App Store에서 제거될 위험이 있습니다.

NSPrivacyCollectedDataTypes (딕셔너리 배열)

App Store 프라이버시 영양 표시 라벨에 입력되는 구조화된 데이터 수집 선언입니다3. 각 항목은 앱이 수집하는 하나의 데이터 유형을 다음 하위 키와 함께 기술합니다.

  • NSPrivacyCollectedDataType: Apple의 닫힌 목록에서의 데이터 유형(예: NSPrivacyCollectedDataTypeName, NSPrivacyCollectedDataTypeEmailAddress, NSPrivacyCollectedDataTypeCrashData).
  • NSPrivacyCollectedDataTypeLinked: Boolean. 데이터가 사용자의 신원에 연결되는지 여부.
  • NSPrivacyCollectedDataTypeTracking: Boolean. 데이터가 추적에 사용되는지 여부.
  • NSPrivacyCollectedDataTypePurposes: 배열. 데이터를 수집하는 목적(분석, 앱 기능, 광고 등).

이 섹션은 프라이버시 영양 표시 라벨의 단일 진실 공급원입니다. 영양 표시 라벨의 “사용자를 추적하는 데 사용되는 데이터” 및 “사용자에게 연결된 데이터” 카테고리는 이러한 플래그로부터 계산됩니다. 부정확한 선언은 부정확한 영양 표시 라벨을 만들고, App Store 집행 조치의 위험을 초래합니다.

NSPrivacyAccessedAPITypes (딕셔너리 배열)

필수 사유 API 선언입니다. 각 항목은 하나의 필수 사유 API 카테고리와 승인된 사유 코드 집합을 짝지어 둡니다4.

<key>NSPrivacyAccessedAPITypes</key>
<array>
    <dict>
        <key>NSPrivacyAccessedAPIType</key>
        <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
        <key>NSPrivacyAccessedAPITypeReasons</key>
        <array>
            <string>CA92.1</string>
        </array>
    </dict>
    <dict>
        <key>NSPrivacyAccessedAPIType</key>
        <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
        <key>NSPrivacyAccessedAPITypeReasons</key>
        <array>
            <string>C617.1</string>
        </array>
    </dict>
</array>

사유들은 닫힌 목록입니다. 앱은 카테고리당 Apple이 게시한 목록에서 하나 이상을 선택합니다. 임의의 문자열은 제출 시 거부됩니다.

5개의 필수 사유 API 카테고리

Apple의 2024년 초기 목록은 사유 선언이 필요한 API의 5개 카테고리를 정의했습니다4.

NSPrivacyAccessedAPICategoryFileTimestamp

파일 생성, 수정, 또는 접근 시간을 반환하는 모든 API에 의해 트리거됩니다. 일반적인 진입점은 URL.resourceValues(forKeys: [.creationDateKey, ...]), FileManager.attributesOfItem(atPath:), stat(), fstat(), lstat()입니다. 4개의 승인된 사유는 다음과 같습니다4.

  • DDA9.1. 디바이스 사용자에게 파일 타임스탬프를 표시. 이 사유로 접근한 정보는 디바이스 외부로 전송할 수 없습니다.
  • C617.1. 앱의 컨테이너, 앱 그룹 컨테이너, 또는 CloudKit 컨테이너 내 파일에 대한 파일 메타데이터(타임스탬프, 크기 등) 접근.
  • 3B52.1. 사용자가 명시적으로 접근을 허가한 파일이나 디렉터리(문서 선택기 등)에 대한 파일 메타데이터 접근.
  • 0A2A.1. 앱이 래퍼를 호출할 때만 파일 타임스탬프 API에 접근하는 서드파티 SDK 래퍼. SDK 전용입니다.

대부분의 앱은 내부 파일 관리에 C617.1(자체 컨테이너 접근)을 사용합니다. 사용자에게 노출되는 UI에 파일 날짜를 표시하는 앱은 DDA9.1을 사용합니다. 사용자가 허가한 파일을 읽는 앱(문서 선택기, 공유 확장 대상)은 3B52.1을 사용합니다. SDK 작성자는 0A2A.1만 사용합니다.

NSPrivacyAccessedAPICategorySystemBootTime

mach_absolute_time(), mach_continuous_time() 및 관련 가동 시간 API에 의해 트리거됩니다. 프라이버시 우려는 시스템 부팅 시간이 재설치를 가로질러 디바이스를 식별하는 데 사용될 수 있는 핑거프린팅 가능 신호라는 점입니다. 3개의 승인된 사유는 다음과 같습니다4.

  • 35F9.1. 앱 이벤트 사이의 시간 간격을 측정하거나 타이머를 활성화하기 위한 시스템 부팅 시간 접근.
  • 8FFB.1. 앱 내 이벤트의 절대 타임스탬프를 계산하기 위한 시스템 부팅 시간 접근.
  • 3D61.1. 사용자가 제출하기로 선택한 선택적 버그 보고서에 시스템 부팅 시간 정보 추가.

대부분의 앱은 성능 측정에 35F9.1을 사용합니다. 8FFB.1은 앱이 부팅 시간(디바이스 세션을 기준으로)으로부터 이벤트 타임스탬프를 도출하는 경우를 다룹니다. Date()Date.now는 이 카테고리를 트리거하지 않습니다. 다른 시간 소스를 사용하기 때문입니다. 이 카테고리는 구체적으로 mach_*_time 계열 호출을 다룹니다.

NSPrivacyAccessedAPICategoryDiskSpace

URL.resourceValues(forKeys: [.volumeAvailableCapacityKey, ...])NSFileManager의 파일 시스템 속성 API을 포함하여, 디스크 용량이나 여유 공간을 반환하는 API에 의해 트리거됩니다. 프라이버시 우려는 디스크 공간 패턴이 핑거프린팅 가능 신호라는 점입니다. 4개의 승인된 사유는 다음과 같습니다4.

  • 854F.1. 데이터 단위 또는 미디어 시간 단위로 디바이스 사용자에게 디스크 공간 정보 표시.
  • E174.1. 파일 쓰기 시 또는 디스크 공간 부족을 관리하기 위한 디스크 공간 확인(에셋 다운로드 여부 결정, 캐시된 파일 정리).
  • 7D9E.1. 사용자가 제출하기로 선택한 선택적 버그 보고서에 디스크 공간 정보 포함.
  • B728.1. 연구 데이터 수집에 영향을 미치는 디스크 공간 부족을 감지하고 참가자에게 알리는 건강 연구 앱.

NSPrivacyAccessedAPICategoryActiveKeyboards

UITextInputMode.activeInputModes에 의해 트리거됩니다. 이 목록을 읽는 앱(일반적으로 동작을 현지화하거나 입력 언어를 감지하기 위한)은 사유를 선언해야 합니다. 2개의 승인된 사유는 다음과 같습니다4.

  • 3EC4.1. 디바이스의 활성 키보드를 결정하는 사용자 정의 키보드 앱.
  • 54BD.1. 그에 따라 사용자 인터페이스를 사용자 정의하기 위한 활성 키보드 정보 접근(일반적으로 입력 언어 인식 UX의 경우).

대부분의 앱은 이 카테고리가 필요하지 않습니다. 코드가 서드파티 라이브러리를 통해 간접적으로 activeInputModes를 호출한다면, 그 라이브러리의 매니페스트가 이를 선언합니다.

NSPrivacyAccessedAPICategoryUserDefaults

거의 모든 앱이 걸리는 카테고리입니다. UserDefaults(UserDefaults.standard, init(suiteName:)을 통한 앱 그룹 defaults, 개별 set/get 호출)에 대한 모든 접근이 이 요구사항을 트리거합니다7. 4개의 승인된 사유는 다음과 같습니다4.

  • CA92.1. 앱 자체에 한정된(또는 앱과만 짝을 이루는 앱 확장에 한정된) 데이터를 읽고 쓰기 위한 user defaults 접근.
  • 1C8F.1. 동일한 App Group의 구성원인 앱, 앱 확장, App Clip 내에서만 데이터를 읽고 쓰기 위한 user defaults 접근.
  • C56D.1. 앱이 래퍼를 호출할 때만 user defaults API에 접근하는 서드파티 SDK 래퍼. SDK 전용입니다.
  • AC6B.1. MDM/IT 관리자가 설정한 관리형 앱 구성을 검색하거나 관리자에게 피드백 정보를 저장하기 위한 user defaults 접근.

거의 모든 iOS 앱은 적어도 하나의 상태(사용자가 마지막으로 선택한 탭, 선호하는 정렬 순서, 기능 플래그)에 대해 UserDefaults.standard를 사용합니다. CA92.1 사유가 이를 다룹니다. 앱 그룹을 통해 앱 확장에 걸쳐 상태를 공유하는 앱은 1C8F.1을 추가합니다. SDK 작성자는 C56D.1을 사용합니다. 관리자가 설정한 키(예: com.apple.configuration.managed)를 읽는, MDM을 통해 배포된 앱은 AC6B.1을 사용합니다.

함정은 이것입니다. UserDefaults에 접근하는 서드파티 SDK은 앱을 대신해 이 요구사항을 트리거합니다. SDK의 매니페스트가 사유를 선언해야 합니다. 그 SDK이 Apple의 프라이버시 매니페스트를 함께 제공해야 하는 SDK 목록에 있다면, SDK의 매니페스트가 없다는 사실이 앱을 차단합니다.

추적 도메인: 런타임 검증

NSPrivacyTrackingDomains는 App Privacy Report를 통해 런타임에 적용됩니다6. 앱이 NSPrivacyTracking = true로 선언하면, 시스템은 모든 네트워크 요청을 추적하고 그 목적지를 선언된 목록과 대조합니다. 추적을 위해 접속했지만 선언되지 않은 도메인은 App Privacy Report의 “자주 가는 위치” 및 “접속한 기타 도메인” 섹션에 표시됩니다.

런타임 검증은 흥미로운 인센티브 구조를 만듭니다. NSPrivacyTracking = false(추적 없음)로 선언했지만 알려진 추적 도메인에 접속하는 것이 관찰된 앱은 App Privacy Report에 표시되며 사용자 불만의 위험을 감수합니다. 올바른 수는 정직한 선언입니다.

SDK의 경우, SDK의 프라이버시 매니페스트가 자체의 추적 동작을 선언합니다. 앱의 매니페스트는 SDK의 추적 도메인을 열거할 필요가 없습니다. SDK의 매니페스트가 이미 그렇게 합니다. 제출 시 Apple은 매니페스트를 병합하고 일관성을 확인합니다.

SDK 매니페스트: 실제 의무

두 카테고리의 서드파티 SDK은 프라이버시 매니페스트를 함께 제공해야 합니다5.

  1. Apple의 프라이버시 매니페스트가 필요한 SDK 게시 목록에 있는 SDK. 이 목록에는 iOS 26 기준으로 Firebase Analytics, Google Mobile Ads, Adjust, Segment, AppsFlyer 및 약 30개의 다른 항목이 포함됩니다.
  2. 앱이 링크하는 사전 컴파일된 바이너리(XCFrameworks, 정적 라이브러리)로 배포되는 SDK.

SDK의 매니페스트 없이 필수 SDK을 링크한 앱의 제출은 ITMS-91xxx 시리즈 오류로 실패합니다. 매니페스트 누락, 매니페스트 서명 누락, 또는 SDK의 네임스페이스 내 API 선언 누락을 다루는 오류입니다2. 해결책은 SDK의 매니페스트가 포함된 버전으로 업데이트하거나 SDK을 제거하는 것입니다.

자체 SDK(팀이 자사 앱에서 사용하는 내부 프레임워크를 출시하는 경우)의 경우, 프레임워크가 Apple의 목록에 없다면 매니페스트를 건너뛰기로 선택할 수 있습니다. 실용적인 수는 어쨌든 함께 제공하는 것입니다. 향후 Apple 목록 확장, 향후 감사 작업, 향후 서드파티 재사용 모두 매니페스트가 갖춰져 있을 때 이득을 봅니다.

흔한 함정

App Store 거부 로그에서 반복되는 5가지 실패 모드입니다.

1. 잊혀진 UserDefaults 선언. 가장 흔한 거부입니다. 앱이 어딘가 평범해 보이는 곳에서 @AppStorage(UserDefaults를 감쌉니다)를 사용하는데, 매니페스트가 이를 선언하지 않습니다. 해결책은 다음과 같습니다. @AppStorage, UserDefaults, 또는 그 주변의 어떤 래퍼라도 사용하는 모든 앱은 CA92.1과 함께 NSPrivacyAccessedAPICategoryUserDefaults가 필요합니다.

2. URLResourceValues를 통한 숨겨진 파일 타임스탬프 접근. URL.resourceValues(forKeys: [.contentModificationDateKey])를 통해 파일 수정 날짜를 읽는 코드는, 호출 사이트가 stat처럼 보이지 않더라도 카테고리를 트리거합니다.

3. SDK 매니페스트에 대한 기대. 앱 팀은 SDK의 매니페스트가 SDK 작성자의 문제라고 가정합니다. 그렇긴 하지만, SDK이 매니페스트를 함께 제공할 때까지 앱 팀의 제출이 실패합니다.

4. 추적 SDK이 링크되어 있음에도 NSPrivacyTracking = false. Firebase Analytics나 Google Mobile Ads를 기본 설정으로 링크하면 종종 추적 동작이 트리거됩니다. 앱의 매니페스트가 NSPrivacyTracking = false로 선언하는 동안 SDK의 매니페스트가 true로 선언하면, 병합이 표시하는 모순이 발생합니다.

5. 오래된 사유 코드. Apple은 가끔 승인된 사유 코드를 업데이트합니다. 2024년에 유효했던 코드가 대체되거나 확장될 수 있습니다. 해결책은 메이저 릴리스마다 현재 게시된 목록을 다시 확인하는 것이지, 오래된 매니페스트를 그대로 복사해 가져가는 것이 아닙니다.

검증 도구

제출 전에 실행해 볼 가치가 있는 3가지 점검입니다.

Xcode의 “Generate Privacy Report” 아카이브 워크플로. Product > Archive 이후, Organizer는 앱과 모든 링크된 SDK의 매니페스트로부터 집계 보고서를 생성하는 “Generate Privacy Report” 액션을 제공합니다. 이 보고서가 App Store Connect가 수집하는 것이며, 이를 로컬에서 실행하는 것이 제출 전 드라이런에 가장 가까운 등가물입니다.

필수 사유 API에 대한 정적 분석. 오픈 소스 도구는 5개 카테고리를 트리거하는 API 호출 사이트를 찾기 위해 프로젝트를 스캔합니다. 커뮤니티가 유지하는 stelabouras/privacy-manifest CLI은 Swift 소스와 xcframework 바이너리를 파싱하여 선언된 사유 코드와 선언되지 않은 사유 코드를 노출합니다. crasowas/app_store_required_privacy_manifest_analyser도 비슷한 스캔을 제공합니다. 둘 중 어느 것이든 누락된 선언을 제출 전에 잡아내는 데 유용합니다.

App Privacy Report 교차 점검. iOS의 App Privacy Report 모드(설정 > 개인정보 보호 및 보안 > 앱 개인정보 보호 리포트)에서 앱을 실행합니다. 앱이 접속하는 도메인이 보고서에 표시됩니다. 매니페스트의 추적 선언과 교차 점검합니다.

이 패턴이 iOS 26+ 앱에 의미하는 것

3가지 핵심입니다.

  1. 프라이버시 매니페스트를 체크박스가 아닌 구조화된 계약으로 다루십시오. 매니페스트는 앱이 비공개 데이터를 가지고 무엇을 하는지에 대한 유일한 기계 판독 가능 기록입니다. 한번 만들고 영원히 무시하는 것은, 6개월 후 SDK 업데이트가 매니페스트의 필수 표면을 조용히 확장했을 때 제출이 거부되는 길입니다.

  2. 모든 릴리스에서 UserDefaults와 파일 타임스탬프 접근을 감사하십시오. 이 두 카테고리는 코드베이스와 함께 조용히 자라납니다. 리팩터링에서 추가된 @AppStorage 사용 SwiftUI 뷰는 NSPrivacyAccessedAPICategoryUserDefaults를 범위 안으로 끌어들입니다. 이후에 추가된 파일 목록 기능은 NSPrivacyAccessedAPICategoryFileTimestamp를 끌어들입니다. 매번 다시 검증하십시오.

  3. 자체 매니페스트를 함께 제공하는 SDK을 사용하십시오. 서드파티 SDK을 평가할 때, 그 프라이버시 매니페스트의 존재와 품질은 이제 품질 신호입니다. 매니페스트가 없는 SDK은 앱 팀이 상류와 싸우도록 강요합니다. 매니페스트가 있는 SDK은 병합에 깔끔하게 들어맞습니다.

전체 Apple 생태계 클러스터: 타입 지정 App Intents; MCP 서버; 라우팅 질문; Foundation Models; 런타임 대 도구 LLM 구분; 세 가지 표면; 단일 진실 공급원 패턴; 두 개의 MCP 서버; Apple 개발용 훅; Live Activities; watchOS 런타임; SwiftUI 내부; RealityKit의 공간 멘탈 모델; SwiftData 스키마 규율; Liquid Glass 패턴; 멀티 플랫폼 출시; 플랫폼 매트릭스; Vision 프레임워크; Symbol Effects; Core ML 추론; Writing Tools API; Swift Testing; 내가 쓰기를 거부하는 것. 허브는 Apple Ecosystem Series에 있습니다. AI 에이전트와 함께하는 더 넓은 iOS 컨텍스트는 iOS Agent Development guide를 참조하십시오.

FAQ

NSPrivacyTrackingNSPrivacyCollectedDataTypeTracking의 차이는 무엇인가요?

NSPrivacyTracking은 앱 수준의 boolean입니다. 이 앱이 (Apple의 좁은 정의에 따라) 사용자를 추적하기는 하는가? NSPrivacyCollectedDataTypeTracking은 데이터 유형별입니다. 앱이 수집하는 특정 데이터 유형에 대해, 데이터가 추적에 사용되는가? 앱은 추적 없이 데이터를 수집할 수 있습니다(회사 간을 가로질러 연결하지 않는 분석). 유형별 플래그는 각 특정 데이터 유형이 추적 동작에 기여하는지 여부를 포착합니다.

내부 전용 TestFlight 앱에도 프라이버시 매니페스트가 필요한가요?

네. 프라이버시 매니페스트 집행은 TestFlight 빌드를 포함하여 App Store Connect 제출 시점에 실행됩니다. 매니페스트가 없는 내부 베타도 공개 릴리스와 동일한 ITMS-91053 검사에 실패합니다.

사용하지 않는 필수 사유 API을 선언하면 어떻게 되나요?

기능적으로는 아무 일도 일어나지 않습니다. 매니페스트는 API 표면의 상한을 선언합니다. 사용하지 않는 카테고리를 선언하는 것은 무해합니다. 비용은 문서 드리프트입니다. 향후 유지관리자는 호출이 실제로는 제거되었음에도 그 선언이 현재 코드를 반영한다고 가정할 수 있습니다. 올바른 수는 앱이 실제로 사용하는 것을 선언하는 것이며, 메이저 릴리스마다 감사하는 것입니다.

원래의 5가지를 넘어선 필수 사유 API 카테고리가 있나요?

iOS 26 기준으로, 원래의 5개 카테고리(파일 타임스탬프, 시스템 부팅 시간, 디스크 공간, 활성 키보드, User Defaults)가 정식 목록으로 남아 있습니다4. Apple은 시간에 걸쳐 카테고리 내에 승인된 사유 코드를 추가했지만 카테고리 목록을 확장하지는 않았습니다. 추가 사항은 Apple의 필수 사유 API 문서 페이지를 주시하십시오.

프라이버시 매니페스트는 App Tracking Transparency와 어떻게 상호작용하나요?

App Tracking Transparency(ATT)는 앱 간 추적을 위한 런타임 권한 프롬프트를 관장합니다. 프라이버시 매니페스트는 앱의 의도를 정적으로 선언합니다. 둘은 상호 보완적입니다. 앱 간 추적을 하는 앱은 매니페스트에 NSPrivacyTracking = true를 선언하고 런타임에 ATT 권한을 요청합니다. NSPrivacyTracking = false를 선언하는 앱은 ATT를 요청해서는 안 됩니다(앱 간 추적의 부재는 프롬프트가 불필요함을 의미합니다).

참고 자료


  1. Apple Developer Documentation: Privacy manifest files. 형식 참조 및 2024년 5월 1일 시행 일정. 

  2. Apple Developer: App Store Connect submission errors — ITMS-91053(API 선언 누락) 및 관련 코드를 다룹니다. 

  3. Apple Developer Documentation: App privacy configuration. 4개의 최상위 키(NSPrivacyTracking, NSPrivacyTrackingDomains, NSPrivacyCollectedDataTypes, NSPrivacyAccessedAPITypes)와 그 스키마. 

  4. Apple Developer Documentation: Describing use of required reason API. 승인된 사유 코드와 함께 5개의 필수 사유 API 카테고리. 

  5. Apple Developer: Third-party SDK privacy manifest requirements. 프라이버시 매니페스트를 함께 제공해야 하는 SDK 목록. 

  6. Apple Developer Documentation: User privacy and data use. 추적의 좁은 정의와 App Tracking Transparency 프레임워크. 

  7. Apple Developer Documentation: NSPrivacyAccessedAPICategoryUserDefaults. @AppStorage 기반 래퍼를 포함한 모든 UserDefaults 접근을 다루는 카테고리. 

관련 게시물

SwiftData's Real Cost Is Schema Discipline

SwiftData's API is two macros. The cost is what happens after you ship. Optional fields are the cheap migration; non-opt…

15 분 소요

Liquid Glass in SwiftUI: Three Patterns From Shipping Return on iOS 26

Apple's Liquid Glass is a one-line SwiftUI API. Three patterns from Return go beyond .glassEffect(): glass on text via C…

19 분 소요

The Cleanup Layer Is the Real AI Agent Market

Charlie Labs pivoted from building agents to cleaning up after them. The AI agent market is moving from generation to pr…

15 분 소요