如何恢复已中止的iOS应用程序购买过程?

如何恢复已中止的iOS应用程序购买过程?,ios,objective-c,in-app-purchase,storekit,Ios,Objective C,In App Purchase,Storekit,我正在通过服务器验证实施iOS 7+应用程序内购买(耗材,如金币)。工作流程是标准的: 购买: [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; SKPayment* payment = [SKPayment paymentWithProduct:productToBuy]; [[SKPaymentQueue defaultQueue] addPayment:payment]; 收听购买成功事件: -(void)paym

我正在通过服务器验证实施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,因此,这不是一个好的解决方案。

    难道你不能让客户端应用程序联系你控制的服务器,看看是否有任何待验证的收据吗?@ArtOfWarfare问题是服务器可能不知道是否有待验证的购买。例如,用户成功购买,但服务器已关闭。好的。。。那么,你的场景是客户端应用程序向苹果服务器发送请求,但客户端应用程序由于失去连接而从未收到苹果服务器的回复?这似乎是一个难以置信的不可能的情况。难道你不能将等待苹果服务器响应的数据存储在客户端应用程序中吗?如果在启动时发现它正在等待,它可以弹出一条消息给用户解释情况,然后弹出请求他们登录iTunes。否。正如我所写的,我正在实现收据的服务器验证。流程是:1。用户进行购买。2.我把苹果退回的购货收据发送到out服务器进行验证。3.如果服务器返回购买有效,我将使用该购买。我的问题是,如果(3)由于某种原因没有发生(例如我们的服务器关闭),我应该怎么做。然后存储收据,直到您的服务器重新联机并能够验证它?