App Attest 与隐私
问题
App Attest 是什么?iOS 隐私相关的面试知识点?
答案
App Attest
iOS 14+ 提供的设备完整性验证,可以验证请求来自正版未被篡改的 App。
import DeviceCheck
let service = DCAppAttestService.shared
// 1. 生成密钥
service.generateKey { keyId, error in
guard let keyId = keyId else { return }
// 2. 请求服务端发送 challenge
let challenge = serverChallenge.data(using: .utf8)!
let hash = SHA256.hash(data: challenge)
let hashData = Data(hash)
// 3. 生成 attestation
service.attestKey(keyId, clientDataHash: hashData) { attestation, error in
// 4. 发送 attestation 到服务端验证
}
}
iOS 隐私要求
| 特性 | 版本 | 说明 |
|---|---|---|
| ATT 跟踪透明度 | iOS 14.5+ | 必须弹框获取追踪授权 |
| 隐私标签 | iOS 14+ | App Store 展示数据使用 |
| 隐私清单 | iOS 17+ | 声明 API 使用原因 |
| 剪贴板访问提示 | iOS 14+ | 读取剪贴板会显示横幅 |
Privacy Manifest
PrivacyInfo.xcprivacy
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
常见面试问题
Q1: ATT 弹框被用户拒绝怎么办?
答案:不能再次弹框。可以在弹框前展示自定义引导页说明追踪用途,提升用户同意率。如果被拒,使用 SKAdNetwork 归因替代 IDFA。
Q2: iOS 17 的隐私清单是必须的吗?
答案:是。Apple 要求所有包含"Required Reason API"(如 UserDefaults、文件时间戳、系统启动时间等)的 App 和 SDK 都必须声明使用原因,否则会收到审核警告。