본문 바로가기
Development/iOS

[iOS] iOS ITMS-91055 에러 해결 방법 - PrivacyInfo 완벽 정리

by 은스타 2024. 7. 22.
반응형
iOS ITMS-91055 에러 해결 방법 - PrivacyInfo 완벽 정리

iOS ITMS-91055 에러 해결 방법

App Store에 앱을 제출했는데 ITMS-91055 에러로 심사가 거절되었나요? 2024년 5월 1일부터 Apple은 모든 앱에 개인정보 보호 매니페스트(PrivacyInfo.xcprivacy) 파일을 필수로 요구하고 있습니다. 이 글에서는 ITMS-91055 에러의 원인부터 PrivacyInfo.xcprivacy 파일 생성 방법, 실전 해결 과정까지 한 번에 정리했습니다. App Store 심사 통과를 위한 필수 가이드입니다.
목차
1. PrivacyInfo.xcprivacy 이해하기
2. ITMS-91055 에러 원인 분석
3. ITMS-91055 에러 해결 방법
4. PrivacyInfo 자동 생성 도구
5. 자주 묻는 질문 (FAQ)


#1. PrivacyInfo.xcprivacy 이해하기

에러 해결에 앞서 PrivacyInfo.xcprivacy가 무엇인지 정확히 이해해야 합니다. Apple의 개인정보 보호 정책 강화로 인해 2024년 봄부터 필수가 된 이 파일의 개념과 구성 요소를 알아보겠습니다.

1) Apple 개인정보 보호 정책 업데이트

Apple은 2023년 12월 7일과 2024년 2월 29일 두 차례에 걸쳐 개인정보 보호 관련 정책 업데이트를 공지했습니다. 핵심 내용은 다음과 같습니다.

2024년 5월 1일부터 App Store Connect에 새로운 앱 또는 앱 업데이트를 업로드하려면 앱의 개인정보 보호 매니페스트에 앱이 API를 사용하는 방식을 정확하게 반영하는 허용된 사유를 포함해야 합니다.

즉, XCFrameworks, Swift 패키지 또는 Xcode 프로젝트로 배포되는 모든 앱과 Third-Party SDK에는 PrivacyInfo.xcprivacy라는 이름의 Privacy Manifest 파일이 필수로 포함되어야 합니다.

. . . . .
2) PrivacyInfo.xcprivacy의 정의

PrivacyInfo.xcprivacy는 앱 내부에서 개인정보를 사용하는 방식과 용도를 정의한 목록입니다. info.plist와 유사한 Dictionary 구조의 Property List 파일이지만, 개인정보 보호에 특화되어 있다는 점이 다릅니다.

(1) info.plist와의 차이점
구분 info.plist PrivacyInfo.xcprivacy
목적 앱의 기본 설정 및 권한 정보 개인정보 사용 방식과 용도 명시
필수 여부 모든 iOS 앱 필수 2024.05.01 이후 필수
포함 정보 앱 이름, 버전, 권한 등 API 사용 이유, 추적 도메인 등
적용 범위 앱 레벨 앱 및 모든 Third-Party SDK
. . . . .
3) PrivacyInfo.xcprivacy 필수 구성 요소

PrivacyInfo.xcprivacy 파일에는 다음 4가지 정보가 포함되어야 합니다.

(1) Privacy Tracking Enabled

출처: https://kemikim.medium.com

앱 및 SDK가 추적을 위해 데이터를 사용하는지 여부를 나타냅니다.

① 추적 사용: YES
② 추적 미사용: NO

(2) Privacy Tracking Domains

출처: https://kemikim.medium.com

앱 및 SDK 추적을 위해 사용하는 도메인을 명시합니다. 예를 들어 Google Analytics를 사용한다면 해당 추적 도메인을 입력해야 합니다.

// 예시
tracking.domain.example
analytics.google.com
(3) Privacy Nutrition Label Types

출처: https://kemikim.medium.com

수집하는 정보가 추적과 관련되어 있는 경우 상세 설명을 기재합니다. 주로 userId, name, email 등 사용자 식별 정보가 추적에 포함되는 경우 추가합니다.

(4) Privacy Accessed API Types

