Search

ITMS-91061: Missing privacy manifest - Privacy manifest? / 해결 방법

앱 스토어에 심사를 제출하니 1분 이내에 다음과 같은 메일이 날라왔다.
App Store 검토를 위한 제출이 성공적으로 완료되었더라도 다음 번 App Store 검토 제출 시 다음 문제를 수정하는 것이 좋습니다. 문제를 수정한 후 App Store Connect에 새 바이너리를 업로드하세요.
라는 설명과 함께 수정해야될 문제를 알려준다. 해당 문제는 ITMS-91061: Missing privacy manifest 오류였고 애플의 새로운 정책에 따라 발생한 문제였다. 이 정책을 이해하기 위해 공식 문서를 찾아보았고 이를 바탕으로 문제를 해결했디. 애플의 공식 문서에서는 다음과 같이 설명한다.
앱에 타사 SDK를 사용하는 경우 SDK가 앱에 포함하는 모든 코드에 대한 책임은 귀하에게 있으며 해당 코드의 데이터 수집 및 사용 관행을 알고 있어야 합니다. (생략) 이 기능은 모든 앱을 위한 한 단계 발전된 기능이며, 우리는 모든 SDK가 이 기능을 채택하여 해당 앱에 의존하는 앱을 더 잘 지원하도록 권장합니다.
이 정책은 WWDC23에 발표된 내용으로, 올해 봄(2024년)부터 타사 SDK가 앱 내에서 데이터를 어떻게 수집하고 사용하는지 명확하게 나타내기 위해 필수적으로 포함해야 한다. 근데 이 기능을 통해 어떻게 앱을 더 잘 지원하도록 권장할 수 있을까?

1. 사용자 신뢰도 향상

Privacy Manifest는 앱이 타사 SDK를 통해 사용자의 데이터를 어떻게 수집하고 사용하는지 투명하게 나타낼 수 있다. 개발자는 사용자에게 추가적으로 데이터 수집과 처리 과정을 제공할 수 있다. 이로 인해 사용자 신뢰도를 높이는 데 중요한 역할을 한다.

2. 타사 SDK 데이터 사용 이해도 증대

애플은 개발자가 타사 SDK가 어떻게 데이터를 수집하고 사용하는 방식을 더 잘 이해할 수 있도록 도와준다. 따라서 개발자가 앱 내에서 발생하는 모든 데이터 흐름에 대한 책임을 더욱 명확히 할 수 있게 된다.

3. 앱 데이터 흐름 간편 확인

Xcode15부터 앱의 Privacy Report를 생성할 수 있다. 이를 통해 개발자는 앱에 포함된 데이터 사용 정보를 한눈에 볼 수 있다. 생성 방법은 다음과 같다.

4. 보안성 강화

앱이 포함한 타사 SDK의 서명을 확인하여 앱에 포함된 외부 코드가 신뢰할 수 있는 개발자로부터 제공되었는지 검증할 수 있다. 이를 통해 앱의 소프트웨어 공급망의 무경성을 확보할 수 있고 악성 코드나 취약점이 포함될 가능성을 줄여준다.,

5. 사용자 데이터 보호 강화

Tracking Domain과 같은 잠재적 데이터 추적 위험을 사전에 관리할 수 있도록 돕는다. 이를 기반으로 사용자가 추적을 허용하지 않은 경우, 연결을 차단해 불필요한 데이터 수집을 방지할 수 있다. 이를 통해 개발자는 사용자의 데이터를 더욱 안전하게 보호할 수 있게 된다. 개발자에게는 보다 간편한 관리와 보안성을 제공하고 사용자에게는 데이터 보호와 투명성을 강화해 앱에 대한 신뢰를 높이게 된다.

해결 방법

1.
App Privacy 파일 추가하기
Next를 누르면 다음과 같은 화면이 뜨는데 주의할 점은 Targets를 프로젝트로 하면 안 되고 프로젝트에 사용되는 Third-party SDK에 해야 한다는 것이다. 이거 때문에 고생 좀 했는데 공식 문서와 해외 커뮤니티를 조금만 더 자세히 봤더라면 금방 해결할 수 있었을 것이다..
먼저, Group을 누르면 아래와 같이 창이 뜨는데 Pods을 선택한다.
그리고 Targets를 이메일에서 알려준대로 선택해준다.(중요)
2.
PrivacyInfo 필요한 내용에 맞춰 수정하기
이렇게 아무것도 없는 형태로 생성되는데 이제 내 앱에서 어떤 데이터를 수집하는지 확인하기 위해선 위에서 설명한 Privacy Report를 생성해 그 내용에 맞게 PrivacyInfo를 공식문서를 참고해서 작성하면 된다. 참고한 애플 공식 문서(1), 참고한 애플 공식 문서(2) 상단에 Product - Archive를 누르면 아래 사진과 같이 생성되는 것을 볼 수 있다. 그러면 Privacy Report를 눌러 PDF 파일을 export해서 내가 무엇이 필요한지 확인해보자.
내 프로젝트에서는 어떠한 데이터도 수집하고 있지 않기 때문에 PrivacyInfo만 생성하면 될 줄 알았다. 하지만 Privacy Report PDF 파일을 확인해보면 에러 문서가 표시된다.
이에 대해 알아본 결과 기본적으로 포함되어야 할 내용이 꼭 추가되어야 한다는 댓글을 보았다. 다시 PrivacyInfo로 가서 + 버튼을 누르면 다음과 같이 4개의 목록이 표시된다. 이 4개는 꼭 추가해야 에러가 안 뜬다고 한다. 모두 클릭해서 추가해주자.
여기서 Source Code로 보고 싶다면 다음과 같이 Open As에서 Source Code를 선택하면 된다.
근데 추가만 하면 될 줄 알았는데 여전히 빛리젝 당했다. 다시 구글링 해봤더니 ReactiveX 저장소의 PR에 해결 방법이 적힌 글을 볼 수 있었다.
여기서 System boot time APIs - 35F9.1을 추가해야 한다고 설명한다. 그래서 해당 속성을 추가했고 소스코드는 다음과 같다.
<?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> <key>NSPrivacyTracking</key> <false/> <key>NSPrivacyTrackingDomains</key> <array/> <key>NSPrivacyCollectedDataTypes</key> <array> <dict> <key>NSPrivacyCollectedDataType</key> <string></string> <key>NSPrivacyCollectedDataTypeLinked</key> <false/> <key>NSPrivacyCollectedDataTypeTracking</key> <false/> <key>NSPrivacyCollectedDataTypePurposes</key> <array> <string></string> </array> </dict> </array> <key>NSPrivacyAccessedAPITypes</key> <array> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategorySystemBootTime</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>35F9.1</string> </array> </dict> </array> </dict> </plist>
Swift
복사
이렇게 하니 문제가 해결되었다.