我正在通过服务器验证在应用程序购买(消耗品,如金币)中实现iOS 7 . 工作流程是标准的:

  • 购买:
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
SKPayment* payment = [SKPayment paymentWithProduct:productToBuy];
[[SKPaymentQueue defaultQueue] addPayment:payment];
  • 听取购买成功事件:
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        if (transaction.transactionState == SKPaymentTransactionStatePurchased || transaction.transactionState == SKPaymentTransactionStateRestored)
        {
            NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL];

            if ([[NSFileManager defaultManager] fileExistsAtPath:[receiptUrl path]])
            {
                NSData *receiptData = [NSData dataWithContentsOfURL:receiptUrl];
                NSString *receiptStr = [receiptData base64EncodedStringWithOptions:0];
                // send receipt to our server for validation
                // MY QUESTION IS WHAT TO DO ON NEXT STARTUP IF CANNOT CONNECT TO OUR SERVER AT THIS POINT
                ...
  • 此时我们将购买收据发送到我们的服务器 . 如果服务器发现它有效,我们会消费购买:
for (SKPaymentTransaction* transaction in transactions)
{
    if ([[transaction transactionIdentifier] isEqualToString:transactionId])
    {
        currentTransaction = transaction;
        break;
    }
}

if (([currentTransaction transactionState] == SKPaymentTransactionStatePurchased || [currentTransaction transactionState] == SKPaymentTransactionStateRestored))
{
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] finishTransaction:currentTransaction];
    ...

我的问题是如果我们的服务器关闭/用户的手机在服务器验证时失去信号(在(3)处)该怎么办?在这种情况下,收据永远不会被验证,因此用户将处于卡住状态的购买 . (同样在我的测试中,我看到我的应用程序要求在这种情况下登录iTunes;但登录无效 . )

我尝试在每次启动时向支付队列添加一个观察者来检查未完成的交易,但这会要求用户登录iTunes,因此这不是一个好的解决方案 .