关于 App Store 提交的隐私更新

2024 年 2 月 29 日

开发者应对自己 App 中包含的所有代码负责。在 WWDC23 上,我们宣布了针对常用第三方 SDK 的新隐私清单和签名,并宣布开发者将需要在其 App 的隐私清单中声明使用一组 API 的批准原因 (英文)。这些变更有助于开发者更好地了解第三方 SDK 如何使用数据、保护软件依赖项并为用户提供额外的隐私保护。

自 3 月 13 日起如果你上传新 App 或更新 App 到 App Store Connect,且该 App 使用了需要声明批准原因的 API,但你未在 App 的隐私清单中提供批准原因,我们会通过电子邮件告知你。这是对 App Store Connect 中现有通知的补充。

自 5 月 1 日起你需要就你的 App 代码使用的所列 API 提供批准原因,才能将新 App 或更新 App 上传到 App Store Connect。如果你没有合理的原因使用某个 API,请寻找替代的方案。如果你添加了常用第三方 SDK 列表中所列的新版第三方 SDK,那么这些 API、隐私清单和签名要求将应用于该 SDK。请务必使用包含其隐私清单的 SDK 版本,并注意在将该 SDK 添加为二进制依赖项时也需要提供签名。

此功能对于所有 App 来说都是一大进步,我们鼓励所有 SDK 采用这项功能,以更好地支持依赖于相应 SDK 的 App。

首先Xcode自动检测第三方SDK,Xcode打包会把隐私清单和隐私配置文件捆绑在包内,在上传到App Store Connect后,如果有Xcode汇报的隐私清单但是你没有配置隐私文件,4月底之前邮件提醒告知(并把所有用到的sdk都会反应在邮件中),5月1日起如果检测到有使用sdk但未提供隐私配置文件的,根据官方文档描述会无法上传App Store Connect,也就是没法提交并审核新版本。

配置隐私清单文件

