用户恢复交易以维持对已购买内容的访问权限。例如,当他们升级到新手机时,他们不会丢失他们在旧手机上购买的所有商品。在您的应用中包含一些机制,让用户恢复购买,例如Restore Purchases
按钮。恢复购买会提示用户的App Store凭据,这会中断您的应用流量:因此,请勿自动恢复购买,尤其是每次启动应用时都不会。
在大多数情况下,您的所有应用程序需要刷新收据并在收据中交付产品。刷新的收据包含用户在此应用程序,此设备或任何其他设备上购买的记录。但是,由于以下原因之一,某些应用需要采用其他方法:
- 如果您使用Apple托管的内容,则恢复已完成的交易会为您的应用程序提供用于下载内容的交易对象。
- 如果您需要支持早于iOS 7的iOS版本(应用程序收据不可用),请恢复已完成的交易。
- 如果您的应用使用非续订订阅,则您的应用负责恢复过程。
刷新收据会向App Store询问收据的最新副本。 刷新收据不会创建任何新交易。 虽然您应该避免连续多次刷新,但此操作与仅刷新一次的结果相同。
恢复已完成的事务会为用户完成的每个已完成事务创建一个新事务,实质上是为事务队列观察者重放历史记录。 在恢复事务时,您的应用程序会维护自己的状态,以跟踪恢复已完成事务的原因以及如何处理它们。 多次还原会为每个已完成的事务创建多个已还原的事务。
注意:如果用户尝试购买已购买的产品,而不是使用应用程序的恢复界面,则App Store会创建常规事务而不是恢复事务。 不再向用户收取产品费用。 处理这些交易的方式与处理原始交易的方式完全相同。
为用户提供对重新下载的内容的适当控制级别。 例如,不要一次下载三年的日报或数百兆的游戏关卡。
创建收据刷新请求,设置委托,然后启动请求。 该请求支持在测试期间以各种状态获取收据的可选属性,例如过期收据 - 有关详细信息,请参阅SKReceiptRefreshRequest的initWithReceiptProperties:方法的值。
request = [[SKReceiptRefreshRequest alloc] init];
request.delegate = self;
[request start];
收据刷新后,检查并交付任何已添加的产品。
您的应用程序通过调用SKPaymentQueue的restoreCompletedTransactions方法启动该过程。 这会向App Store发送请求,以恢复所有应用已完成的交易。 如果您的应用为其支付请求的applicationUsername
属性设置了值,如Detecting Irregular Activity中所述,请使用restoreCompletedTransactionsWithApplicationUsername:方法在还原事务时提供相同的信息。
App Store为先前完成的每个事务生成新事务。 已还原的事务具有对原始事务的引用:SKPaymentTransaction的实例具有originalTransaction属性,并且收据中的条目具有Original Transaction Identifier
字段。
注意:日期字段对恢复购买的含义略有不同。 有关详细信息,请参阅Receipt Validation Programming Guide中的
Purchase Date and Original Purchase Date
字段。
对于每个恢复的事务,将调用状态为SKPaymentTransactionStateRestored的事务队列观察器,如Waiting for the App Store to Process Transactions中所述。 您此时采取的操作取决于您的应用程序的设计。
- 如果您的应用使用应用收据并且没有Apple托管的内容,则不需要此代码,因为您的应用无法恢复已完成的交易。 立即完成任何恢复的事务。
- 如果您的应用使用应用收据并且拥有Apple托管的内容,请让用户在开始恢复过程之前选择要恢复的产品。 在恢复期间,重新下载用户选择的内容并立即完成任何其他事务。
NSMutableArray *productIDsToRestore = <# From the user #>;
SKPaymentTransaction *transaction = <# Current transaction #>;
if ([productIDsToRestore containsObject:transaction.transactionIdentifier]) {
// Re-download the Apple-hosted content, then finish the transaction
// and remove the product identifier from the array of product IDs.
} else {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- 如果您的应用不使用应用收据,则会在恢复后检查所有已完成的交易。 它使用与原始购买逻辑类似的代码路径来使产品可用,然后完成交易。
具有多个产品的应用程序(尤其是具有相关内容的产品)允许用户选择要恢复的产品,而不是一次性恢复所有产品。 这些应用程序会跟踪哪些已完成的事务在恢复时需要处理,哪些事务可以通过立即完成来忽略。