가장 중요한 항목으로, 개인정보 Access 이유가 필요한 API로 지정된 앱 또는 Third-Party SDK가 Access하는 API 유형을 설명하는 사전 배열입니다. ITMS-91055 에러는 바로 이 항목과 관련이 있습니다.


#2. ITMS-91055 에러 원인 분석
1) 에러 메시지 이해하기

ITMS-91055 에러는 PrivacyInfo.xcprivacy 파일에 Privacy Accessed API Types의 유효한 이유(Privacy Accessed API Reasons)가 기입되지 않았거나 잘못 기입되었을 때 발생합니다.

ITMS-91055: Invalid API reason declaration

The PrivacyInfo.xcprivacy for the "Frameworks/libswiftDispatch.dylib" file contains "CA92.1:Access Info from same app, per documentation" as the value for a NSPrivacyAccessedAPITypeReasons key instead of a valid reason code for using an API in the NSPrivacyAccessedAPICategoryDiskSpace category.

. . . . .
2) 주요 에러 패턴
(1) DiskSpace 카테고리 에러

디스크 공간 관련 API를 사용하는데 적절한 reason code가 없는 경우 발생합니다.

// 에러 메시지
The PrivacyInfo.xcprivacy for the "Frameworks/libswiftDispatch.dylib" file
contains "CA92.1:Access Info from same app, per documentation"
as the value for a NSPrivacyAccessedAPITypeReasons key
instead of a valid reason code for using an API in the
NSPrivacyAccessedAPICategoryDiskSpace category.
(2) FileTimestamp 카테고리 에러

파일 타임스탬프 관련 API를 사용하는데 reason code가 비어있거나 잘못된 경우 발생합니다.

// 에러 메시지
The PrivacyInfo.xcprivacy for the "Frameworks/libswiftObjectiveC.dylib" file
contains an empty string as the value for a NSPrivacyAccessedAPITypeReasons key
instead of a valid reason code for using an API in the
NSPrivacyAccessedAPICategoryFileTimestamp category.
. . . . .
3) 에러 발생 근본 원인

ITMS-91055 에러가 발생하는 근본 원인은 다음과 같습니다.

PrivacyInfo.xcprivacy 파일이 프로젝트에 없는 경우
② Privacy Accessed API Types가 정의되지 않은 경우
Privacy Accessed API Reasons가 비어있거나 잘못된 코드를 사용한 경우
④ Third-Party SDK의 개인정보 사용 API를 명시하지 않은 경우


#3. ITMS-91055 에러 해결 방법
1) 해결 방법 개요

ITMS-91055 에러를 해결하려면 앱의 특성에 맞는 올바른 API Type과 Reason을 PrivacyInfo.xcprivacy 파일에 정의해야 합니다.

. . . . .
2) 단계별 해결 과정
(1) PrivacyInfo.xcprivacy 파일 생성

Xcode에서 새로운 PrivacyInfo.xcprivacy 파일을 생성합니다.

① Xcode에서 프로젝트 열기
② File → New → File 선택
③ Resource 섹션에서 "App Privacy" 선택
④ 파일명을 "PrivacyInfo"로 설정 (확장자 .xcprivacy 자동 추가)
⑤ 프로젝트 루트 또는 적절한 위치에 저장

(2) API Type과 Reason 정의

에러 메시지에서 지적된 카테고리에 대한 올바른 API Type과 Reason을 추가합니다.

DiskSpace 카테고리 해결

Privacy Accessed API Type: NSPrivacyAccessedAPICategoryDiskSpace
Privacy Accessed API Reasons: CA92.1

FileTimestamp 카테고리 해결

