iOS ITMS-91055 에러 해결 방법

에러 해결에 앞서 PrivacyInfo.xcprivacy가 무엇인지 정확히 이해해야 합니다. Apple의 개인정보 보호 정책 강화로 인해 2024년 봄부터 필수가 된 이 파일의 개념과 구성 요소를 알아보겠습니다.
Apple은 2023년 12월 7일과 2024년 2월 29일 두 차례에 걸쳐 개인정보 보호 관련 정책 업데이트를 공지했습니다. 핵심 내용은 다음과 같습니다.
2024년 5월 1일부터 App Store Connect에 새로운 앱 또는 앱 업데이트를 업로드하려면 앱의 개인정보 보호 매니페스트에 앱이 API를 사용하는 방식을 정확하게 반영하는 허용된 사유를 포함해야 합니다.
즉, XCFrameworks, Swift 패키지 또는 Xcode 프로젝트로 배포되는 모든 앱과 Third-Party SDK에는 PrivacyInfo.xcprivacy라는 이름의 Privacy Manifest 파일이 필수로 포함되어야 합니다.
PrivacyInfo.xcprivacy는 앱 내부에서 개인정보를 사용하는 방식과 용도를 정의한 목록입니다. info.plist와 유사한 Dictionary 구조의 Property List 파일이지만, 개인정보 보호에 특화되어 있다는 점이 다릅니다.
| 구분 | info.plist | PrivacyInfo.xcprivacy |
|---|---|---|
| 목적 | 앱의 기본 설정 및 권한 정보 | 개인정보 사용 방식과 용도 명시 |
| 필수 여부 | 모든 iOS 앱 필수 | 2024.05.01 이후 필수 |
| 포함 정보 | 앱 이름, 버전, 권한 등 | API 사용 이유, 추적 도메인 등 |
| 적용 범위 | 앱 레벨 | 앱 및 모든 Third-Party SDK |
PrivacyInfo.xcprivacy 파일에는 다음 4가지 정보가 포함되어야 합니다.

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

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