1.新建隐私配置的plist文件
Xcode 15 中 Command + N 新建文件
搜索 .xcprivacy
选择 App Privacy 文件类型
下一步
创建文件默认名字为 PrivacyInfo.xcprivacy 是个plist格式的文件
2.文件配置
在 App Privavy Configigutation (字典类型) 后面点击加号
选择 Privacy Accessed API Types 的 Key 添加(数组类型)
数组中创建一个 Item,点击右边➕,会看到两个选项:(
两个选项都要添加
Privacy Accessed API Type:用到的 API 类型(选择用到的第三方的名字,比如:User Defaults)
Privacy Accessed API Reasons:使用这个 API 的原因(是个数组,因为可能包含多个原因,选择对应的原因即可,多个原因就逐个添加Item,并选择原因即可)

这样就配置好了一条第三方的隐私

有多个第三方被列出就在Privacy Accessed API Types中添加多个Item即可(Xcode会自动检测,所以有多少选项就添加多少个Item)



Describing use of required reason API | Apple Developer Documentation

(以下为官方配置API文档的译文,包含原因的翻译,可供参考)

描述所需原因 API 的使用

您的应用用于提供其核心功能的某些 API(以您编写的代码或包含在第三方 SDK 中)可能会被滥用来访问设备信号以尝试识别设备或用户,也称为指纹识别。无论用户是否授予您的应用跟踪权限,都不允许指纹识别。描述 iOS、iPadOS、Apple tvOS、visionOS 或 watchOS 上的 App 或第三方 SDK 使用这些 API 的原因,并检查您的 App 或第三方 SDK 是否仅出于预期原因使用这些 API。

重要

如果你将 App 上传到 App Store Connect,而该 App 使用了必需的原因 API,但未在其隐私清单文件中说明原因,Apple 会向你发送一封电子邮件,提醒你将原因添加到该 App 的隐私清单中。自 2024 年 5 月 1 日起,App Store Connect 将不接受未在其隐私清单文件中说明其使用所需原因 API 的 App。

对于应用或第三方 SDK 使用的每个必需原因 API 类别,请向应用或第三方 SDK 的隐私清单文件中的数组添加一个字典,以报告应用使用 API 类别的原因。如果您在应用代码中使用了该 API,则需要在应用的隐私清单文件中报告该 API。如果您在第三方 SDK 的代码中使用了该 API,则需要在第三方 SDK 的隐私清单文件中报告该 API。第三方 SDK 不能依赖链接第三方 SDK 的应用的隐私清单文件,也不能依赖应用链接的其他第三方 SDK 的隐私清单文件来报告第三方 SDK 使用所需原因 API。NSPrivacyAccessedAPITypes

对于应用中使用所需原因 API 的每个可执行文件或动态库,包含可执行文件或动态库的捆绑包需要包含报告 API 的隐私清单文件。有关框架和动态库的预期位置,请参阅将内容放置在捆绑包中

重要

您的应用或第三方 SDK 必须声明一个或多个已批准的原因,以准确反映您对这些 API 的使用情况以及从这些 API 的使用中获得的数据。您只能出于声明的原因使用这些 API 以及从其使用中获得的数据。这些声明的原因必须与向用户展示的应用功能一致,并且您不得使用 API 或派生数据进行跟踪。

数组中的每个字典都需要包含以下键和值:NSPrivacyAccessedAPITypes

NSPrivacyAccessedAPIType

一个字符串,用于标识应用使用的所需原因 API 的类别。您提供的值必须是以下各节中列出的值之一。

NSPrivacyAccessedAPITypeReasons

一个字符串数组,用于标识应用使用 API 的原因。您提供的值必须是与以下部分中访问的 API 类型关联的值。

以下部分介绍了所需原因 API 的类别、每个类别中的 API 以及可以包含在隐私清单中的原因。

注意

Apple 会不断审核所需原因 API 和使用原因列表,并将不时更新本文。如果您的应用使用必需的原因 API 为使用该应用的用户提供权益,则出于此处未列出的原因,请针对新的已批准原因提交请求

有关创建隐私清单文件的详细信息,请参阅创建隐私清单

文件时间戳 API

以下用于访问文件时间戳的 API 需要使用原因。使用字符串作为字典中键的值。NSPrivacyAccessedAPICategoryFileTimestampNSPrivacyAccessedAPITypeNSPrivacyAccessedAPITypes

In your array, supply the relevant values from this list.NSPrivacyAccessedAPITypeReasons

DDA9.1

Declare this reason to display file timestamps to the person using the device.

Information accessed for this reason, or any derived information, may not be sent off-device.

C617.1

Declare this reason to access the timestamps, size, or other metadata of files inside the app container, app group container, or the app’s CloudKit container.

3B52.1

Declare this reason to access the timestamps, size, or other metadata of files or directories that the user specifically granted access to, such as using a document picker view controller.

0A2A.1

Declare this reason if your third-party SDK is providing a wrapper function around file timestamp API(s) for the app to use, and you only access the file timestamp APIs when the app calls your wrapper function. This reason may only be declared by third-party SDKs. This reason may not be declared if your third-party SDK was created primarily to wrap required reason API(s).

Information accessed for this reason, or any derived information, may not be used for your third-party SDK’s own purposes or sent off-device by your third-party SDK.

系统启动时间 API

以下用于访问系统启动时间的 API 需要使用原因。使用字符串作为字典中键的值。NSPrivacyAccessedAPICategorySystemBootTimeNSPrivacyAccessedAPITypeNSPrivacyAccessedAPITypes

在数组中,提供下面列表中的相关值。NSPrivacyAccessedAPITypeReasons

35F9.1

声明此原因以访问系统启动时间,以便测量应用中发生的事件之间经过的时间量,或执行计算以启用计时器。

因此原因访问的信息或任何派生信息不得在设备外发送。有关应用内发生的事件之间经过的时间量的信息有一个例外,这些事件可能会在设备外发送。

8FFB.1

声明此原因以访问系统启动时间,以计算应用中发生的事件的绝对时间戳,例如与 UIKit 或 AVFAudio 框架相关的事件。

应用中发生的事件的绝对时间戳可能会在设备外发送。由于此原因访问的系统启动时间或从系统启动时间派生的任何其他信息可能不会在设备外发送。

3D61.1

声明此原因,以便在使用设备的人员选择提交的可选错误报告中包含系统启动时间信息。系统启动时间信息必须作为报告的一部分突出显示给该人员。

只有在用户明确选择提交特定的错误报告(包括系统启动时间信息)后,才能将出于此原因访问的信息或任何派生信息发送到设备外,并且仅用于调查或响应错误报告。

磁盘空间 API

以下用于访问可用磁盘空间的 API 需要使用原因。使用字符串作为字典中键的值。NSPrivacyAccessedAPICategoryDiskSpaceNSPrivacyAccessedAPITypeNSPrivacyAccessedAPITypes

在数组中,提供下面列表中的相关值。NSPrivacyAccessedAPITypeReasons

85F4.1

声明此原因以向设备使用者显示磁盘空间信息。磁盘空间可以以信息单位(如字节)或与媒体类型(如高清视频分钟数)相结合的时间单位显示。

因此原因访问的信息或任何派生信息不得在设备外发送。有一个例外,允许应用程序通过本地网络将磁盘空间信息发送到由同一人操作的另一台设备,仅用于在该设备上显示磁盘空间信息;仅当用户提供了发送磁盘空间信息的显式权限,并且该信息不得通过 Internet 发送时,此例外才适用。

E174.1

声明此原因是为了检查是否有足够的磁盘空间来写入文件,或者检查磁盘空间是否不足,以便应用可以在磁盘空间不足时删除文件。应用必须以用户可观察到的方式根据磁盘空间以不同的方式运行。

因此原因访问的信息或任何派生信息不得在设备外发送。有一个例外,允许应用程序在磁盘空间不足时避免从服务器下载文件。

7D9E.1

声明此原因,以便在使用设备的人员选择提交的可选错误报告中包含磁盘空间信息。磁盘空间信息必须作为报告的一部分突出显示给该人员。

只有在用户明确选择提交特定的错误报告(包括磁盘空间信息)之后,才能将出于此原因访问的信息或任何派生信息发送到设备外,并且仅用于调查或响应错误报告。

B728.1

如果你的应用是健康研究应用,并且你访问此 API 类别以检测和通知研究参与者影响研究数据收集的磁盘空间不足,请声明此原因。

你的 App 必须符合 App Store 审核指南 §5.1.3。你的应用不得提供任何功能,只能提供有关健康研究的信息并允许用户参与健康研究。

活动键盘 API

以下用于访问活动键盘列表的 API 需要使用原因。使用字符串作为字典中键的值。NSPrivacyAccessedAPICategoryActiveKeyboardsNSPrivacyAccessedAPITypeNSPrivacyAccessedAPITypes

在数组中,提供下面列表中的相关值。NSPrivacyAccessedAPITypeReasons

3EC4.1

如果你的应用是自定义键盘应用,并且你访问此 API 类别以确定设备上处于活动状态的键盘,请声明此原因。

向用户提供系统范围的自定义键盘必须是应用的主要功能。

因此原因访问的信息或任何派生信息不得在设备外发送。

54BD.1

声明此原因以访问活动键盘信息,以便向使用设备的人员提供正确的自定义用户界面。应用必须具有用于输入或编辑文本的文本字段,并且必须以用户可观察到的方式根据活动键盘以不同的方式执行不同的行为。

因此原因访问的信息或任何派生信息不得在设备外发送。

用户默认 API

以下用于访问用户默认值的 API 需要使用原因。使用字符串作为字典中键的值。NSPrivacyAccessedAPICategoryUserDefaultsNSPrivacyAccessedAPITypeNSPrivacyAccessedAPITypes

在数组中,提供下面列表中的相关值。NSPrivacyAccessedAPITypeReasons

CA92.1

声明此原因以访问用户默认为读取和写入只能由应用本身访问的信息。

此原因不允许读取由其他应用或系统写入的信息,或写入可由其他应用访问的信息。

1C8F.1

声明此访问用户默认原因,以读取和写入仅对与应用本身属于同一应用组的应用、应用扩展和轻 App 访问的信息。

此原因不允许读取由同一 App 组或系统之外的 App、App 扩展程序或轻 App 编写的信息。如果系统提供来自全局域的信息,因为当您的 App 尝试读取 App、App 扩展程序或 App 组中的 App 组中的 App 或轻 App 写入的信息时,您请求的域中不存在密钥,则您的 App 概不负责。

此原因也不允许写入可由同一 App 组之外的 App、App 扩展程序或轻 App 访问的信息。

C56D.1

如果您的第三方 SDK 围绕用户默认 API 提供包装函数供应用使用,并且您仅在应用调用包装器函数时访问用户默认 API,请声明此原因。此原因只能由第三方 SDK 声明。如果您的第三方 SDK 主要是为了包装所需的原因 API,则可能不会声明此原因。

因此而访问的信息或任何派生信息不得用于第三方 SDK 自身目的,也不得由第三方 SDK 在设备外发送。

AC6B.1

声明此原因以访问用户默认值,以读取密钥以检索 MDM 设置的托管 App 配置,或设置密钥以存储要通过 MDM 查询的反馈信息,如 Apple 移动设备管理协议参考文稿中所述。com.apple.configuration.managedcom.apple.feedback.managed

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