Apple 隐私清单

解决与 Apple 隐私清单和 Sentry React Native SDK 相关的常见问题。

本指南需要 @sentry/react-native@5.22.1 或更新版本。

Sentry 的 SDK 为在 Apple 设备上运行的移动应用程序提供错误和性能监控。为此,SDK 需要访问有关设备和应用程序的某些信息。其中一些 API 被 Apple 视为隐私相关。为了将应用程序提交到 App Store,Apple 要求所有应用程序及其使用的库提供隐私清单文件,说明在哪些允许的原因下使用了哪些 API。更多详情,请参阅 Apple 关于 描述必需原因 API 的使用 的指南。

本指南中的信息和步骤仍在完善中,可能会因为新工具或更新的 Apple 要求 而发生变化。

如果你使用的是动态链接框架,Apple 将自动处理 SDK 的隐私清单。如果你使用的是静态链接库(这是 React Native 应用程序的默认设置),你需要自己提供隐私清单。本指南将帮助你为 React Native 和 Expo 应用程序创建隐私清单。

请注意,应用程序隐私清单涵盖了 整个应用程序所有包含的库 的所有数据使用情况(通过 NSPrivacyCollectedDataTypes)和 API 使用情况(通过 NSPrivacyAccessedAPITypes)。以下示例仅反映了当前对 Sentry SDK 的要求。如果你使用了其他访问隐私相关 API 的库,也需要将它们包含在隐私清单中。

首先,你需要在 Xcode 项目中创建一个隐私清单文件。该文件应命名为 PrivacyInfo.xcprivacy,并放置在 Xcode 项目的根目录中。请按照 Apple 的 隐私清单文件 指南来创建该文件。

PrivacyInfo.xcprivacy
Copied
<?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>NSPrivacyCollectedDataTypes</key>
	<array>
		<dict>
			<key>NSPrivacyCollectedDataType</key>
			<string>NSPrivacyCollectedDataTypeCrashData</string>
			<key>NSPrivacyCollectedDataTypeLinked</key>
			<false />
			<key>NSPrivacyCollectedDataTypeTracking</key>
			<false />
			<key>NSPrivacyCollectedDataTypePurposes</key>
			<array>
				<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
			</array>
		</dict>
		<dict>
			<key>NSPrivacyCollectedDataType</key>
			<string>NSPrivacyCollectedDataTypePerformanceData</string>
			<key>NSPrivacyCollectedDataTypeLinked</key>
			<false />
			<key>NSPrivacyCollectedDataTypeTracking</key>
			<false />
			<key>NSPrivacyCollectedDataTypePurposes</key>
			<array>
				<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
			</array>
		</dict>
		<dict>
			<key>NSPrivacyCollectedDataType</key>
			<string>NSPrivacyCollectedDataTypeOtherDiagnosticData</string>
			<key>NSPrivacyCollectedDataTypeLinked</key>
			<false />
			<key>NSPrivacyCollectedDataTypeTracking</key>
			<false />
			<key>NSPrivacyCollectedDataTypePurposes</key>
			<array>
				<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
			</array>
		</dict>
	</array>
	<key>NSPrivacyAccessedAPITypes</key>
	<array>
		<dict>
			<key>NSPrivacyAccessedAPIType</key>
			<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
			<key>NSPrivacyAccessedAPITypeReasons</key>
			<array>
				<string>CA92.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>

根据 Expo 应用程序的设置,如果你使用的是连续原生生成 (CNG),则可能需要将隐私清单添加到 app.json 文件中。否则,你可以使用 Xcode 添加隐私清单。

app.json
Copied
{
  "expo": {
    "name": "My App",
    "slug": "my-app",
    "ios": {
      "privacyManifests": {
        "NSPrivacyCollectedDataTypes": [
          {
            "NSPrivacyCollectedDataType": "NSPrivacyCollectedDataTypeCrashData",
            "NSPrivacyCollectedDataTypeLinked": false,
            "NSPrivacyCollectedDataTypeTracking": false,
            "NSPrivacyCollectedDataTypePurposes": [
              "NSPrivacyCollectedDataTypePurposeAppFunctionality"
            ]
          },
          {
            "NSPrivacyCollectedDataType": "NSPrivacyCollectedDataTypePerformanceData",
            "NSPrivacyCollectedDataTypeLinked": false,
            "NSPrivacyCollectedDataTypeTracking": false,
            "NSPrivacyCollectedDataTypePurposes": [
              "NSPrivacyCollectedDataTypePurposeAppFunctionality"
            ]
          },
          {
            "NSPrivacyCollectedDataType": "NSPrivacyCollectedDataTypeOtherDiagnosticData",
            "NSPrivacyCollectedDataTypeLinked": false,
            "NSPrivacyCollectedDataTypeTracking": false,
            "NSPrivacyCollectedDataTypePurposes": [
              "NSPrivacyCollectedDataTypePurposeAppFunctionality"
            ]
          }
        ],
        "NSPrivacyAccessedAPITypes": [
          {
            "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults",
            "NSPrivacyAccessedAPITypeReasons": ["CA92.1"]
          },
          {
            "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategorySystemBootTime",
            "NSPrivacyAccessedAPITypeReasons": ["35F9.1"]
          },
          {
            "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryFileTimestamp",
            "NSPrivacyAccessedAPITypeReasons": ["C617.1"]
          }
        ]
      }
    }
  }
}

  • 有关使用 Expo 生成隐私清单的更多信息,请阅读 Expo 的 隐私清单 指南。

  • 列出的 API 是 SDK 正常运行所必需的,无法选择退出这些 API。

  • 如果你使用的是较旧版本的 SDK,可能需要更新到版本 5.22.1 或更高版本,以便自动为动态链接框架包含隐私清单。

  • 要验证隐私清单是否正确包含在你的应用程序中,可以构建并提交应用程序到 App Store 或 TestFlight 进行外部测试。如果清单缺失,你会收到 Apple 发送的主题为 "The uploaded build for YourAppName has one or more issues" 的电子邮件,其中列出了缺失的 API 声明。