首页 > 解决方案 > StoreKit 如何跨设备同步非消耗品购买

问题描述

根据 Apple 文档,“非消耗品由系统跨设备同步”,或“非消耗品可在所有用户的设备上使用”,或“StoreKit 处理非消耗品的同步和恢复过程”。不幸的是,我无法在任何地方找到有关“同步”机制的任何细节。我的应用程序将非消耗品的购买状态保存在 UserDefaults 中,这些产品本质上只是本地的。在另一台设备上使用相同的应用程序并按下恢复按钮,我没有收到任何我以前购买的东西。所以我的问题是: Apple 在谈论跨设备同步时意味着什么?需要在我的应用程序中添加什么才能使购买跨设备同步?

恢复按钮的代码是:

public func restorePurchases() {    
    SKPaymentQueue.default().restoreCompletedTransactions()
}

我有一个扩展名:

extension IAPHelper: SKPaymentTransactionObserver {
    // Called when a transaction states change
    public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch (transaction.transactionState) {
            case .purchased:
                complete(transaction: transaction)
                break
            case .failed:
                fail(transaction: transaction)
                break
            case .restored:
                restore(transaction: transaction)
                break
            case .deferred:
                break
            case .purchasing:
                break
            }
        }
    }

恢复的代码是:

private func restore(transaction: SKPaymentTransaction) {
    guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }        
    print("restore... \(productIdentifier)") 
    deliverPurchaseNotificationFor(identifier: productIdentifier)
    SKPaymentQueue.default().finishTransaction(transaction)
}

对于 deliverPurchaseNotificationFor :

private func deliverPurchaseNotificationFor(identifier: String?) {
    guard let identifier = identifier else { return }
    purchasedProductIdentifiers.insert(identifier)
    let defaults = UserDefaults.standard
    var currentStatus = defaults.string(forKey:identifier)
    currentStatus = "Purchased"   // acheté mais pas sauvé
    defaults.set(currentStatus, forKey: identifier)
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "IAPHelperPurchaseNotification"), object: identifier)
}

标签: iosswiftin-app-purchase

解决方案


问题可能是这一行:

guard let productIdentifier = transaction.original?.payment.productIdentifier else { return } 

这似乎很可能会失败。写吧

let productIdentifier = transaction.payment.productIdentifier 

推荐阅读