ios - 将消耗品应用内购买与服务器同步

标签 ios in-app-purchase

我正在尝试找出确保用户不会在应用程序购买中丢失其消耗品的最佳方法。

但是,我开始觉得 this StackOverflow user .

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

在那种情况下,我正在考虑一旦可以再次建立连接就发送收据。然而,从什么I have read the receipt contains all in app purchases而且我不能只发送上次购买商品的收据。

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

最佳答案

解决方法是不调用

[[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

编辑

因此用户被 Apple 收费,Apple 向您发送一个代表交易的 SKPaymentTransaction 对象。如果该交易的 transactionState 属性为 SKPaymentTransactionStatePurchased,则表示 Apple 已处理付款并且已向用户收费。

一旦您从 paymentQueue 收到此 SKPaymentTransaction 对象,您就将内容交付给用户,并将交易与您的服务器同步。一旦这两项都成功完成,您就可以调用 -finishTransaction。调用 -finishTransaction 告诉 StoreKit 您已经成功完成了所有需要做的事情。 -finishTransaction 是一个同步 调用,您将责任交还给 StoreKit,您无需关心如何沟通回到 iTunes/Apple,StoreKit 会为您处理这一切。

在完成所有需要做的事情之前,您不应该调用 -finishTransaction。如果出现问题(设备电池耗尽、互联网连接丢失、应用程序崩溃),下次您的观察者在队列中注册时,您将从支付队列中获得相同的 SKPaymentTransaction,并且可以尝试再次与您的服务器同步。这将一直发生,直到您调用 -finishTransaction

有一种情况是用户永远无法与您的服务器同步,再也无法连接到互联网等。这是您无法控制的,此时 Apple 有责任决定他们是否向用户收费.

还值得注意的是,如果用户愿意,可以联系 Apple 并要求退款。

关于ios - 将消耗品应用内购买与服务器同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24870291/

相关文章:

iOS 共享扩展 : get URL of page when sharing via context menu in Safari

android - Google Wallet for Digital Goods API 与 Google Play 应用内结算

ios - Swift - IOS - 限时功能

ios - 在 Apple iOS 应用程序内购买服务器到服务器通知沙箱中未获得统一收据

iphone - 计算 NSMutableArray 中有多少个唯一行

ios - Swift 使用 GCDAsyncSocket 创建套接字客户端

iphone - 带 URL 的 writeToFile - URL 在下一个 session 中不存在

ios - 如何将 UIPicker 的选定行与先前输入的数据同步

iOS:如何将 Apple 托管的内容上传到 itunesconnect 中的应用内购买

flutter - Flutter in_app_purchase 插件的正确实现多耗材