StoreKit2 Transaction.currentEntitlements 不返回自动续订

Ash*_*lls 8 storekit swift storekit2

如何返回Transaction.currentEntitlements应用程序关闭时发生的订阅自动续订交易?


我已经在 macOS 应用程序中实现了自动续订订阅。

我有一个可以在和StoreManager上创建听众的Transaction.currentEntitlementsTransaction.updates

如果在应用程序运行时续订订阅,Transaction.updates则会按预期接收最新交易。

但是,当应用程序未运行时自动发生续订时,重新打开应用程序时Transaction.currentEntitlements不会返回续订交易。

按照以下步骤进行重现:

  • 启动应用程序并购买自动续订订阅
  • 杀死该应用程序
  • 等待订阅到期自动续订(测试时可以设置每月30秒续订)
  • 重新启动应用程序
  • Transaction.currentEntitlements什么也不返回。

在应用程序启动时检查StoreKit Transactions调试窗口,应用程序关闭时发生的续订交易显示为“未完成”。

在此输入图像描述

未完成的交易是指未返回的交易。

如果在应用程序运行时再次续订订阅,则会Transaction.updates触发侦听器,并返回新的续订以及任何未完成的事务。

这是来自的相关代码StoreManager

@MainActor
class StoreManager: ObservableObject {
    
    var updates: Task<Void, Never>? = nil
    var transactions: Task<Void, Never>? = nil

    init() {
        updates = updatesListenerTask()
        transactions = transactionsListenerTask()
    }

    @Published private (set) var transaction: StoreKit.Transaction?
    
    func updatesListenerTask() -> Task<Void, Never> {
        Task.detached(priority: .background) {
            for await result in Transaction.updates {
                Task { @MainActor in
                    do {
                        let transaction = try self.validateResult(result)
                        self.transaction = transaction
                        await transaction.finish()
                    } catch {
                        print("Failed verification =\(error.localizedDescription)")
                    }
                }
            }
        }
    }
    
    
    func transactionsListenerTask() -> Task<Void, Never> {
        Task.detached(priority: .background) {
            for await result in Transaction.currentEntitlements {
                Task { @MainActor in
                    do {
                        let transaction = try self.validateResult(result)
                        self.transaction = transaction
                        await transaction.finish()
                    } catch {
                        print("Failed verification =\(error.localizedDescription)")
                    }
                }
            }
        }
    }
    
    func validateResult(_ result: VerificationResult<StoreKit.Transaction>) throws -> StoreKit.Transaction {
        switch result {
        case let .verified(transaction):
            return transaction
        case .unverified:
            throw StoreManagerError.failedVerification
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新

Transaction.latest(for: <productId>)返回的是最新的成品,因此不是自动更新的产品。