我正在努力找出确保用户在购买应用时不会丢失耗材的最佳方法。
然而,我开始感觉像this StackOverflow user。
完成交易后,我想发送给用户在应用程序中购买耗材的服务器。但是,此时连接可能会失败(服务器已关闭或用户失去连接)。
我正考虑在这种情况下,一旦连接再次发送就发送收据。但是,根据I have read the receipt contains all in app purchases,我只能发送最后购买商品的收据。
如何确保用户购买的产品与服务器同步?
答案 0 :(得分:15)
解决方案是不打电话
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
关于耗材购买,直到与服务器同步为止。这样,每次设置观察支付队列时,交易将再次发送给您的观察者。您需要管理应用程序端,无论是已交付但未同步的购买,还是新购买。
与服务器同步事务后。你可以致电-finishTransaction:
。请参阅此处文档中的“完成交易”:
修改
因此Apple向用户收费,Apple向您发送代表该交易的SKPaymentTransaction
对象。如果该交易的transactionState属性为SKPaymentTransactionStatePurchased
,则表示Apple已处理付款并且用户已被收费。
从paymentQueue收到此SKPaymentTransaction
对象后,您会将内容传递给用户,并将交易与您的服务器同步。成功完成这两项后,请致电-finishTransaction
。致电-finishTransaction
告诉StoreKit
您已成功完成了所需的一切。 -finishTransaction
是同步电话,您将责任交还给StoreKit
,您无需关心如何将其传达回iTunes / Apple,StoreKit
{1}}为您处理所有问题。
在完成您需要做的所有事情之前,不应该致电-finishTransaction
。如果出现问题(设备电池耗尽,互联网连接丢失,应用程序崩溃),下次观察者在队列中注册时,您将从支付队列中获得相同的SKPaymentTransaction
,并且可以尝试再次与你的服务器。这将继续发生,直到您致电-finishTransaction
。
有一种情况是用户永远无法与您的服务器同步,再也无法连接到互联网等等。这是您无法控制的,此时Apple决定是否向用户收费
值得注意的是,如果用户愿意,用户可以联系Apple并要求退款。