다음을 통해 공유


Apple 개인 정보 매니페스트

Apple에는 앱 스토어에서 iOS를 대상으로 하는 앱에 대한 개인 정보 취급 방침이 있습니다. 앱은 앱 번들에 개인 정보 매니페스트를 포함해야 하며, .NET MAUI 앱 또는 타사 SDK 및 패키지가 수집하는 데이터 형식과 필요한 이유 API를 사용하는 이유를 나열해야 합니다. 필요한 이유 API 또는 타사 SDK의 사용이 개인 정보 매니페스트에 선언되지 않은 경우 앱 스토어에서 앱을 거부할 수 있습니다. 개인 정보 매니페스트에 대한 자세한 내용은 developer.apple.com 개인 정보 매니페스트 파일을 참조하세요.

.NET MAUI를 사용하여 앱을 개발하는지 또는 .NET MAUI 앱과 함께 사용할 바인딩 패키지를 제공하는지에 따라 개인 정보 매니페스트를 제공하기 위한 요구 사항이 다를 수 있습니다.

.NET MAUI 앱에 대한 개인 정보 매니페스트

iOS 또는 iPadOS를 실행하는 디바이스를 대상으로 하는 모든 .NET MAUI 앱은 앱 번들에 개인 정보 매니페스트가 필요합니다. 자세한 내용은 개인 정보 매니페스트에 필요한 항목 추가를 참조하세요.

또한 사용자 고유의 코드, 네이티브 코드, 데이터 수집 및 추적 사례를 검토하고 그에 따라 개인 정보 매니페스트를 업데이트해야 합니다.

  • 앱 또는 SDK가 앱을 사용하는 사용자에 대한 데이터를 수집하는 경우 개인 정보 매니페스트에서 데이터 사용을 설명해야 합니다. 자세한 내용은 developer.apple.com 개인 정보 매니페스트의 데이터 사용 설명을 참조하세요.
  • 앱 또는 SDK에 Apple의 필수 이유 API를 호출하는 .NET API가 포함된 경우 이러한 각 API의 사용을 평가하고 사용 이유를 선언해야 합니다. 필요한 이유 API 에 대한 자세한 내용은 developer.apple.com 필요한 이유 API 의 사용 설명을 참조하세요.

참고 항목

앱에 타사 SDK 또는 패키지가 포함된 경우 이러한 타사 구성 요소에는 고유한 개인 정보 매니페스트가 별도로 포함되어야 합니다.

개인 정보 매니페스트는 .NET CLI 또는 Visual Studio를 사용하여 만든 새 .NET MAUI 앱 프로젝트에 자동으로 추가됩니다. 기존 .NET MAUI 앱에 개인 정보 매니페스트를 추가하는 방법에 대한 자세한 내용은 기존 앱에 개인 정보 매니페스트 추가를 참조 하세요.

Important

위의 지침은 편의를 위해 제공됩니다. 프로젝트에 대한 개인 정보 매니페스트를 만들기 전에 개인 정보 매니페스트 파일에 대한 Apple의 설명서를 검토하는 것이 중요합니다.

바인딩 프로젝트에 대한 개인 정보 매니페스트

바인딩 프로젝트는 정적 프레임워크 바인딩과 동적 프레임워크 바인딩의 두 가지 범주로 구분됩니다. 개인 정보 매니페스트는 프레임워크 번들에 배치하여 프레임워크에 포함되어야 합니다. 올바르게 배치되면 앱 개발자가 프레임워크 API 사용 이유를 제공할 필요가 없도록 바인딩 프로젝트가 앱 번들에 자동으로 추가됩니다. 자세한 내용은 번들에 콘텐츠 배치를 참조 하세요.

동적 프레임워크의 경우 프레임워크가 앱 번들에 추가됩니다. 개인 정보 취급 방침 매니페스트는 앱 스토어가 예상하는 위치에 추가되며 앱 개발자가 수행할 작업은 없습니다.

현재 정적 프레임워크를 바인딩할 때 앱 개발자는 정적 프레임워크에 포함된 개인 정보 매니페스트를 앱 개인 정보 매니페스트에 수동으로 병합해야 합니다. 이는 정적 라이브러리가 기본 앱 이진 파일에 연결되어 프레임워크의 필요성을 제거하기 때문입니다.

기존 앱에 개인 정보 매니페스트 추가

기존 .NET MAUI 앱 프로젝트에 개인 정보 매니페스트를 추가하려면 앱 프로젝트의 Platforms/iOS 폴더에 PrivacyInfo.xcprivacy라는 새 XML 파일을 추가합니다. PrivacyInfo.xcprivacy 파일에 .xml 확장명이 없는지 확인합니다. 그런 다음 파일에 다음 XML을 추가합니다.

<?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/>
</plist>

그런 다음, .NET MAUI 앱 프로젝트 파일(*.csproj)을 편집하고 루트 <Project> 요소의 맨 아래에 iOS용 다음 빌드 항목을 추가합니다.

