配置
Secrets.xcconfig 密钥、xcconfig 配置链与优雅降级。
这相当于 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 配置。
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 值的
键,都请沿用这个写法。
