Apple 隐私清单文件
如果您未在隐私清单中正确声明 API 的使用和数据处理的原因,您可能会收到 ITMS-91053 Missing API declaration
的警告。从 2024 年 5 月 1 日起,未包含这些声明的应用程序将 无法上传或更新 。
在 2024 年 3 月 13 日之后向 App Store 提交新的应用程序版本或更新现有版本,请注意 Apple 的隐私政策更新。根据最新要求,开发者在提交应用程序时,必须提供隐私清单文件(PrivacyInfo.xcprivacy
),详细说明应用程序如何使用用户数据。更多信息,查看关于 App Store 提交的隐私更新。
这些变化强调了 Apple 对于隐私保护的承诺,同时也给开发者提出了新的挑战,要求他们在设计和开发应用程序时更加关注用户隐私。开发者需要确保他们的应用程序和集成的第三方 SDK 都符合新的隐私政策要求,以免影响应用程序在 App Store 上的发布和更新
为了避免这种情况,请按照 隐私清单配置指南 准备您的 PrivacyInfo.xcprivacy 文件。此文件应详细描述您的应用程序如何处理各种数据类型,并为每种数据使用提供合理的说明。
更多资料见:
Unity
- 从 Unity
2021.3.35f1
、2022.3.18f1
和2023.2.7f1
开始,Unity 在导出 Xcode 工程时增加 新功能: 检测 Unity C# API,并会自动生成 所需的 Reason API 声明 至/UnityFramework/PrivacyInfo.xcprivacy
- Unity 同时也支持自定义的
PrivacyInfo.xcprivacy
,Unity 会搜索Assets/Plugins
目录,自动合并至 Xcode 工程的/UnityFramework/PrivacyInfo.xcprivacy
中。
低版本 Unity 适配 Combo SDK
此方案适用于 不能 升级新版本的 Unity 研发团队
1. 手动创建 PrivacyInfo.xcprivacy
- 按照下图所示步骤,使用 Xcode 创建
PrivacyInfo.xcprivacy
,详情参见:Create a privacy manifest - 游戏研发需要根据 Unity 指南 Apple Privacy 手动添加所需要的
Required Reasons API
2. 合并数数 SDK 隐私清单
因为低版本 Unity 不支持自动合并 Plugins/PrivacyInfo.xcprivacy
,所以需要将 com.seayoo.sdk/ThinkingData/Plugins/iOS/PrivacyInfo.xcprivacy
的内容 手动 合并到游戏研发创建的 PrivacyInfo.xcprivacy
中。
PrivacyInfo.xcprivacy
<?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>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeProductInteraction</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeCrashData</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypePerformanceData</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeCoarseLocation</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeUserID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeDeviceID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
</array>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>1C8F.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>E174.1</string>
<string>7D9E.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>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
3. Xcode 添加 PrivacyInfo.xcprivacy
Unity 导出到 Xcode 工程后,手动将 PrivacyInfo.xcprivacy
文件添加到 Xcode 工程
推荐使用 Unity PostBuild,可以将 Unity 目录的 PrivacyInfo.xcprivacy
添加至 Xcode Project
Combo SDK 的隐私清单
Combo SDK 所有 xcframework
均已提供隐私清单文件,接入 Combo SDK 时无需做额外处理按原来的方式集成即可,如果想要查看 Combo SDK 的隐私清单,可以自行查看 xcframework 内的 PrivacyInfo.xcprivacy
。
查看隐私清单报告
隐私清单报告可以帮助开发者了解其如何使用隐私数据及相关API。开发者可以在Xcode 将第三方 SDK 中的隐私清单合并,然后导出一个 PDF 报告汇总,在向 App Store 提交审核时,填写隐私标签时可以参考报告,可通过 Xcode 15 生成隐私报告,验证是否符合预期。
隐私清单报告示例
延伸阅读
- https://developer.apple.com/videos/play/wwdc2023/10060/
- https://developer.apple.com/videos/play/wwdc2023/10061
- Flutter 上了 Apple 第三方重大列表,2024 春季 iOS 的隐私清单究竟是什么? - 知乎 (zhihu.com)
- Do Static Libraries need a Privacy… | Apple Developer Forums
- Verify app dependencies with digital signatures | WWDC NOTES
其他 SDK 厂商
- https://docs.playernetwork.intlgame.com/docs/zh/Support/FAQ/iOS/iOSPrivacyManifest/
- https://open.cmge.com/open/index/docDetail/81
- WWDC23 隐私更新 (sensorsdata.cn)
FAQ
使用 Unity 支持 Privacy 的版本,还需要适配 Combo SDK 吗?
答:不需要做任何适配
若游戏中使用了其他第三方 SDK,应该怎么处理隐私清单?
答: 可以按照第三方 SDK 文档说明进行处理
- 如果第三方依赖是
.a
文件,需要手动将三方的.xcprivacy
合并 - 如果第三方依赖是
framework
、xcframework
,且没有通过embed
到 Xcode,需要手动将三方提供的.xcprivacy
合并 - 其它的
framework
、xcframework
、bundle
内如果包含.xcprivacy
Xcode 会自行合并