반응형

이번 포스팅은 Swift로 개발한 앱을 App Store에서 업로드하기 위해 앱을 빌드 중 발생한 오류에 대하여 알아보도록 하겠습니다. 

PLA Update 에러 화면


목차

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. 로그인을 하면 아래와 같은 화면을 만나실 수 있습니다.

Apple Developer Program 사용권 계약 동의화면

3. Account 화면에 접속하면 아래와 같이 '프로그램 사용권 계약이 업데이트되었습니다.'라는 메시지가 보이실 겁니다. 변경된 사용권 계약에 동의하기 위해 [계약 검토하기] 버튼을 클릭합니다.

프로그램 사용권 계약 검토

4. 개발자 계정에 동의하는 계약은 영문 버전이 법적 구속력이 있으므로 사용권 계약은 영문으로 표시되며 아래 [동의] 버튼을 클릭합니다.

Apple Developer Program License Agreement

5. 다시 Apple Store Connect 계정(Account)에 접속하면 프로그램 사용권 계약이 업데이트가 되어 아까와 같은 '  '프로그램 사용권 계약이 업데이트되었습니다.' 라는 메시지가 안 보이실 겁니다.

프로그램 사용권 계약이 업데이가 되서 메시지가 표시되지 않는 것이니 xCode를 재시작한 후 재 빌드해 보면 App Store에 배포하기 위한 앱을 빌드하실 수 있으실 겁니다.

 


 

#4. 마무리

앱을 빌드해서 App Store에 배포하려고 하는데 빌드 에러가 나면 많이 당황스럽습니다. 하지만 차분하게 하나 하나 내용을 찾아 문제를 해결하면 다시 똑같은 상황을 만나지 않을 뿐더러 쉽게 문제를 해결하실 수 있으실 겁니다.

오늘도 즐거운 개발이 되시길 바라며 긴 글 읽어 주셔서 감사합니다.

끝.

반응형
반응형

이번 포스팅은 App Store에 심사 요청하였으나 심사 거절을 당하였는데 거절의 원인은 아래와 같이 ITMS-91055였습니다. 따라서 원인부터 해결방법까지 한 번에 알아보도록 하겠습니다. 

 

목차

1. PrivacyInfo.xcprivacy의 정의

2. ITMS-91055: Invalid API reason declaration 원인

3. ITMS-91055: Invalid API reason declaration 해결 방법

4. 마무리

 


 

#1.PrivacyInfo.xcprivacy의 정의

에러의 원인에 대해 알아보기 전에 먼저 PrivacyInfo.xcprivacy에 대하여 알고 문제를 해결해야 하므로 PrivacyInfo.xcprivacy에 대해 알아보도록 하겠습니다.

Apple에서 공지한 게시글 '(23.12.7) App Store 앱 제출을 위한 개인정보 보호 관련 업데이트''(24.2.29) 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

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

2. Privacy Tracking Domains : 앱 및 SDK 추적을 위해 사용하는 Domain

  • 추적에 사용되는 Domain을 입력하면 됩니다 ex) tracking.domain.example

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

3. Privacy Nutrition Label Types : 수집하는 정보가 추적과 관련되어 있는 경우 상세 설명 기재

  • 보통 userId, name 등등이 추적에 포함된다면 추가하시면 될 것 같습니다.

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

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 파일을 다운로드 받아 프로젝트에 적용하였습니다.

https://wemakeapps.net/manifest-maker

 

Generate your iOS privacy manifest file

Generate the Privacy Manifest, PrivacyInfo.xcprivacy file, for your iOS app.

wemakeapps.net

 

 


 

#4. 마무리

아주 중요한 내용인데 글을 자세히 작성하면 글이 너무 길어져 최대한 쉽게 설명하려고 하였습니다. 이 PrivacyInfo의 핵심은 개인정보 보호인데 앱 내부에 있는 모든 개인정보 사용 API 즉, Firebase 및 Alamofire, Kingfisher 등 자주 사용하는 Third-Party SDK에도 사용하는 개인정보를 사용하는 이유를 모두 작성해야 한다는 것입니다. 앱 내부의 SDK의 흐름을 이해하고 최종 배포하는 것이 개발자 이므로 개발자가 이 흐름을 이해하고 Privacy.xcprivacy에 작성해야 한다는 것입니다.

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

끝.

 

 

 

Reference : https://kemikim.medium.com/2024-05-01%EC%A0%81%EC%9A%A9-appstore-privacyinfo-xcprivacy-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0-d3d23a1f5fe7

 

[2024.05.01 이후] AppStore PrivacyInfo 적용하기.

2024년 5월 1일부터 B2C앱 앱스토어 심사 시 애플의 개인정보방침에 따라, PrivacyInfo.xcprivacy 파일을 필수로 추가해야합니다.

kemikim.medium.com

Reference : https://h1guitar.tistory.com/323

 

ios 개인정보 보호 매니페스트 PrivacyInfo.xcprivacy 만들기

애플에서 공지한 게시글 (23.12.7)App Store 앱 제출을 위한 개인정보 보호 관련 업데이트와 (24.2.29)App Store 앱 제출을 위한 개인정보 보호 관련 업데이트 를 살펴보면 아래와 같은 부분이 있다. 2024년

h1guitar.tistory.com

Reference : https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api

 

Describing use of required reason API | Apple Developer Documentation

Ensure your use of covered API is consistent with policy.

developer.apple.com

 

 

 

반응형
반응형

이번 포스팅은 xCode에서 ImageView의 Content Mode에 대하여 알아보도록 하겠습니다.

목차

1. ImageView의 Content Mode

2. 마무리

 


 

#1.  ImageView의 Content Mode

ImageView에서 Image를 나타내는 Content Mode에 따라 이미지가 다르게 표시됩니다. 아래에서 배치한 Image가 어떻게 달라지는지 알아보도록 하겠습니다.

1) Scale to Fill : 기본 설정값으로, ImageView의 크기에 맞게 이미지의 가로, 세로 비율이 변경됩니다. 비율이 맞지 않으면 뭉개져 보입니다.

2) Aspect Fit : 이미지의 가로, 세로 비율은 유지하면서 ImageView의 크기에 맞게 이미지의 크기를 바꿉니다.

3) Aspect Fill : 이미지의 비율을 유지하면서 ImageView를 채웁니다. ImageView와 이미지 비율이 맞지 않으면 이미지가 넘쳐서 잘릴 수 있습니다.

4) Center : 이미지의 원본 크기를 유지한 채 이미지의 중앙을 ImageView에 출력합니다.

5) Top : 이미지의 원본 크기를 유지한 채 윗부분을 ImageView에 출력합니다.

6) Top Left : 이미지의 원본 크기를 유지한 채 이미지의 왼쪽 윗 부분을 ImageView에 출력합니다.

 


 

#2. 마무리

ImageView의 Content Mode에 대하여 알아보았습니다. xCode에서 가장 기본적인 항목이라 잘 알고 있는 내용이지만 글로 정리를 한번 해 보았으니 필요하신 분에게 도움이 되었으면 좋겠습니다.

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

끝.


 
Reference : 직접 구매한 송호정, 이범근 저자의 [Do It 스위프트로 아이폰 앱 만들기]
 

 

반응형

+ Recent posts