본문 바로가기
iOS, Swift 개발

App Store 심사 제출시 이슈 요청 사항 Missing API declaration

by Nin J 2024. 4. 5.

오랜만에 애플 심사를 요청했는데

메일로 특별한 이슈가 요청이 돼서 

상세하게 확인해 보겠다. (2024 5월 1일까지 이 이슈사항을 제공하여야 한다.)

ITMS-91053: Missing API declaration - Your app’s code in the “K_swift” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryUserDefaults. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. 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-91053: Missing API declaration - Your app’s code in the “K_swift” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryDiskSpace. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. 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-91053: Missing API declaration - Your app’s code in the “K_swift” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryFileTimestamp. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. 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.

Apple Developer Relations

요구사항 3가지 PrivacyAccessedAPI를 명시 하면.

  • NSPrivacyAccessedAPICategoryUserDefaults.(사용자 기본값에 접근)
  • NSPrivacyAccessedAPICategoryDiskSpace.(사용 가능한 디스크 공간에 접근)
  • NSPrivacyAccessedAPICategoryFileTimestamp.(파일 타임스탬프에 접근)

 

요구사항 3가지에 대한 이유 리스트 정렬해보면

-영문

  • 35F9.1: Measure time on-device, per documentation
  • 3B52.1: Files provided to app by user, per documentation
  • 3EC4.1: Custom keyboard app on-device, per documentation
  • 54BD.1: Customize Ul on-device, per documentation
  • 85F4.1: Display to user on-device, per documentation
  • C617.1: Inside app or group container, per documentation
  • CA92.1: Access info from same app, per documentation
  • DDA9.1: Display to user on-device, per documentation
  • E174.1: Write or delete file on-device, per documentation

-한글

  • 35F9.1: 문서에 따라 장치 내 시간 측정
  • 3B52.1: 문서에 따라 사용자가 제공한 파일
  • 3EC4.1: 문서에 따라 장치에 사용자 지정 키보드 앱
  • 54BD.1: 문서에 따라 장치에서 UI 사용자 정의
  • 85F4.1: 문서에 따라 장치에 사용자에게 표시
  • C617.1: 문서에 따라 앱 내 또는 그룹 컨테이너 내부
  • CA92.1: 문서에 따라 동일한 앱에서 정보에 액세스
  • DDA9.1: 문서에 따라 장치에 사용자에게 표시
  • E174.1: 문서에 따라 장치에 파일 작성 또는 삭제

 

1. NSPrivacyAccessedAPICategoryUserDefaults -사용자 기본값에 액세스

사용자의 기본값에 접근하는 부분에서 명시하는 것으로 보이고

애플 문서에 정의된 예시로 주어진 Reson List 중 이 중에서 하나를 Xcode에서  선택해서  진행한다. 

CA92.1- 사용자가 기본적으로 앱 자체에만 액세스 할 수 있는 정보를 읽고 쓰도록 액세스하기 위해 이 이유를 선언합니다.

1C8F.1 - 사용자가 기본적으로 앱 자체와 동일한 앱 그룹에 속한 앱, 앱 확장 프로그램, 앱 클립에만 액세스할 수 있는 정보를 읽고 쓰도록 액세스 하는 이유를 선언합니다.

C56D.1 - 타사 SDK가 앱에서 사용할 사용자 기본 API에 대한 래퍼 함수를 ​​제공하고 앱이 래퍼 함수를 ​​호출할 때만 사용자 기본 API에 액세스하는 경우 이 이유를 선언하세요. 이 이유는 타사 SDK에서만 선언할 수 있습니다. 필수 이유 API를 래핑 하기 위해 타사 SDK가 주로 생성된 경우 이 이유가 선언되지 않을 수 있습니다.

AC6B.1 - Apple 모바일 장치 관리 프로토콜 참조 설명서에 설명된 대로 MDM에서 설정한 관리 앱 구성을 검색하기 위한 키를 읽거나 MDM을 통해 쿼리할 피드백 정보를 저장하기 위한 키를 설정하기 위해 사용자 기본 액세스에 대한 이 이유를 선언합니다.

기본값 정의 : https://developer.apple.com/documentation/foundation/userdefaults

 

UserDefaults | Apple Developer Documentation

An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.

developer.apple.com

해당 부분에서 구글 검색하는 하니 보통 CA92.1 사용하고 있다.

  • CA92.1: Access info from same app, per documentation
  • CA92.1: 문서에 따라 동일한 앱에서 정보에 액세스

 

