如何使用 StoreKit 2 进行恢复?

mat*_*att 13 storekit ios

iOS 15 引入了 StoreKit 2。我正在研究它,看看是否可以在我现有的应用程序中采用它,但我不知道该怎么做。特别是,我不知道如何实现所需的恢复功能(例如,如果用户删除了我的应用程序)。

我想我们应该使用Transaction.latest(for:)?是对的吗?

但在我的测试中,如果用户使用 StoreKit 1 进行了购买,则该调用将返回nil. 这是真的?或者,如果我做错了,从 StoreKit 1 迁移到 StoreKit 2 的正确方法是什么,以及我们如何处理恢复?

小智 16

在Apple的SKDemo中,他们这样做

Button("Restore Purchases", action: {
            async {
                //This call displays a system prompt that asks users to authenticate with their App Store credentials.
                //Call this function only in response to an explicit user action, such as tapping a button.
                try? await AppStore.sync()
            }
        })
Run Code Online (Sandbox Code Playgroud)

我个人想知道是否成功,所以我将其包装在一个方法中

func restore() async -> Bool {
    return ((try? await AppStore.sync()) != nil)
}
Run Code Online (Sandbox Code Playgroud)

并相应地弹出警报

  • @matt 公平地说,这是对您的问题“如何使用 StoreKit 2 进行恢复”的一个很好的答案。虽然接受的答案似乎为您的用例提供了解决方案,但 Apple 提供了一个明确的 API 来“使用 StoreKit 2 进行恢复”。`AppStore.sync()` 的文档说:“在您的应用程序中包含一些机制,例如恢复购买按钮,让用户恢复他们的应用内购买。”。WWDC 2021 视频“Meet StoreKit 2”中也讨论了这一点。我希望在阅读您的问题时能够准确找到该 API。 (9认同)
  • @rayx 不,我完全理解:-) 有两种不同的用例和两种不同的 API。但马特的问题“如何使用 StoreKit 2 进行恢复”本身是含糊不清的,可以指两者。当我偶然发现这个问题时,马特正在寻找一个用例,而我实际上正在寻找另一个用例。对于我来说,Manas 的回答正是我正在寻找的 API。 (2认同)

Pau*_*w11 15

您可以进行迭代Transaction.currentEntitlements以获得所有有效订阅和以前购买的非消耗产品。

如果您在启动时检查此集合,您可以静默恢复任何以前的购买,无需用户交互。