수집하는 정보가 추적과 관련되어 있는 경우 상세 설명을 기재합니다. 주로 userId, name, email 등 사용자 식별 정보가 추적에 포함되는 경우 추가합니다.
가장 중요한 항목으로, 개인정보 Access 이유가 필요한 API로 지정된 앱 또는 Third-Party SDK가 Access하는 API 유형을 설명하는 사전 배열입니다. ITMS-91055 에러는 바로 이 항목과 관련이 있습니다.
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.
디스크 공간 관련 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.
파일 타임스탬프 관련 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.
ITMS-91055 에러가 발생하는 근본 원인은 다음과 같습니다.
① PrivacyInfo.xcprivacy 파일이 프로젝트에 없는 경우
② Privacy Accessed API Types가 정의되지 않은 경우
③ Privacy Accessed API Reasons가 비어있거나 잘못된 코드를 사용한 경우
④ Third-Party SDK의 개인정보 사용 API를 명시하지 않은 경우
ITMS-91055 에러를 해결하려면 앱의 특성에 맞는 올바른 API Type과 Reason을 PrivacyInfo.xcprivacy 파일에 정의해야 합니다.
Xcode에서 새로운 PrivacyInfo.xcprivacy 파일을 생성합니다.
① Xcode에서 프로젝트 열기
② File → New → File 선택
③ Resource 섹션에서 "App Privacy" 선택
④ 파일명을 "PrivacyInfo"로 설정 (확장자 .xcprivacy 자동 추가)
⑤ 프로젝트 루트 또는 적절한 위치에 저장
에러 메시지에서 지적된 카테고리에 대한 올바른 API Type과 Reason을 추가합니다.
DiskSpace 카테고리 해결
Privacy Accessed API Reasons: CA92.1
FileTimestamp 카테고리 해결
Privacy Accessed API Reasons: C617.1
| Reason Code | 설명 |
|---|---|
| 85F4.1 | 앱 내부 쓰기 작업에 충분한 디스크 공간이 있는지 확인 |
| E174.1 | 사용자에게 디스크 공간 부족 경고 표시 |
| 7D9E.1 | 앱 기능의 일부로 파일 시스템 정보를 포함 |
| B728.1 | 건강, 피트니스 앱이 디스크 공간 정보 사용 |
| 92D5.1 | Third-Party SDK가 디스크 공간 정보 사용 |
| CA92.1 | 동일 앱 내에서 정보 접근 (가장 일반적) |
| Reason Code | 설명 |
|---|---|
| C617.1 | 앱 또는 그룹 컨테이너 내부에서 접근 (가장 일반적) |
| 3B52.1 | 사용자가 명시적으로 부여한 접근 권한 내에서 사용 |
| 0A2A.1 | 다른 파일과의 상대적 순서를 결정하기 위해 접근 |
| DDA9.1 | 앱 기능의 일부로 파일 타임스탬프 표시 |
다음은 ITMS-91055 에러를 해결하기 위한 실제 PrivacyInfo.xcprivacy 파일의 XML 코드입니다.
<!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>
PrivacyInfo.xcprivacy 파일을 수동으로 작성하는 것이 어렵다면, 자동 생성 도구를 활용하는 것이 효율적입니다. WeMakeApps에서 제공하는 Privacy Manifest Maker가 대표적입니다.
① 웹사이트 접속: https://wemakeapps.net/manifest-maker
② 앱에서 사용하는 API 카테고리 선택
③ 각 카테고리별 Reason Code 선택
④ Privacy Tracking 여부 설정
⑤ "Generate" 버튼 클릭
⑥ 생성된 PrivacyInfo.xcprivacy 파일 다운로드
⑦ Xcode 프로젝트에 추가
자동 생성 도구를 사용하기 전에 앱에서 실제로 사용하는 API와 Third-Party SDK를 먼저 파악해야 합니다. 불필요한 항목을 포함하면 심사에서 추가 질문을 받을 수 있습니다.
Firebase, Alamofire, Kingfisher 등 자주 사용하는 Third-Party SDK도 개인정보 API를 사용할 수 있으므로, 각 SDK의 공식 문서에서 권장하는 Privacy Manifest 설정을 확인해야 합니다.
자동 생성된 파일을 그대로 사용하지 말고, 앱의 실제 동작과 일치하는지 반드시 검증해야 합니다.
A: PrivacyInfo.xcprivacy 파일은 앱의 루트 번들 또는 프레임워크 번들에 위치해야 합니다. 일반적으로 프로젝트 루트 디렉토리에 배치하면 되며, Xcode에서 Target Membership이 올바르게 설정되어 있는지 확인해야 합니다.
A: 앱 자체에 하나, Third-Party SDK나 프레임워크에 각각 하나씩 필요할 수 있습니다. 각 번들마다 별도의 PrivacyInfo.xcprivacy 파일이 필요합니다. 대부분의 경우 앱 레벨에 하나만 있으면 충분하지만, 커스텀 프레임워크를 사용한다면 추가로 필요할 수 있습니다.
A: 아니요, 앱에서 실제로 사용하는 API에 대한 Reason Code만 추가해야 합니다. 불필요한 항목을 추가하면 Apple 심사팀에서 추가 설명을 요구할 수 있으며, 심사가 지연될 수 있습니다.
A: 네, Firebase도 개인정보 관련 API를 사용합니다. Firebase의 공식 Privacy Manifest 가이드를 참고하여 필요한 API Type과 Reason을 추가해야 합니다. Firebase SDK 버전에 따라 이미 PrivacyInfo가 포함되어 있을 수 있으니 확인이 필요합니다.
A: 다음 사항을 확인하세요.
① 파일명이 정확히 "PrivacyInfo.xcprivacy"인지 확인
② Xcode에서 Target Membership이 올바르게 설정되어 있는지 확인
③ XML 문법 오류가 없는지 확인
④ API Type과 Reason Code가 정확히 일치하는지 확인
⑤ 프로젝트를 Clean Build Folder (Cmd+Shift+K) 후 재빌드
⑥ Archive 후 App Store Connect에 재업로드
A: 2024년 5월 1일부터 App Store Connect에 업로드하는 모든 새로운 앱과 앱 업데이트에 필수입니다. 기존에 출시된 앱을 업데이트하지 않는다면 당장은 필요 없지만, 새로운 버전을 제출하려면 반드시 추가해야 합니다.
A: UserDefaults 자체는 Privacy API로 분류되지 않습니다. 하지만 UserDefaults에 저장하는 데이터의 성격에 따라 관련 API가 트리거될 수 있습니다. 예를 들어 파일 시스템 접근이 발생하면 FileTimestamp 카테고리가 필요할 수 있습니다.
A: 다음 방법으로 확인할 수 있습니다.
① Xcode에서 Archive 생성
② Archive를 오른쪽 클릭 → "Show in Finder" 선택
③ .xcarchive 파일을 오른쪽 클릭 → "패키지 내용 보기"
④ Products/Applications/YourApp.app 이동
⑤ PrivacyInfo.xcprivacy 파일이 있는지 확인
⑥ 파일을 열어 내용이 올바른지 검증
A: Apple 심사팀에서 앱의 실제 동작과 선언된 Reason Code가 일치하지 않으면 심사를 거절할 수 있습니다. 또한 추가 설명을 요구할 수 있으며, 심사 기간이 길어질 수 있습니다. 따라서 앱의 실제 동작에 맞는 정확한 Reason Code를 선택하는 것이 중요합니다.
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 정책을 준수하는 것이 중요합니다.
끝.
'Development > iOS' 카테고리의 다른 글
| [iOS] Unable to process request - PLA Update avaiable (1) | 2024.07.22 |
|---|---|
| [iOS] iOS ImageView Content Mode 완벽 이해 - 7가지 모드 비교 (0) | 2024.07.21 |
| [iOS] New Project Create 시 생성되는 파일과 기능 (0) | 2024.07.16 |