If you upload an app to App Store Connect that uses required reason API without describing the reason in its privacy manifest file, Apple sends you an email reminding you to add the reason to the app’s privacy manifest. Starting May 1, 2024, apps that don’t describe their use of required reason API in their privacy manifest file aren’t accepted by App Store Connect.
如果你上传到app Store Connect的应用程序使用了必要的原因API,而没有在其隐私清单文件中描述原因,苹果会向你发送电子邮件,提醒你将原因添加到应用程序的隐私清单中。从2024年5月1日开始,未在其隐私清单文件中描述其使用所需原因API的应用程序将不被App Store Connect接受。
提醒邮件截图:
解决步骤
- 第三方SDK,根据苹果列出的需要添加隐私清单的三方SDK,查看项目中使用了哪些SDK,逐一适配
- 主工程新增隐私清单文件,排查使用的API,配置隐私清单文件
一、第三方 SDK
- 苹果官方列出的需要隐私清单和签名的 SDK,大部分SDK目前作者都添加了Privacy,只需要更新一下SDK就可以啦。
- 若SDK作者没有维护了,就自己往SDK中添加隐私清单,或者将SDK以手动导入的方式,与主工程共用隐私清单文件
前往查看苹果官方列出的需要添加隐私清单文件的三方SDK
二、项目新增隐私清单文件
2.1 创建privacy文件
创建PrivacyInfo.xcprivacy
选中当前的项目,Command + N,搜索privacy -> 选择App Privacy,输入名称PrivacyInfo.xcprivacy,如下图,选择要添加的Target,然后点击完成。
官方文档创建步骤
PrivacyInfo.xcprivacy文件放置位置
- 这个没有明确要求,一般是放在Resources目录下
PrivacyInfo.xcprivacy文件
key | 说明 |
---|---|
Privacy Nutrition Label Types | 隐私营养标签,添加的内容会在打包后生成的PDF中 |
Privacy Accessed API Types | 使用的隐私API及原因 describing_use_of_required_reason_api |
Privacy Tracking Enabled | 布尔值,指示您的应用程序或第三方SDK是否使用应用程序跟踪透明度框架下定义的数据进行跟踪。user-privacy-and-data-use |
Privacy Tracking Domains | 一组字符串,列出您的应用程序或第三方SDK连接到的参与跟踪的互联网域。如果用户未通过应用程序跟踪透明度框架授予跟踪权限,则对这些域的网络请求将失败,您的应用程序将收到错误. 如果将NSPrivacyTracking设置为true,则需要在NSPrivaceTrackingDomains中至少提供一个internet域;否则,您可以提供零个或多个域。 |
2.2 如何填写privacy文件
Privacy Nutrition Label Types
- 你正在收集的数据类型
- 是否与用户身份相关联
- 是用于应用或SDK进行追踪
- 以及你收集数据的原因
按照这个来填写
Privacy Accessed API Types
访问的API类型
- 按照自身App 使用的API 对照添加
如何定位项目使用的API类型
根据上传App Store 收到的苹果提醒邮件,然后在苹果官方API文档去搜索选择填写的类型
苹果文档列出的访问API类型
Describing use of required reason API
File timestamp APIs
以下用于访问文件时间戳的API需要使用原因。使用stringNSPrivacyAccessed作为NSPrivacy字典中NSPrivacy键的值。
creationDate
modificationDate
fileModificationDate
contentModificationDateKey
creationDateKey
getattrlist(_:_:_:_:_:)
getattrlistbulk(_:_:_:_:_:)
fgetattrlist(_:_:_:_:_:)
stat
fstat(_:_:)
fstatat(_:_:_:_:)
lstat(_:_:)
getattrlistat(_:_:_:_:_:_:)
在您的NSPrivacy数组中,提供此列表中的相关值。
- DDA9.1
声明此原因,向使用设备的人显示文件时间戳。
出于这个原因访问的信息或任何衍生信息不得从设备外发送。 - C617.1
声明此原因以访问应用程序容器、应用程序组容器或应用程序的CloudKit容器内文件的时间戳、大小或其他元数据。 - 3B52.1
声明此原因以访问用户特别授予访问权限的文件或目录的时间戳、大小或其他元数据,例如使用文档选择器视图控制器。 - 0A2A.1
如果您的第三方SDK正在围绕文件时间戳API提供包装函数供应用程序使用,并且您仅在应用程序调用包装函数时访问文件时间戳API,请声明此原因。这个原因只能由第三方SDK声明。如果您的第三方SDK主要是为了包装所需的原因API而创建的,则可能不会声明此原因。
出于这个原因访问的信息或任何衍生信息不得用于您的第三方SDK自身目的,也不得由您的第三方SDK从设备外发送。
System boot time APIs
以下用于访问系统启动时间的 API 需要使用理由。使用该字符串作为字典中键的值。
- systemUptime
- mach_absolute_time()
在您的数组中,提供下面列表中的相关值。NSPrivacyAccessedAPITypeReasons - 35F9.1
声明此原因以访问系统启动时间,以便测量应用程序内发生的事件之间经过的时间量或执行计算以启用计时器。
出于此原因访问的信息或任何派生信息可能不会发送到设备外。有关应用程序内发生的事件之间经过的时间量的信息有一个例外,该信息可能会发送到设备外。 - 8FFB.1
声明此原因以访问系统启动时间,以计算应用程序内发生的事件的绝对时间戳,例如与UIKit或AVFAudio框架相关的事件。
您的应用内发生的事件的绝对时间戳可能会发送到设备外。出于此原因访问的系统启动时间或从系统启动时间派生的任何其他信息可能不会发送到设备外。 - 3D61.1
声明此原因以在使用设备的人选择提交的可选错误报告中包含系统启动时间信息。系统启动时间信息必须作为报告的一部分显着地向人员显示。
仅在用户肯定选择提交包括系统启动时间信息的特定错误报告之后,并且仅出于调查或响应错误报告的目的,才可以将出于此原因访问的信息或任何派生信息发送到设备外。
Disk space APIs
以下用于访问可用磁盘空间的 API 需要使用原因。使用该字符串作为字典中键的值。
- volumeAvailableCapacityKey
- volumeAvailableCapacityForImportantUsageKey
- volumeAvailableCapacityForOpportunisticUsageKey
- volumeTotalCapacityKey
- systemFreeSize
- systemSize
- statfs(_:_:)
- statvfs(_:_:)
- fstatfs(_:_:)
- fstatvfs(_:_:)
- getattrlist(_:_:_:_:_:)
- fgetattrlist(_:_:_:_:_:)
- getattrlistat(_:_:_:_:_:_:)
在您的数组中,提供下面列表中的相关值。NSPrivacyAccessedAPITypeReasons
- 85F4.1
声明此原因以向使用该设备的人员显示磁盘空间信息。磁盘空间可以以信息单位(例如字节)或与媒体类型结合的时间单位(例如高清视频的分钟)来显示。
出于此原因访问的信息或任何派生信息可能不会发送到设备外。有一个例外,允许应用程序通过本地网络将磁盘空间信息发送到同一个人操作的另一台设备,仅用于显示该设备上的磁盘空间信息;此例外仅适用于用户明确允许发送磁盘空间信息的情况,并且该信息不得通过 Internet 发送。 - E174.1
声明此原因是为了检查是否有足够的磁盘空间来写入文件,或者检查磁盘空间是否不足,以便应用程序可以在磁盘空间不足时删除文件。应用程序必须根据磁盘空间以用户可观察到的方式表现不同。
出于此原因访问的信息或任何派生信息可能不会发送到设备外。有一个例外,允许应用程序在磁盘空间不足时避免从服务器下载文件。 - 7D9E.1
声明此原因以在使用设备的人员选择提交的可选错误报告中包含磁盘空间信息。磁盘空间信息必须作为报告的一部分突出地显示给相关人员。
仅在用户明确选择提交包括磁盘空间信息的特定错误报告之后,并且仅出于调查或响应错误报告的目的,因此访问的信息或任何派生信息才可以发送到设备外。 - B728.1
如果您的应用程序是健康研究应用程序,并且您访问此 API 类别来检测并通知研究参与者磁盘空间不足影响研究数据收集,请声明此原因。
您的应用程序必须符合应用程序商店审核指南§5.1.3。除了提供有关健康研究的信息并允许人们参与健康研究之外,您的应用程序不得提供任何其他功能。
Active keyboard APIs
以下用于访问活动键盘列表的 API 需要使用原因。使用该字符串作为字典中键的值。
- activeInputModes
在您的数组中,提供下面列表中的相关值。NSPrivacyAccessedAPITypeReasons - 3EC4.1
如果您的应用程序是自定义键盘应用程序,并且您访问此 API 类别以确定设备上处于活动状态的键盘,请声明此原因。
为用户提供系统范围的自定义键盘必须是应用程序的主要功能。
出于此原因访问的信息或任何派生信息可能不会发送到设备外。 - 54BD.1
声明此原因以访问活动键盘信息,以便向使用该设备的人员呈现正确的自定义用户界面。应用程序必须具有用于输入或编辑文本的文本字段,并且必须以用户可观察到的方式根据活动键盘采取不同的行为。
出于此原因访问的信息或任何派生信息可能不会发送到设备外。
User defaults APIs
以下用于访问用户默认值的 API 需要使用原因。使用该字符串作为字典中键的值。
- UserDefaults
在您的数组中,提供下面列表中的相关值。NSPrivacyAccessedAPITypeReasons - CA92.1
声明此原因以访问用户默认读取和写入只能由应用程序本身访问的信息。
此原因不允许读取其他应用程序或系统写入的信息,或写入可由其他应用程序访问的信息。 - 1C8F.1
声明此原因以访问用户默认值以读取和写入仅可由与应用程序本身属于同一应用程序组的成员的应用程序、应用程序扩展和应用程序剪辑访问的信息。
此原因不允许读取由同一应用程序组外部的应用程序、应用程序扩展或应用程序剪辑或系统写入的信息。如果系统提供来自全局域的信息,则您的应用程序不承担责任,因为当您的应用程序尝试读取应用程序的应用程序组中的应用程序、应用程序扩展或应用程序剪辑写入的信息时,您请求的域中不存在密钥。
此原因也不允许写入可由同一应用程序组外部的应用程序、应用程序扩展或应用程序剪辑访问的信息。 - C56D.1
如果您的第三方 SDK 围绕用户默认 API 提供包装函数供应用程序使用,并且您仅在应用程序调用您的包装函数时才访问用户默认 API,请声明此原因。此原因只能由第三方 SDK 声明。如果您的第三方 SDK 主要是为了包装所需的原因 API 而创建的,则可能不会声明此原因。
出于此原因访问的信息或任何派生信息不得用于第三方 SDK 自身的目的,也不得由第三方 SDK 发送至设备外。 - AC6B.1
声明此原因以访问用户默认读取密钥以检索 MDM 设置的托管应用程序配置,或设置密钥以存储要通过 MDM 查询的反馈信息,如 Apple 移动设备管理协议参考文档中所述。
Privacy Tracking Enabled
你必须声明你的应用(或其中使用的第三方SDK)是否使用应用追踪透明度框架定义的数据进行追踪。如果是,则必须将 NSPrivacyTracking 设置为 true。
苹果将追踪定义为将你收集的数据与其他公司收集的其他用户或设备数据相关联。
定义如下:
追踪是指将从你的应用程序收集的用户或设备数据与从其他公司的应用程序、网站或离线资产收集的用户或设备数据相关联的行为,用于有针对性的广告或广告测量目的。追踪还指与数据代理共享用户或设备数据。 苹果提供了以下追踪示例:
- 广告的行为定位
- 与数据代理共享位置或电子邮件
- 创建和共享受众
- 设备图形生成
苹果提供了一些不被视为追踪的数据收集示例: - 数据保留在设备上
- 仅用于欺诈检测/安全的数据
- 用于信用评分的数据 据推测,还有更多类型的数据收集未被定义为追踪,只要你不将应用或SDK收集的数据与其他公司的数据相关联,或者不将你的数据出售给数据代理。
Privacy Tracking Domains
首先列出要通过 NSPrivacyTrackingDomains 数组向其发送数据的域。这只是你的应用或SDK连接到的网址列表,有助于追踪。
重点:
如果你连接到追踪域,但用户尚未通过应用追踪透明度授予追踪权限,苹果将阻止对这些网址的任何调用。
如果用户未通过应用追踪透明度框架授予追踪权限,则对这些域的网络请求将失败,并且你的应用会收到错误。
由于在这里填的这些域,如果用户没有授权,那么这个域的网络请求将失败,稳妥起见这里先不填写域,先这样处理 提审看看情况了来。
总结
按照上面的步骤处理后,我上传appStore 提审,现在没有收到苹果关于隐私清单的提醒邮件了,暂时就先这样配置,不知道大家是怎么填写 Privacy Tracking Enabled 和 Privacy Tracking Domains 这两个类型的呢?
感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!