如何使用特定数据处理中断的应用内购买

How to handle an interrupted in-app purchase with specific data

我想设置消耗品应用内购买,为我的应用中的特定活动购买虚拟门票。当他们买票时,我会向我的服务器发送一条消息,以在数据库中为特定事件 ID 添加他们的用户 ID。将有许多事件用户可以购买消费票。

我知道 SKPaymentTransactionObserver 处理事务的子类的必要性。

但是,如果出现问题(应用程序后台运行、电池没电、互联网连接中断),SKPaymentTransactionObserver 将发送交易,直到我调用 -finishTransaction。在这种情况下,我如何知道他们为哪个事件 ID 购买了消耗品?是否有我可以附加到交易的有效负载?

不幸的是,没有正式的方法可以将负载添加到支付请求中。如果您为每个事件提供消耗品,您可以检查产品 ID,但我认为为每个可能的事件提供和维护消耗品会有点过分。

您可以为此尝试滥用 applicationUsername 字段。但是,根据 Apple 的文档(见下文)以及它不能保证持续存在的事实,我不建议这样做。

The applicationUsername property is not guaranteed to persist between when you add the payment transaction to the queue and when the queue updates the transaction. Do not attempt to use this property for purposes other than providing fraud detection.

另一种方法是记住每个创建的交易映射到字典中的事件 ID,并在交易成功后,查看该字典以查找相应的事件 ID。只要应用程序不重新启动,这就有效。您还可以记住用户默认值中交易和事件 ID 之间的映射。