2. NSPrivacyAccessedAPICategoryDiskSpace  -사용 가능한 디스크 공간에 접근

애플 문서에 정의된 예시로 주어진 Reson List 중 이 중에서 하나를 Xcode에서  선택해서  진행한다. 

85F4.1 - 디바이스를 사용하는 사람에게 디스크 공간 정보를 표시하기 위해 이 이유를 선언합니다. 디스크 공간은 정보 단위(예: 바이트) 또는 미디어 유형과 결합된 시간 단위(예: HD 비디오 분)로 표시될 수 있습니다.

E174.1 - 파일을 쓸 수 있는 디스크 공간이 충분한지 확인하거나, 디스크 공간이 부족할 때 앱이 파일을 삭제할 수 있도록 디스크 공간이 부족한지 확인하기 위해 이 이유를 선언합니다. 앱은 사용자가 관찰할 수 있는 방식으로 디스크 공간에 따라 다르게 작동해야 합니다.

7D9E.1 - 장치를 사용하는 사람이 제출하기로 선택한 선택적 버그 보고서에 디스크 공간 정보를 포함하려면 이 이유를 선언하세요. 디스크 공간 정보는 보고서의 일부로 사람에게 눈에 띄게 표시되어야 합니다.

B728.1 - 앱이 건강 연구 앱이고 이 API 카테고리에 액세스하여 연구 데이터 수집에 영향을 미치는 디스크 공간 부족에 대해 연구 참여자에게 감지하고 알리는 경우 이 이유를 선언하세요.

해당 부분에서 구글 검색하는 하니 보통 85F4.1 사용하고 있다.

  • 85F4.1: Display to user on-device, per documentation
  • 85F4.1: 문서에 따라 장치에 사용자에게 표시

 

3. NSPrivacyAccessedAPICategoryFileTimestamp  -파일 타임스탬프에 접근

애플 문서에 정의된 예시로 주어진 Reson List 중 이 중에서 하나를 Xcode에서  선택해서  진행한다. 

DDA9.1 - 장치를 사용하는 사람에게 파일 타임스탬프를 표시하려면 이 이유를 선언하세요. 이러한 이유로 액세스된 정보 또는 파생된 정보는 장치 외부로 전송될 수 없습니다.

C617.1 - 앱 컨테이너, 앱 그룹 컨테이너 또는 앱의 CloudKit 컨테이너 내부 파일의 타임스탬프, 크기 또는 기타 메타데이터에 액세스하려면 이 이유를 선언하세요.

3B52.1 - 문서 선택기 보기 컨트롤러를 사용하는 등 사용자가 특별히 액세스 권한을 부여한 파일이나 디렉터리의 타임스탬프, 크기 또는 기타 메타데이터에 액세스하려면 이 이유를 선언하세요.

0A2A.1- 타사 SDK가 앱에서 사용할 파일 타임스탬프 API에 대한 래퍼 함수를 ​​제공하고 앱이 래퍼 함수를 ​​호출할 때만 파일 타임스탬프 API에 액세스하는 경우 이 이유를 선언하세요. 이 이유는 타사 SDK에서만 선언할 수 있습니다. 필수 이유 API를 래핑하기 위해 타사 SDK가 주로 생성된 경우 이 이유가 선언되지 않을 수 있습니다.

해당 부분에서 구글 검색하는 하니 보통 C617.1 사용하고 있다.

  • C617.1: Inside app or group container, per documentation
  • C617.1: 문서에 따라 앱 내 또는 그룹 컨테이너 내부

 

이렇게 결정을 한 후 Xcode로 돌아가서 개발 세팅을 진행한다.

이 부분 같은 경우 기존에 Privacy 정의하는 info.plist가 아니라

신규로 Xcode - file - new - file -> App Privacy 선택 후 해당 부분을 세팅을 진행 하여야 한다.

App Privacy 선택후

Privacy Tracking Enabled 선택한 후 나의 경우에는 요구사항 3가지 PrivacyAccessedAPI 추가해야 하므로 Item0, Item1, Item2 추가한다.

그 후 PrivacyAccessedAPI Type 와 PrivacyAccessedAPI Reasons를 Item0, Item1, Item2에 각각 추가해 주고 

위에서 언급한 Type Reason를 선택해 주면 된다(콤보 리스트로 나오기 때문에 클릭 후 선택 하면 된다.)

그리면 아래와 같이 모두 완료되었다.

이 파일 포함 한 후 빌드를 하면 다음 심사 진행 시 위에 issue가 나올지 않을 것이다.

완료!