<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
    <BundleResource Include="Platforms\iOS\PrivacyInfo.xcprivacy" LogicalName="PrivacyInfo.xcprivacy" />
</ItemGroup>

이렇게 하면 개인 정보 매니페스트가 번들의 루트에 있는 iOS 앱에 패키지됩니다.

개인 정보 매니페스트에 필수 항목 추가

iOS 또는 iPadOS를 실행하는 디바이스를 대상으로 하는 모든 .NET MAUI 앱은 앱 번들에 개인 정보 매니페스트가 필요합니다. 이는 링커 모드에 관계없이 제거되지 않는 필수 이유 API를 사용하는 .NET 런타임 및 BCL(기본 클래스 라이브러리)때문입니다. 다음 표에는 .NET MAUI 앱의 개인 정보 매니페스트에 있어야 하는 세 가지 API 범주 및 관련 이유가 나와 있습니다.

API 범주 원인 링크
NSPrivacyAccessedAPICategoryFileTimestamp C617.1 파일 타임스탬프 API
NSPrivacyAccessedAPICategorySystemBootTime 35F9.1 시스템 부팅 시간 API
NSPrivacyAccessedAPICategoryDiskSpace E174.1 디스크 공간 API

기존 .NET MAUI 앱에 개인 정보 매니페스트를 수동으로 추가한 경우 이러한 항목을 추가해야 합니다. 이렇게 하려면 텍스트 편집기에서 PrivacyInfo.xcprivacy 파일을 열고 키를 추가 NSPrivacyAccessAPITypes 합니다. 여기서 필요한 각 API 범주 사용 이유가 나중에 추가됩니다.

<?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>NSPrivacyAccessedAPITypes</key>
    <array>
    </array>
</dict>
</plist>

그런 다음 이유, NSPrivacyAccessedAPICategorySystemBootTime 이유가 C617.1있는 범주 및 NSPrivacyAccessedAPICategoryDiskSpace 이유가 E174.135F9.1있는 범주를 개인 정보 매니페스트의 NSPrivacyAccessedAPITypes 배열에 추가 NSPrivacyAccessedAPICategoryFileTimestamp 합니다.

<?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>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategorySystemBootTime</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>35F9.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>E174.1</string>
            </array>
        </dict>       
    </array>
</dict>
</plist>

이러한 항목은 앱에 필요한 최소 항목입니다. 제공된 이유 코드에서 다루지 않는 방식으로 필요한 이유 API를 사용하는 경우 API 사용을 지원하기 위해 추가 이유 코드를 추가해야 합니다. 추가 이유 코드가 필요할 수 있는 .NET 런타임, .NET BCL(기본 클래스 라이브러리), iOS용 .NET 및 .NET MAUI의 API 사용에 대한 자세한 내용은 참고 섹션의 링크를 참조 하세요.

.NET MAUI 앱이 기본 설정 API를 사용하거나 API를 NSUserDefaults 직접 사용하는 경우 개인 정보 매니페스트에 사용 이유를 포함해야 합니다. 문자열 NSPrivacyAccessedAPICategoryUserDefaults 을 사전의 NSPrivacyAccessedAPITypeNSPrivacyAccessedAPITypes 값으로 사용합니다. 예를 들어 앱 또는 SDK가 .NET MAUI의 기본 설정 API를 통해 API를 직접 또는 간접적으로 사용하는 NSUserDefaults 경우 PrivacyInfo.xcprivacy 파일에 키 배열에 추가 dict 요소가 NSPrivacyAccessedAPITypes 포함되어야 합니다.

<?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>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategorySystemBootTime</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>35F9.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>E174.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

developer.apple.com 사용자 기본 API에서 하나 이상의 이유 코드를 제공해야 합니다. 올바른 사용을 나타내기 위해 아래 이유 코드를 하나 이상 추가합니다.

  • CA92.1 - 앱에서만 사용자 기본값에 액세스합니다.
  • 1C8F.1 - 동일한 앱 그룹의 구성원인 앱, 앱 확장 및 앱 클립에서 사용자 기본값에 액세스합니다.
  • C56D.1 - SDK에서 사용자 기본값에 액세스합니다.
  • AC6B.1 - 사용자 기본값에 액세스하려면 com.apple.configuration.managed 또는 com.apple.feedback.managed 키를 읽습니다.

Important

앱에서 코드를 수정하는 경우 앱의 PrivacyInfo.xcprivacy 파일을 업데이트해야 할 수 있습니다. 여기에는 Apple의 필수 이유 API를 호출하는 NuGet 패키지 또는 바인딩 프로젝트를 앱에 추가하는 작업이 포함됩니다.

참고 항목

다음 링크를 사용하여 API가 .NET MAUI, iOS용 .NET 및 .NET 런타임 및 BCL에서 사용하는 필수 이유를 자세히 알아봅니다.