a) in this case, has the user already paid for the product?
PaymentTransaction观察员将告诉您用户购买的状态是 .Purchased, .Purchasing, .Failed . 等等 .
因此,我们可以从您的问题中假设用户的 state is .Purchased 并且您将收到付款 . 现在,由于他们有收据,并且希望通过真实购买,他们将等待您在服务器上进行验证并解锁购买,因为他们已收到包含有关其购买数据的收据 .
b) Since receipts for consumable products compare only at the time of the purchase, how should the validation retry be managed? Should I save the receipt locally in order to retransmit it in the future? Can I simply does not mark the transaction as "finished"? From what I understand reading the documentation, in this case StoreKit should call the transaction queue observer again (passing again the receipt?) until the transaction is marked as "finished", is it correct?
您无需在本地存储,并在收据中存储有关购买的信息 . 这将保留,直到您的paymentObserver完成交易或收据再次刷新/更新 . 您的应用程序将继续尝试验证您的服务器,直到收到有关收据的回复,通常是当用户再次启动应用程序时,如果我们认为它是有效的,您启用您的产品,然后在此完成SKPaymentQueue上的交易 .
在它说的文档中
“购买时,可将消费品的应用内购买收据添加到收据中 . 它会保留在收据中,直到您的应用完成该交易 . 在此之后,下次更新收据时将从收据中删除“
另外:“例如,考虑用户在进入隧道之前在您的应用中购买东西的情况 . 您的应用无法提供已购买的内容,因为没有网络连接 . 下次启动应用程序时,StoreKit会再次调用您的事务队列观察器,并在此时提供所购买的内容 . 同样,如果您的应用程序未能将交易标记为已完成,则每次启动应用程序时,StoreKit都会调用观察者,直到交易正确完成为止 . “
我希望这有帮助,我希望它能回答你的问题 .