Privacy Accessed API Type: NSPrivacyAccessedAPICategoryFileTimestamp
Privacy Accessed API Reasons: C617.1
. . . . .
3) 주요 API Reason Code 정리
(1) DiskSpace 카테고리
Reason Code 설명
85F4.1 앱 내부 쓰기 작업에 충분한 디스크 공간이 있는지 확인
E174.1 사용자에게 디스크 공간 부족 경고 표시
7D9E.1 앱 기능의 일부로 파일 시스템 정보를 포함
B728.1 건강, 피트니스 앱이 디스크 공간 정보 사용
92D5.1 Third-Party SDK가 디스크 공간 정보 사용
CA92.1 동일 앱 내에서 정보 접근 (가장 일반적)
(2) FileTimestamp 카테고리
Reason Code 설명
C617.1 앱 또는 그룹 컨테이너 내부에서 접근 (가장 일반적)
3B52.1 사용자가 명시적으로 부여한 접근 권한 내에서 사용
0A2A.1 다른 파일과의 상대적 순서를 결정하기 위해 접근
DDA9.1 앱 기능의 일부로 파일 타임스탬프 표시
. . . . .
4) 실제 PrivacyInfo.xcprivacy 코드 예시

다음은 ITMS-91055 에러를 해결하기 위한 실제 PrivacyInfo.xcprivacy 파일의 XML 코드입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <!-- Privacy Accessed API Types 배열 -->
    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <!-- DiskSpace API -->
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
        </dict>
        <!-- FileTimestamp API -->
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

#4. PrivacyInfo 자동 생성 도구
1) WeMakeApps Privacy Manifest Maker

PrivacyInfo.xcprivacy 파일을 수동으로 작성하는 것이 어렵다면, 자동 생성 도구를 활용하는 것이 효율적입니다. WeMakeApps에서 제공하는 Privacy Manifest Maker가 대표적입니다.

(1) 사용 방법

① 웹사이트 접속: https://wemakeapps.net/manifest-maker
② 앱에서 사용하는 API 카테고리 선택
③ 각 카테고리별 Reason Code 선택
④ Privacy Tracking 여부 설정
⑤ "Generate" 버튼 클릭
⑥ 생성된 PrivacyInfo.xcprivacy 파일 다운로드
⑦ Xcode 프로젝트에 추가

. . . . .
2) 자동 생성 도구 활용 팁
(1) 앱 분석 선행

자동 생성 도구를 사용하기 전에 앱에서 실제로 사용하는 API와 Third-Party SDK를 먼저 파악해야 합니다. 불필요한 항목을 포함하면 심사에서 추가 질문을 받을 수 있습니다.

(2) Third-Party SDK 확인

Firebase, Alamofire, Kingfisher 등 자주 사용하는 Third-Party SDK도 개인정보 API를 사용할 수 있으므로, 각 SDK의 공식 문서에서 권장하는 Privacy Manifest 설정을 확인해야 합니다.

(3) 검증 필수

자동 생성된 파일을 그대로 사용하지 말고, 앱의 실제 동작과 일치하는지 반드시 검증해야 합니다.


#5. 자주 묻는 질문 (FAQ)
1) Q: PrivacyInfo.xcprivacy 파일은 어디에 위치해야 하나요?

A: PrivacyInfo.xcprivacy 파일은 앱의 루트 번들 또는 프레임워크 번들에 위치해야 합니다. 일반적으로 프로젝트 루트 디렉토리에 배치하면 되며, Xcode에서 Target Membership이 올바르게 설정되어 있는지 확인해야 합니다.

. . . . .
2) Q: 여러 개의 PrivacyInfo.xcprivacy 파일을 만들어야 하나요?

A: 앱 자체에 하나, Third-Party SDK나 프레임워크에 각각 하나씩 필요할 수 있습니다. 각 번들마다 별도의 PrivacyInfo.xcprivacy 파일이 필요합니다. 대부분의 경우 앱 레벨에 하나만 있으면 충분하지만, 커스텀 프레임워크를 사용한다면 추가로 필요할 수 있습니다.

. . . . .
3) Q: 모든 API Reason Code를 다 추가해야 하나요?

A: 아니요, 앱에서 실제로 사용하는 API에 대한 Reason Code만 추가해야 합니다. 불필요한 항목을 추가하면 Apple 심사팀에서 추가 설명을 요구할 수 있으며, 심사가 지연될 수 있습니다.

. . . . .
4) Q: Firebase를 사용하는데 별도 설정이 필요한가요?

