配置

Secrets.xcconfig 密钥、xcconfig 配置链与优雅降级。

模式说明: 本页描述共享产品行为与现有 Standalone Provider 细节。Unified 构建使用相同 UI,通过 Backend 无关服务运行,并采用 Unified / Soar API Setup 的 Provider 配置。配置错误不会静默回退。

这相当于 iOS 版的「环境变量」页面。iOS 应用没有 .env 文件或服务器环境——配置改为通过 Xcode 的 xcconfig 构建设置流入 Info.plist,应用再通过一个类型化访问器读回。本页 讲解这条链路,并列出每一个密钥。

xcconfig 配置链

配置经过五个阶段:

AppConfig.xcconfig(被追踪)

提交到 git,内含安全的占位值(如 your-supabase-publishable-key)。文件末尾是 #include? "Secrets.xcconfig",因此你的本地文件会覆盖这些占位值。

Secrets.xcconfig(被 git 忽略)

你的真实值,通过 cp Secrets.example.xcconfig Secrets.xcconfig 创建。绝不提交。这里定义的 任何键都会覆盖上面的占位值。

Info.plist$() 替换

构建设置通过 $(KEY) 替换被写入 Info.plist 条目,因此这些值会作为 Info 字典键随应用包 一起分发。

AppSecrets 访问器

Core/Config/AppSecrets.swift 读取 Info 字典,并暴露类型化的可选属性 (supabaseURL: URL?revenueCatIOSKey: String? 等)。

各控制器的 isConfigured 空转

每个控制器都会检查自己的密钥。密钥缺失时,控制器将 isConfigured 置为 false 并空转, 而不是崩溃。

占位值等同于未设置。 只要某个值为空、仍含有 $( 替换标记,或以 your- 开头, AppSecrets 就将其视为缺失。也就是说,你可以原封不动地保留 AppConfig.xcconfig 中的 任意占位值,对应功能只会保持未激活——应用照样能构建并启动。这正是 优雅降级约定。

密钥参考

所有密钥都是可选的。下表按服务分组;「缺失时」描述密钥未设置时的行为。

Supabase

Prop

Type

所有 Supabase 支撑的流程(认证、待办、上传)都需要它们。参见 Supabase 配置

后端模式(Unified Platform)

Prop

Type

各模式提供什么、切换意味着什么,见后端模式

RevenueCat

Prop

Type

参见 RevenueCat 配置订阅

PostHog(数据分析)

Prop

Type

分析还受同意闸门约束——仅在用户接受同意闸门后才会启动。参见 可观测性

Sentry(崩溃上报)

Prop

Type

更新闸门

Prop

Type

Secrets.xcconfig 中调高 MIN_APP_VERSION / LATEST_APP_VERSION 即可在本地验证该闸门。 参见启动闸门

链接与法律

Prop

Type

通用链接的配置见深度链接

Google 登录

Prop

Type

这两个键都包含在 Secrets.example.xcconfig 中。完整的 Google 流程见 身份认证。Apple 登录不需要密钥——它改用 Sign in with Apple 能力。

服务器端密钥绝不进入应用

Secrets.xcconfig 中的密钥都是随应用包分发的客户端值——只应放 publishable/公开 的值。特权密钥(APNs 签名密钥、RevenueCat webhook 鉴权令牌、Supabase service-role 密钥) 存放在 Supabase Edge Function 密钥中,绝不随应用打包。参见 Supabase 配置

xcconfig 陷阱:// 是注释

在 xcconfig 文件里,// 会开始一段注释——这与 URL 中的 // 冲突。模板用 $() 空替换技巧 绕开:把 // 拆开,使其不被解析为注释:

SUPABASE_URL = https:/$()/your-project-ref.supabase.co

$() 展开为空,因此该值读回时是 https://your-project-ref.supabase.co。凡是设置 URL 值的 键,都请沿用这个写法。

相关页面

本页目录