背景

App Store 中新增的隐私功能

我们将在今年晚些时候发布更多信息,包括:

  • 影响隐私的 SDK 列表 (对用户隐私产生重大影响的第三方 SDK)
  • “需要指明原因”的 API 列表,使用它们时必须给出合理的原因
  • 开发者反馈表,用于就调用涉及的 API 提出新的原因
  • 其他文档,详细介绍签名和隐私清单、他们的优势以及何时需要使用它们

关于 App Store 提交的隐私更新 12-17

第三方 SDK 隐私清单和签名。 第三方软件开发工具包 (SDK) 能够为 App 提供强大的功能,同时也
能会影响用户隐私,而这些影响可能对开发者和用户来说并不明显。请注意,当你将第三方 SDK 与你的
App 搭配使用时,你需要对 App 中使用的相应 SDK 包含的所有代码负责,并且需要了解 SDK 的数据收
和使用实践。

关于 App Store 提交的隐私更新 02-29

自 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 添加为二进制依赖项时也需要提供签名。

隐私清单和SDK签名

Apple会列举必需使用的API类型和使用原因,还有常用的三方SDK。开发者要对APP和SDK使用到这些API的原因进行描述,配置到隐私清单中。对于提供二进制版本的三方SDK,需要第三方提供包含签名的SDK

配置隐私清单
涉及到的三方SDK
必需的API

隐私清单是什么

隐私清单是一个属性列表,记录您的应用程序或第三方SDK收集的数据类型,以及您的应用程序或第三方SDK使用的API所需的原因。对于您的应用程序或第三方SDK收集的每种类型的数据及其使用的API所需的原因类别,请在您的隐私清单文件中记录原因

配置隐私清单

在Xcode15中可以配置隐私清单,三方的SDK可以更新到最新版本,一些SDK会配置好了 PrivacyInfo.xcprivacy 隐私清单

image.png|500
image.png|500
SDWebImage 隐私清单示例

Key 说明
NSPrivacyTracking 布尔值,指示您的应用程序或第三方SDK是否使用应用程序跟踪透明度框架下定义的数据进行跟踪。
NSPrivacyTrackingDomains 一组字符串,列出您的应用程序或第三方SDK连接到的参与跟踪的互联网域。如果用户未通过应用程序跟踪透明度框架授予跟踪权限,则对这些域的网络请求将失败,您的应用程序将收到错误. 如果将NSPrivacyTracking设置为true,则需要在NSPrivaceTrackingDomains中至少提供一个internet域;否则,您可以提供零个或多个域。
NSPrivacyCollectedDataTypes 一组字典,用于描述应用程序或第三方SDK收集的数据类型。有关要在字典中使用的键和值的信息
NSPrivacyAccessedAPITypes 使用了苹果需要说明原因的api时需要填写

NSPrivacyTracking

注意是否使用了==AppTrackingTransparency==框架。
官方文档

NSPrivacyTrackingDomains

如果用户未通过 App Tracking Transparency (ATT) 授予权限, Apple 就会阻止对追踪域(Tracking Domains)的网络请求。

NSPrivacyCollectedDataTypes

不管有没有使用 ATT 进行跟踪,都要说明收集了哪些数据类型和原因
收集的数据内容

示例:
image.png|500

NSPrivacyAccessedAPITypes

APP需要声明使用原因的API分类 API和使用的原因

  • File timestamp APIs
  • System boot time APIs
  • Disk space APIs
  • Active keyboard APIs
  • User defaults APIs

示例:
image.png|500

SDK 签名

当你在 App 中采用第三方 SDK 的新版本时,Xcode 将验证它是否由同一开发者签名。Apple的目的就是想确保SDK不会被篡改

如果是使用cocoapod管理版本,先升级一下最新版本库,看看作者有没有对签名进行处理,如果没有就要自己签名

并不是所有的SDK都需要签名,但是Apple鼓励所有的SDK,主要看Apple提供的SDK清单

1
2
3
4
5
6
7
8
9
10
11
// 搜索指定目录下是否包含_CodeSignature签名目录
find -name -type d "_CodeSignature"

// 列出本地与代码签名相关的证书
security find-identity -v -p codesigning

// 对SDK进行签名
codesign --timestamp -v --sign "Your Certificate Name" </path/to/SDK.framework>

// 验证签名(可以看到相关签名信息)
codesign -dvvv </path/to/SDK.framework>

官网视频

image.png|500

导出隐私清单

image.png|500

相关问题

如果作者已经不维护的SDK怎么办,比如AF

理论上要自己生成清单和签名,但是重新pod后又会消失。可以考虑要不要自己维护

Flutter 这次很多插件都会受影响

官方已经在跟进,后续查看

如何查看使用到必需API

可以使用脚本

参考链接

# Flutter 上了 Apple 第三方重大列表,2024 春季 iOS 的隐私清单究竟是什么?
# iOS 隐私清单和三方SDK签名适配