A: 네, Firebase도 개인정보 관련 API를 사용합니다. Firebase의 공식 Privacy Manifest 가이드를 참고하여 필요한 API Type과 Reason을 추가해야 합니다. Firebase SDK 버전에 따라 이미 PrivacyInfo가 포함되어 있을 수 있으니 확인이 필요합니다.

. . . . .
5) Q: PrivacyInfo 파일을 추가했는데도 에러가 발생합니다

A: 다음 사항을 확인하세요.

① 파일명이 정확히 "PrivacyInfo.xcprivacy"인지 확인
② Xcode에서 Target Membership이 올바르게 설정되어 있는지 확인
XML 문법 오류가 없는지 확인
④ API Type과 Reason Code가 정확히 일치하는지 확인
⑤ 프로젝트를 Clean Build Folder (Cmd+Shift+K) 후 재빌드
⑥ Archive 후 App Store Connect에 재업로드

. . . . .
6) Q: 언제부터 PrivacyInfo가 필수인가요?

A: 2024년 5월 1일부터 App Store Connect에 업로드하는 모든 새로운 앱과 앱 업데이트에 필수입니다. 기존에 출시된 앱을 업데이트하지 않는다면 당장은 필요 없지만, 새로운 버전을 제출하려면 반드시 추가해야 합니다.

. . . . .
7) Q: UserDefaults도 Privacy API에 해당하나요?

A: UserDefaults 자체는 Privacy API로 분류되지 않습니다. 하지만 UserDefaults에 저장하는 데이터의 성격에 따라 관련 API가 트리거될 수 있습니다. 예를 들어 파일 시스템 접근이 발생하면 FileTimestamp 카테고리가 필요할 수 있습니다.

. . . . .
8) Q: 심사 제출 전에 PrivacyInfo가 제대로 포함되었는지 확인하는 방법은?

A: 다음 방법으로 확인할 수 있습니다.

① Xcode에서 Archive 생성
② Archive를 오른쪽 클릭 → "Show in Finder" 선택
③ .xcarchive 파일을 오른쪽 클릭 → "패키지 내용 보기"
④ Products/Applications/YourApp.app 이동
PrivacyInfo.xcprivacy 파일이 있는지 확인
⑥ 파일을 열어 내용이 올바른지 검증

. . . . .
9) Q: Reason Code를 잘못 선택하면 어떻게 되나요?

A: Apple 심사팀에서 앱의 실제 동작과 선언된 Reason Code가 일치하지 않으면 심사를 거절할 수 있습니다. 또한 추가 설명을 요구할 수 있으며, 심사 기간이 길어질 수 있습니다. 따라서 앱의 실제 동작에 맞는 정확한 Reason Code를 선택하는 것이 중요합니다.

. . . . .
10) Q: Third-Party SDK의 PrivacyInfo는 어떻게 관리하나요?

A: 최신 버전의 SDK는 대부분 자체 PrivacyInfo.xcprivacy를 포함하고 있습니다. SDK 업데이트를 통해 자동으로 포함되거나, 각 SDK의 공식 문서에서 제공하는 가이드에 따라 수동으로 추가해야 합니다. CocoaPods나 SPM을 사용한다면 최신 버전으로 업데이트하는 것을 권장합니다.


마무리

ITMS-91055 에러는 Apple의 강화된 개인정보 보호 정책에 따른 필수 요구사항입니다. PrivacyInfo.xcprivacy 파일에 올바른 API Type과 Reason Code를 정의하면 쉽게 해결할 수 있습니다.

가장 중요한 것은 앱 내부에서 사용하는 모든 개인정보 관련 API를 정확히 파악하고, Third-Party SDK까지 고려하여 완전한 Privacy Manifest를 작성하는 것입니다. Firebase, Alamofire, Kingfisher 등 자주 사용하는 SDK들도 개인정보 API를 사용하므로, 각 SDK의 공식 문서를 반드시 확인해야 합니다.

자동 생성 도구를 활용하면 빠르게 파일을 만들 수 있지만, 앱의 실제 동작과 일치하는지 검증하는 과정은 필수입니다. 개발자로서 앱 내부 SDK의 흐름을 이해하고 Privacy 정책을 준수하는 것이 중요합니다.

긴 글 읽어주셔서 감사합니다.

끝.
반응형