ios - AppStore.sync() 不恢复购买

标签 ios swift macos in-app-purchase storekit

在使用旧 API 进行应用内购买 (StoreKit 1) 的应用上。该应用程序已在 App Store 上发布。购买是非消耗品 .
在尝试迁移到 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 {

    }
}
如前所述,我在购买商品并删除应用程序后尝试此操作。所以我相信它应该能够恢复购买。
我正在尝试使用 配置.storekit 文件在模拟器上,而没有它在真实设备上,在沙盒环境中。
有没有人能够使用 StoreKit 2 恢复购买?
PD:我已经在反馈助手上提交了反馈报告,但到目前为止他们唯一回复的是:

Because StoreKit Testing in Xcode is a local environment, and the data is tied to the app, when you delete the app you're also deleting all the transaction data for that app in the Xcode environment. The code snippets provided are correct usage of the API.


所以是的,使用 配置.storekit 文件在恢复购买时不起作用,但如果我不能在沙盒环境中恢复它们,恐怕一旦发布就无法工作,让我的用户完全无法恢复他们已经购买的东西。

最佳答案

发布到后应用商店最后直接在生产中尝试应用程序我可以确认它可以工作,但我不得不说它是 不理想 无法在沙箱环境中对此进行测试。
另外我觉得文档不够清楚,至少对我来说不是。
其他人可能很清楚,但我希望购买能够自动恢复并在 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并且不适用于 debug mode没有 StoreKit 测试 ,即没有 Configuration.storekit .
  • 如果您想使用 StoreKit 测试 (使用 Configuration.storekit )恢复购买有效(使用相同的方法),但前提是您不删除 de app 并重新安装。通过删除应用程序,您会丢失 StoreKit 测试历史记录。
  • 正如@loremipsum 所提到的,这也可以在 TestFlight 上进行测试(因为它是 Release模式)。
  • 已验证 iOS 和 macOS。
  • 关于ios - AppStore.sync() 不恢复购买,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69768519/

    相关文章:

    ios - 无法从 MapKitView 转到 Controller

    swift - 在尝试使用 Timer.scheduledTimer 的 SwiftUI 代码中获取未解析的标识符 'self'

    java - maven 忽略 jenv 设置

    电子邮件问题中的 Phpmailer 图片

    swift - RxAlamofire 源代码中实际的 API 调用在哪里?

    macos - Electron 生成器代码签名 : bundle format unrecognized, 无效或不合适

    ios - tableView.reloadData() 结束其他动画,如何解决?

    ios - 拦截 oauth2 回调

    ios - 如何向大量iPhone发送少量数据

    Swift 导入字典到 tableviewcell