ios - 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)
}
解决方案
问题可能是这一行:
guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }
这似乎很可能会失败。写吧
let productIdentifier = transaction.payment.productIdentifier
推荐阅读
- c# - 使用 MediaPlayer 在 WPF 应用程序中播放声音
- javascript - Nodemailer 无法在 PUG 引擎上启动
- c# - 动态数据类型的方法重载
- python - Python将简单整数列表转换为斐波那契数列
- python - 关于 BraTS 数据集的说明
- javascript - 如何将数组插入到数组内的对象中?对于 ng2-charts / Charts.js
- json - 来自 API 的 Open.json 文件
- javascript - 识别 Javascript 中的函数名称或属性
- c - 为什么 OpenCL 中不同的本地大小会产生不同的结果?
- javascript - 使用 R2D3 时无法识别的功能