在使用旧API进行In-app采购的应用程序上(StoreKit 1)。该应用程序已在应用商店中发布。购买是非消耗品。
在尝试迁移到StoreKit 2时,我无法恢复购买。具体显示和购买产品如预期,但当删除和重新安装应用程序,然后尝试恢复购买时,我无法做到。
我正在尝试使用新的API恢复它们,但似乎不起作用。到目前为止我尝试过的:
在应用程序的整个生命周期中,我都在监听交易更新,包括:
Task.detached {
for await result in Transaction.updates {
if case let .verified(safe) = result {
}
}
}
我有一个按钮可以调用这种方法,但除了提示使用Apple ID再次登录外,它似乎根本没有任何效果:
try? await AppStore.sync()
这不会返回任何项目
for await result in Transaction.currentEntitlements {
if case let .verified(transaction) = result {
}
}
这不会返回任何项目
for await result in Transaction.all {
if case let .verified(transaction) = result {
}
}
如前所述,我在购买商品并删除应用程序后尝试此操作。所以我相信它应该能够恢复购买。我尝试在模拟器上使用Configuration.storekit文件,在Sandbox环境中的实际设备上不使用它。
是否有人能够使用StoreKit 2恢复购买?
PD:我已经在feedback Assistant上提交了一份反馈报告,但到目前为止,他们唯一回复的是:
因为Xcode中的StoreKit测试是一个本地环境,数据与应用程序绑定,所以当您删除应用程序时,您也会删除Xcode环境中该应用程序的所有事务数据。提供的代码片段是API的正确用法。
所以,是的,使用Configuration.storekit文件无法恢复购买,但如果我不能在Sandbox环境中恢复它们,我担心一旦发布,这将不起作用,让我的用户完全无法恢复他们已经购买的东西。
在发布到应用商店并最终在生产中直接试用该应用程序后,我可以确认它是有效的,但我不得不说,无法在沙箱环境上测试这是不理想的。
此外,我觉得文件不够清晰,至少对我来说不够清晰。对于其他人来说,这可能是清楚的,但我本以为购买会自动恢复,并在for await result in Transaction.updates
上获得,但这没有奏效。
所做的工作是检查Transaction.currentEntitlements
,如果不存在权利,则执行sync()
并再次检查。这是对我有效的代码:
try? await AppStore.sync()
for await result in Transaction.currentEntitlements {
if case let .verified(transaction) = result {
// ...
}
}
注意事项
- 如前所述,这只适用于
release mode
,在没有StoreKit Testing(即没有Configuration.storekit
)的情况下不适用于debug mode
- 如果您想使用StoreKit Testing(使用
Configuration.storekit
),恢复购买(使用相同的方法)是可行的,但前提是您不删除应用程序并重新安装。通过删除应用程序,您丢失了StoreKit测试历史记录 - 正如@loremipsum所提到的,这也可以在TestFlight上进行测试(因为它是发布模式)
- 已验证iOS和macOS