如何在TestFlight上部署dev、staging、prod环境并解决版本号限制问题?
1. 为每个环境分配独立的Build Number序列
这是最直接的处理方式——给dev、staging、prod分别划定不重叠的build number区间,比如:
- dev环境从
1000开始递增(1000、1001、1002...) - staging环境从
2000开始递增(2000、2001、2002...) - prod环境从
3000开始递增(3000、3001、3002...)
你可以通过Xcode的agvtool工具,或者在CI/CD流水线(比如GitHub Actions、GitLab CI)里配置变量,自动生成对应环境的build number,避免手动输入出错。优点是不用改动Bundle ID,测试团队能通过build number快速识别环境;缺点是需要维护三个独立的build计数序列。
2. 使用不同的Bundle Identifier区分环境
给每个环境创建独立的Bundle ID:
- dev:
com.yourapp.dev - staging:
com.yourapp.staging - prod:
com.yourapp.prod
每个Bundle ID对应Apple Developer后台独立的App ID、证书和配置文件,这样三个环境在TestFlight里会被视为完全不同的App,各自的build number可以完全独立(甚至重复)。测试团队能在TestFlight列表里看到三个独立的App,清晰区分环境;缺点是需要额外管理多套证书和配置文件,初期配置成本稍高。
3. 单Build内置环境切换逻辑
打包一个包含所有环境配置的通用Build,然后给测试人员提供隐藏的环境切换入口——比如:
- 启动页长按5秒弹出环境选择弹窗
- 连续点击设置页的版本号唤起切换界面
- 通过TestFlight的测试备注传递切换暗号(比如输入特定字符串触发环境切换)
这种方案只用一个build number,不用维护多套Bundle ID或build序列,但需要额外开发环境切换逻辑,还要注意严格隔离生产环境的敏感配置(比如API密钥),避免测试包泄露生产信息。适合不想维护多个TestFlight App的小团队。
4. 同版本号+不同Build Number+分组分发
保持三个环境的版本号一致(比如都是1.0.0),但每个环境打包时使用不同的build number(比如dev用101、staging用102、prod用103),然后在TestFlight里给不同的测试组分发对应的Build:
- 给dev测试组分发build
101,备注标注「Dev环境」 - 给staging测试组分发build
102,备注标注「Staging环境」 - 给预发布组分发build
103,备注标注「Prod预发布环境」
这种方案兼顾了版本号的一致性和环境区分,测试团队能通过TestFlight的build备注快速识别环境,缺点是需要管理不同的测试分组,且build number需要严格递增不重复。
内容的提问来源于stack exchange,提问作者Terry Windwalker

