首页 文章

将耗材的应用内购买与服务器同步

提问于
浏览
15

我试图找出确保用户在购买应用程序时不会丢失耗材的最佳方法 .

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

完成一笔交易后,我想发送给用户在应用程序中购买耗材的服务器 . 但是,此时连接可能会失败(服务器已关闭或用户失去连接) .

我正在考虑在那种情况下,一旦连接再次发送就发送收据 . 但是,从I have read the receipt contains all in app purchases和我不能只发送最后购买的物品的收据 .

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

1 回答

  • 14

    解决方案是不打电话

    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

    在消耗品购买之前,直到它与服务器同步 . 这样,每次将事务设置为观察支付队列时,事务将再次传递给您的观察者 . 您需要管理应用程序端,无论是已交付但未同步的购买,还是新购买 .

    一旦与服务器同步了事务 . 你可以拨打 -finishTransaction: . 请参阅此处文档中的"Finishing The Transaction":

    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并要求退款 .

相关问题