Expo 应用如何配置 iOS Privacy Manifest(PrivacyInfo.xcprivacy)声明受限 API 使用原因 Expo 应用如何配置 iOS Privacy ManifestPrivacyInfo.xcprivacy声明受限 API 使用原因【免费下载链接】expoAn open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web.项目地址: https://gitcode.com/GitHub_Trending/ex/expo当你的 iOS 应用包括通过 Expo 打包的应用使用了 Apple 归类为required reason的受限 API——例如访问 UserDefaults、文件时间戳file timestamp、系统启动时间system boot time、磁盘空间、当前激活的键盘——提交 App Store 审核时就需要声明使用这些 API 的原因。这个声明通过一个名为PrivacyInfo.xcprivacy的文件完成即 iOS privacy manifest。本文基于 Expo 仓库中的 Privacy manifests 指南 说明如何在 Expo 项目中配置该文件。注意Expo 官方提示这部分内容和步骤仍在开发中可能因新工具或 Apple 的新要求而变化受限 API 清单是开放的Apple 未来可能扩充。required reason API 的完整清单见 Apple 官方文档Bundler Resources 的 Privacy manifest files 条目。在 app.json 中通过 privacyManifests 字段配置如果你的项目使用 CNGContinuous Native Generationprebuild 流程生成/管理原生目录直接在应用配置的expo.ios下添加privacyManifests字段。以下配置来自文档将访问 UserDefaults 的原因是 CA92.1写入清单{ expo: { name: My App, slug: my-app, ios: { privacyManifests: { NSPrivacyAccessedAPITypes: [ { NSPrivacyAccessedAPIType: NSPrivacyAccessedAPICategoryUserDefaults, NSPrivacyAccessedAPITypeReasons: [CA92.1] } ] } } } }NSPrivacyAccessedAPITypes和NSPrivacyAccessedAPITypeReasons的具体取值需要根据你的 API 用途对照 Apple 的 Describing use of required reason API 文档确定。privacyManifests的类型定义见 expo/config-types 中的 ExpoConfig除NSPrivacyAccessedAPITypes外还支持NSPrivacyTrackingDomains跟踪域名列表、NSPrivacyTracking布尔值是否使用数据做跟踪和NSPrivacyCollectedDataTypes采集的数据类型。配置如何落到原生工程该字段由默认 prebuild 插件 withPrivacyInfo 消费注册于 withDefaultPlugins。它的行为是在ios/工程名/PrivacyInfo.xcprivacy写入清单内容如果文件已存在会与现有内容合并——同一 API 类别的原因列表取并集去重而非整体覆盖若 Xcode 工程中还没有该文件会将其作为资源文件加入对应 target确保参与构建。因此修改 app.json 后需要重新走一遍 prebuild重新生成原生工程才能让变更生效。另外确保当前 SDK 版本对应的 Expo SDK 库已更新到最新版可用npx expo install --fix完成。Expo SDK 包与第三方库的原因需要自行合并声明有一个当前必须处理的限制Apple 目前无法正确解析静态 CocoaPods 依赖包括 Expo SDK 包和其他生态库自带的 PrivacyInfo 文件。也就是说即使某个依赖包自带了声明你可能仍需要把该依赖使用的 API 原因复制到你自己的 PrivacyInfo.xcprivacy 或 app.json 配置中。定位这些原因值的做法来自文档查看依赖是否在node_modules/package_name/ios目录下有PrivacyInfo.xcprivacy文件如果有读取其中NSPrivacyAccessedAPITypes与NSPrivacyAccessedAPITypeReasons的值复制到你的配置中。仓库中每个使用了 required reason API 的 Expo SDK 包都在包目录内附带了该文件例如 expo-application 的 PrivacyInfo.xcprivacy文档示例dict keyNSPrivacyCollectedDataTypes/key array /array keyNSPrivacyTracking/key false/ keyNSPrivacyTrackingDomains/key array/ keyNSPrivacyAccessedAPITypes/key array dict keyNSPrivacyAccessedAPIType/key stringNSPrivacyAccessedAPICategoryFileTimestamp/string keyNSPrivacyAccessedAPITypeReasons/key array stringC617.1/string /array /dict /array /dict即该包声明了使用文件时间戳 API原因码为C617.1。仓库内同样自带该文件的包还包括expo-constants、expo-device、expo-file-system、expo-localization、expo-media-library、expo-notifications、expo-system-ui、expo-task-manager如packages/expo-constants/ios/PrivacyInfo.xcprivacy。另一种备选路径Apple 会在你提交包含缺失清单/原因码的构建后通过邮件通知你具体缺哪些原因。可以等收到邮件后把邮件中列出的原因补进 app.json使用 CNG或 PrivacyInfo.xcprivacy 文件不使用 CNG。在现有原生 React Native 项目中配置如果你的项目是绕过 prebuild、直接维护 ios 目录的现有 React Native 工程文档中的 ConfigReactNative 场景则不用 app.json 字段而是在 Xcode 中创建PrivacyInfo.xcprivacy文件并添加到你的 iOS app target文件的字段写法遵循 Apple 的 Privacy manifest files 指南。验证方式文档给出的验证方式是走真实提交流程构建应用后提交 App Store 审核或 TestFlight 的外部审核。如果应用缺少其使用的 API 所需的原因声明Apple 会在提交后几分钟内发邮件指出缺失项。收到邮件即表示对应原因码尚未正确声明按邮件列出的内容补充配置后重新构建提交即可。限制说明上述指南官方标注still in development步骤和字段可能随新工具或 Apple 新要求变化受限 API 清单是开放列表Apple 可扩充CocoaPods 静态依赖自带 PrivacyInfo 文件不被 Apple 正确解析相关原因码必须由你的应用主清单声明——这是当前最主要的踩坑点。【免费下载链接】expoAn open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web.项目地址: https://gitcode.com/GitHub_Trending/ex/expo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考