Apple 隐私清单

Apple 为 App Store 上面向 iOS 的应用制定了隐私策略。 它要求应用在应用程序包中包含隐私清单,其中列出了 .NET MAUI 应用或任何第三方 SDK 和包收集的数据类型,以及使用任何必需原因 API 的原因。 如果你使用的所需原因 API 或第三方 SDK 未在隐私清单中声明,你的应用可能会被 App Store 拒绝。 有关隐私清单的详细信息,请参阅 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 应用的信息,请参阅向现有应用添加隐私清单

重要

为方便起见,提供了上述准则。 在为项目创建隐私清单之前,请务必查看 Apple 关于隐私清单文件的文档。

绑定项目的隐私清单

绑定项目分为两类:静态框架绑定和动态框架绑定。 应通过将隐私清单应包含在框架捆绑包中,以将其包含在框架中。 正确放置时,绑定项目会自动将其添加到应用捆绑包,由此应用开发人员无需提供框架 API 使用的原因。 有关详细信息,请参阅 在捆绑包中放置内容

对于动态框架,框架将添加到应用捆绑包。 隐私策略清单将添加到 App Store 预期所在的位置,并且应用开发人员无需执行任何操作。

目前,绑定静态框架时,应用开发人员需要手动将静态框架随附的隐私清单合并到应用隐私清单中。 这是因为静态库链接到主应用二进制文件的方式消除了对框架的需求。

将隐私清单添加到现有应用

要将隐私清单添加到 .NET MAUI 应用项目,请将名为 PrivacyInfo.xcprivacy 的新 XML 文件添加到应用项目的 Platforms/iOS 文件夹中。 确保 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 应用都需要在应用程序包中包含隐私清单。 这是由于 .NET 运行时和基类库 (BCL) 使用必需原因 API,无论链接器模式如何,都不会移除这些 API。 下表显示了 .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>

然后,在隐私清单中的 NSPrivacyAccessedAPITypes 数组中添加 NSPrivacyAccessedAPICategoryFileTimestamp 类别和原因 C617.1NSPrivacyAccessedAPICategorySystemBootTime 类别和原因 35F9.1,以及 NSPrivacyAccessedAPICategoryDiskSpace 类别和原因 E174.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>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)、.NET for iOS 和 .NET MAUI 中使用 API 时可能需要其他原因代码的详细信息,请参阅另请参阅部分中的链接。

如果 .NET MAUI 应用使用首选项 API 或直接使用 NSUserDefaults API,则必须在隐私清单中包含使用原因。 使用字符串 NSPrivacyAccessedAPICategoryUserDefaults 作为 NSPrivacyAccessedAPITypes 字典中 NSPrivacyAccessedAPIType 键的值。 例如,如果应用或 SDK 通过 .NET MAUI 的首选项 API 直接或间接使用 NSUserDefaults API,则 PrivacyInfo.xcprivacy 文件应在 NSPrivacyAccessedAPITypes 键的数组中包含额外的 dict 元素

<?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 - 从属于同一应用组成员的应用、应用扩展和 App Clips 中访问用户默认值。
  • C56D.1 - 从 SDK 中访问用户默认值。
  • AC6B.1 - 访问用户默认值以读取 com.apple.configuration.managed 或 com.apple.feedback.managed 密钥。

重要

如果修改应用中的代码,可能需要更新应用的 PrivacyInfo.xcprivacy 文件。 这包括将 NuGet 包或绑定项目添加到调用任何 Apple 必需原因 API 的应用。

另请参阅

单击以下链接以详细了解 .NET MAUI、适用于 iOS 的 .NET 以及 .NET 运行时和 BCL 中的必需原因 API 用法: