2014-07-21 69 views
14

我想弄清楚确保用户在应用购买时不会丢失其易耗品的最佳方法。将易耗品应用内购买与服务器同步

但是,我开始感觉像this StackOverflow user

完成交易后,我想发送到服务器,用户在应用程序中购买了消耗品。但是,此时连接可能会失败(服务器关闭或用户失去连接)。

我在考虑在这种情况下发送收据,一旦连接可以再次进行。然而,从I have read the receipt contains all in app purchases和我不能只发送上次购买物品的收据。

如何确保用户购买的商品与服务器同步?

回答

13

的解决方案是,直到它已与服务器同步的耗材购买不调用

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

。这样,每次设置观察付款队列时,交易都会再次发送给观察员。无论是已经交付但未同步的购买或新购买,您都需要管理应用程序方面。

将事务与服务器同步后。您可以拨打-finishTransaction:。请参阅“完成交易”在这里文档:

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW3

编辑

因此用户通过苹果充电,苹果向您发送SKPaymentTransaction对象,它表示该交易。如果该交易的transactionState属性为SKPaymentTransactionStatePurchased,那么这意味着Apple已经处理了付款并且该用户已被收费。

从paymentQueue收到此SKPaymentTransaction对象后,即会将内容交付给用户,并将交易与服务器同步。一旦这两项都成功完成,请致电-finishTransaction。拨打-finishTransaction会告诉StoreKit您已成功完成您需要执行的所有操作。 -finishTransaction是一个同步调用,您将责任交还给StoreKit,并且您不需要关心自己如何传回iTunes/Apple,StoreKit可以为您处理这一切。

在完成所有需要做的事情之前,您不应该致电-finishTransaction。如果出现问题(设备电池耗尽,互联网连接中断,应用程序崩溃),则在您的观察员在队列中注册时,您将从支付队列中交付相同的SKPaymentTransaction,并且可以尝试再次与服务器同步。在您致电-finishTransaction之前,这种情况会持续发生。

有一种情况是,用户永远无法与服务器同步,永远不会再连接到互联网等。这超出了您的控制范围,并且此时由Apple决定是否对其充电用户。

同样值得注意的是,用户可以联系Apple,并在需要时申请退款。

+0

如果我不叫结束事务的用户失去了他的钱或之后我把完成交易只输?另外,如何处理服务器同步的情况,我将完成交易,但不知何故iTunes连接不会收到完成交易操作? –

+0

请看我的更新 –

+0

我完全卖了。非常感谢你给出了很好的答案。唯一没有完全覆盖的是你如何知道你的SKPaymentTransaction对应于你的某个模型(与服务器同步)。但是那个答案已经够好了:) –

相关问题