이번 포스팅은 Swift로 개발한 앱을 App Store에서 업로드하기 위해 앱을 빌드 중 발생한 오류에 대하여 알아보도록 하겠습니다.
목차
1. PLA의 정의
2.Unable to process request - PLA Update avaiable 원인
3.Unable to process request - PLA Update avaiable 해결 방법
4. 마무리
#1. PLA의 정의
PLA란 Program License Agreement의 약자로 Apple Developer Program 사용권 계약입니다. 'Apple의 개발자 도구 및 서비스를 사용하거나 Apple 플랫폼에서 소프트웨어를 배포하려면 사용권 계약 및 지침의 해당 약관을 준수해야 합니다.'라고 Apple Developer 페이지(https://developer.apple.com/kr/support/terms/)에 명시되어 있습니다. 따라서 Apple 개발자로서 사용권 계약의 어떠한 조항이 변경이 되었으면 변경된 내용을 확인해 보고 동의해야 소프트웨어를 배포할 수 있습니다.
#2.Unable to process request - PLA Update avaiable 원인
PLA 정의에서 말씀드린 것처럼 'Apple 플랫폼에서 소프트웨어를 배포하려면 사용권 계약 및 지침의 해당 약관을 준수해야 합니다.'라고 명시가 되었습니다. 하지만 저는 최근에 Apple Store Connect에 방문하여 어떠한 액션을 한 적이 없습니다. 따라서 이번 오류의 원인은 Apple Store Connect에서 변경된 PLA( Program License Agreement)에 동의를 하지 않았기 때문이니 사용권 계약을 검토하고 동의한 후에 앱을 App Store에 배포할 수 있습니다.
#3.Unable to process request - PLA Update avaiable 해결 방법
이번 오류의 원인을 알았으니 해결방법은 아주 간단합니다. Apple Store Connect에 접속해서 변경된 PLA를 검토하고 동의를 진행하면 됩니다. 아래 그림과 함께 따라하시면 아주 쉽습니다.1. App Store Connect(https://appstoreconnect.apple.com/login)에 접속하여 배포할 계정으로 로그인을 합니다.2. 로그인을 하면 아래와 같은 화면을 만나실 수 있습니다.
3. Account 화면에 접속하면 아래와 같이 '프로그램 사용권 계약이 업데이트되었습니다.'라는 메시지가 보이실 겁니다. 변경된 사용권 계약에 동의하기 위해 [계약 검토하기] 버튼을 클릭합니다.
4. 개발자 계정에 동의하는 계약은 영문 버전이 법적 구속력이 있으므로 사용권 계약은 영문으로 표시되며 아래 [동의] 버튼을 클릭합니다.
5. 다시 Apple Store Connect 계정(Account)에 접속하면 프로그램 사용권 계약이 업데이트가 되어 아까와 같은 ' '프로그램 사용권 계약이 업데이트되었습니다.' 라는 메시지가 안 보이실 겁니다.
프로그램 사용권 계약이 업데이가 되서 메시지가 표시되지 않는 것이니 xCode를 재시작한 후 재 빌드해 보면 App Store에 배포하기 위한 앱을 빌드하실 수 있으실 겁니다.
#4. 마무리
앱을 빌드해서 App Store에 배포하려고 하는데 빌드 에러가 나면 많이 당황스럽습니다. 하지만 차분하게 하나 하나 내용을 찾아 문제를 해결하면 다시 똑같은 상황을 만나지 않을 뿐더러 쉽게 문제를 해결하실 수 있으실 겁니다.
2024년 봄부터 App Store Connect에 새로운 앱 또는 앱 업데이트를 업로드하려면 앱의 개인정보 보호 매니페스트에 앱이 API를 사용하는 방식을 정확하게 반영하는 허용된 사유를 포함하고 있어야 합니다.
다시 말해 2024.05.01일 이후 XCFrameworks, Swift 패키지 또는 XCode 프로젝트로 배포되는 앱과 Third-Party SDK에는 PrivacyInfo.xcprivacy라는이름의 Privacy Manifest 파일이 포함되어야 합니다.
이 PrivacyInfo 파일은 마치 info.plist와 같은 Dictionary 구조의 소스코드를 Property List로 볼 수 있도록 만든 파일입니다. 다만 info.plist와 다른 점은 PrivacyInfo 내부에 정의된 값은 앱 또는 앱 내부 Third-Party SDK에 사용하고 있는 Privacy 정보들을 모두 정의해서 어떤 용도로 사용하고 있는지 나타내주는 역할을 합니다.
PrivacyInfo.xcprivacy =
앱 내부에서 개인정보를 사용하는 방식을 어떤 용도로 사용하는지 정의한 목록
PrivacyInfo.xcprivacy에 들어가는 목록에 들어가야 하는 정보는 아래의 총 4 가지입니다.
1. Privacy Tracking Enabled : 앱 및 SDK가 추적을 위해 데이터를 사용하는 지 여부
추적 사용 : YES
추적 미사용 : NO
2. Privacy Tracking Domains : 앱 및 SDK 추적을 위해 사용하는 Domain
추적에 사용되는 Domain을 입력하면 됩니다 ex) tracking.domain.example
3. Privacy Nutrition Label Types : 수집하는 정보가 추적과 관련되어 있는 경우 상세 설명 기재
보통 userId, name 등등이 추적에 포함된다면 추가하시면 될 것 같습니다.
4. Privacy Accessed API Types : 개인정보 Access 이유가 필요한 API로 지정된 앱 또는 Third-Party SDK가 Access 하는 API 유형을 설명하는 사전 배열
#2. ITMS-91055: Invalid API reason declaration 원인
PrivacyInfo.xcprivacy 파일은 앱 내부에서 개인정보를 사용하는 방식을 어떤 용도로 사용하는지 정의한 목록이라고 정의하였습니다. 정의된 내용을 토대로 에러의 원인에 접근하면 쉽게 알 수 있습니다.
에러가 발생한 아래의 에러메시지를 다시 살펴보겠습니다.
위의 PrivacyInfo.xcprivacy의 Privacy Accessed API Types의 DiskSpace, FileTimestamp 범주에서 API를 사용하기 위한 유효한 이유(Privacy Accessed API Reasons)가 기입이 되어 있지 않았습니다.
ITMS-91055: Invalid API reason declaration - The PrivacyInfo.xcprivacy for the “Frameworks/libswiftDispatch.dylib” file contains “CA92.1:Acess 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. Values for NSPrivacyAccessedAPITypeReasons keys in any privacy manifest must be valid reason codes for the corresponding API category. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit:https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.
ITMS-91055: Invalid API reason declaration- 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. Values for NSPrivacyAccessedAPITypeReasons keys in any privacy manifest must be valid reason codes for the corresponding API category. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit:https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.
#3. ITMS-91055: Invalid API reason declaration 해결 방법
원인은 Privacy Accessed API Reasons 이 기입이 되어 있지 않아서 발생하였으므로 제가 맡고 있는 앱의 성격에 맞게 아래와 항목을 정의하였습니다.
Privacy Accessed API Type
Privacy Accessed API Type :DiskSpace
Privacy Accessed API Reasons :CA92.1:Acess Info from same app, per documentation
Privacy Accessed API Type :FileTimestamp
Privacy Accessed API Reasons :C617.1:Inside app or group container, per documentaion
참고로 앱의 Privacy.xcprivacy를 손 쉽게 만들어 주는 사이트를 소개합니다. 저도 여기에서 항목을 선택 후 Privacy.xcprivacy 파일을 다운로드 받아 프로젝트에 적용하였습니다.
아주 중요한 내용인데 글을 자세히 작성하면 글이 너무 길어져 최대한 쉽게 설명하려고 하였습니다. 이 PrivacyInfo의 핵심은 개인정보 보호인데 앱 내부에 있는 모든 개인정보 사용 API 즉, Firebase 및 Alamofire, Kingfisher 등 자주 사용하는 Third-Party SDK에도 사용하는 개인정보를 사용하는 이유를 모두 작성해야 한다는 것입니다. 앱 내부의 SDK의 흐름을 이해하고 최종 배포하는 것이 개발자 이므로 개발자가 이 흐름을 이해하고 Privacy.xcprivacy에 작성해야 한다는 것입니다.