在开发阶段测试会员购买功能,你有以下几种方法:
🎯 方法一:使用 StoreKit Configuration File(推荐)
这是最方便的本地测试方法,无需真实的 App Store Connect 配置。
1. 创建 StoreKit Configuration 文件
- 在 Xcode 中:
File→New→File - 选择
StoreKit Configuration File - 命名为
Products.storekit - 保存到项目根目录
2. 配置产品信息
在 Products.storekit 文件中添加你的产品(根据你的代码,产品ID已定义):
{
"products": [
{
"displayName": "月度会员",
"familyShareable": false,
"internalID": "monthly_123",
"localizations": [
{
"description": "每月订阅 SpeechNote Pro",
"displayName": "月度会员",
"locale": "zh_CN"
}
],
"productID": "SpeechNote.Membership.Monthly",
"referenceName": "Monthly Membership",
"type": "AutoRenewableSubscription",
"subscription": {
"subscriptionGroupID": "group_speechnote",
"subscriptionPeriod": "P1M"
}
},
{
"displayName": "年度会员",
"familyShareable": false,
"internalID": "yearly_456",
"localizations": [
{
"description": "年度订阅 SpeechNote Pro",
"displayName": "年度会员",
"locale": "zh_CN"
}
],
"productID": "SpeechNote.Membership.Yearly",
"referenceName": "Yearly Membership",
"type": "AutoRenewableSubscription",
"subscription": {
"subscriptionGroupID": "group_speechnote",
"subscriptionPeriod": "P1Y"
}
},
{
"displayName": "终身会员",
"familyShareable": false,
"internalID": "lifetime_789",
"localizations": [
{
"description": "一次购买,永久使用",
"displayName": "终身会员",
"locale": "zh_CN"
}
],
"productID": "SpeechNote.Membership.Lifetime",
"referenceName": "Lifetime Membership",
"type": "NonConsumable"
}
],
"settings": {
"locale": "zh_CN"
},
"version": {
"major": 1,
"minor": 0
}
}
3. 在 Xcode 中启用
- 选择你的 Scheme:
Product→Scheme→Edit Scheme... - 选择
Run→Options - 在
StoreKit Configuration下拉菜单中选择Products.storekit
4. 测试购买
- 运行应用,购买流程会在本地模拟
- 可以在 Xcode 菜单栏
Debug→StoreKit→Manage Transactions查看和管理测试交易 - 可以快速测试订阅续订、过期、退款等场景
🧪 方法二:使用 Sandbox 测试账号
这个方法更接近真实环境,需要在 App Store Connect 中配置。
1. 在 App Store Connect 中配置产品
- 登录 App Store Connect
- 创建应用(如果还没创建)
- 进入
功能→App 内购买项目 - 添加三个产品,使用你代码中的产品ID:
-
SpeechNote.Membership.Monthly- 自动续期订阅 -
SpeechNote.Membership.Yearly- 自动续期订阅 -
SpeechNote.Membership.Lifetime- 非消耗型项目
-
2. 创建 Sandbox 测试账号
- 在 App Store Connect 中:
用户和访问→沙盒测试员 - 点击
+创建新的测试账号 - 使用一个不存在的邮箱(如
test@yourdomain.com) - 设置密码,选择地区为中国
3. 在设备上测试
-
退出真实的 Apple ID:
-
设置→App Store→ 点击头像 →退出登录
-
-
运行应用:
- 在 Xcode 中运行应用到真机或模拟器
-
购买时登录 Sandbox 账号:
- 点击购买按钮时,系统会提示登录
- 使用刚创建的 Sandbox 测试账号登录
-
注意: 横幅会显示
[环境:沙盒]表示是测试环境
4. Sandbox 测试特点
- 免费购买:不会真实扣款
-
快速订阅周期:
- 1个月订阅 = 5分钟
- 1年订阅 = 1小时
- 自动续订测试:可以测试续订6次后自动取消
💡 方法三:临时绕过购买(仅开发测试)
如果只想测试会员功能的 UI 和逻辑,可以临时修改代码:
查看当前会员状态判断逻辑
代码 StoreKitManager.swift 会员状态判断为:
var isUserMember: Bool {
if #available(iOS 15.0, *) {
return purchaseStatus == .purchased || purchaseStatus == .restored
} else {
if let membershipStatus = UserDefaults.standard.object(forKey: "MembershipStatus") as? Bool {
return membershipStatus
}
return false
}
}
临时测试方案(仅用于开发)
你可以在 UsageLimitManager.swift 中临时修改 isProUser 属性:
var isProUser: Bool {
// 开发测试:临时返回 true 模拟会员
return true // ⚠️ 正式发布前必须删除!
// 原逻辑...
}
或者使用编译标志:
var isProUser: Bool {
#if DEBUG
// 开发环境:可以通过设置来模拟
if UserDefaults.standard.bool(forKey: "DEBUG_SimulateProMember") {
return true
}
#endif
// 正式逻辑
if #available(iOS 15.0, *) {
if StoreKitManager.shared.isUserMember {
return true
}
}
if isInTrialPeriod {
return true
}
return false
}
然后在调试时设置:
UserDefaults.standard.set(true, forKey: "DEBUG_SimulateProMember")
📋 推荐的测试流程
阶段 1:本地快速测试(StoreKit Configuration)
✅ 测试购买流程UI
✅ 测试会员功能解锁
✅ 测试错误处理
阶段 2:Sandbox 真实测试
✅ 测试与 App Store Connect 的集成
✅ 测试订阅续订逻辑
✅ 测试恢复购买功能
阶段 3:TestFlight 测试
✅ 在真实环境中测试(使用Sandbox账号)
✅ 邀请测试用户反馈
⚠️ 注意事项
- 永远不要在生产代码中硬编码会员状态为 true
- Sandbox 账号不能用于真实购买
- 测试完成后要退出 Sandbox 账号
- StoreKit Configuration 仅在模拟器/调试时生效
- 正式发布前,确保 App Store Connect 中的产品已审核通过
🎓 调试技巧
查看购买事务
// 在 StoreKitManager 中添加日志
print("Current purchase status: \(purchaseStatus)")
print("Is user member: \(isUserMember)")
重置测试状态
- 删除应用重新安装
- 或在代码中清除 UserDefaults
- 或在 Xcode:
Debug→StoreKit→Clear Purchase History
开发阶段,强烈推荐先使用方法一(StoreKit Configuration File),这样你可以快速迭代测试,无需等待 App Store Connect 的配置和审核。等基本功能稳定后,再使用方法二进行真实环境测试。