无法在付款队列中完成未完成的交易

时间:2014-04-12 09:12:19

标签: ios in-app-purchase storekit

我的应用程序在IAP沙箱中进入了一些奇怪的状态...每次启动应用程序时都会询问特定测试用户的密码。我想由于未完成的交易。我真的想完成那笔交易,但这是不可能的。一些背景信息以及我为此所做的事情:

  • 我已从itunesconnect
  • 删除了该测试用户
  • 应用程序启动后,我致电[[SKPaymentQueue defaultQueue] addTransactionObserver:self]
  • 在我输入特定测试用户的密码或点击取消
  • 后,未收到任何付款队列更新通知
  • [SKPaymentQueue defaultQueue].transactions.count始终为0,因此我无法手动完成未完成的交易
  • 我已从设备删除应用,重新启动设备 - 仍然要求输入密码
  • 我从“设置”中退出用户 - > iTunes& App Store
  • 在我取消要求输入密码的对话框之后,我能够以其他方式登录其他测试用户,但下次我仍然会收到旧测试用户密码的对话框。

唯一要做的就是更改捆绑包ID,这在我的情况下是不可取的。希望有人知道如何摆脱未完成的交易。

3 个答案:

答案 0 :(得分:9)

我把它放在这里是因为有很多非常糟糕的错误答案提供了关于如何解决这个问题的错误信息。它不是那么罕见,或神秘或Apple漏洞,它是App商店设计的一部分,可帮助您正确构建IAP。

请勿:

  • 曾经永远删除沙盒测试用户。这使得无法解决问题,你将进入 无限循环 地狱,直到交易最终消失......它确实消失但需要很长时间,比如几天或几周。
  • 如果您删除沙箱测试用户,则随后会反复提示您(例如,您的应用程序每次设置IAP)以登录测试用户商店帐户 完成 交易,你不能因为用户已被删除。您也无法添加测试用户,因为开发人员门户会说用户ID已经 已经使用
  • 请勿: 删除应用 重新安装iOS 或任何其他此类BS。它没有效果,没有解决问题,浪费了很多时间。

<强> DO:

  • 在所有交易中调用 FINISH 。如果由于某种原因中断了一个,只需在App的后续运行中完成。该应用程序将重复发送付款队列通知,直到您致电完成为止,让您有机会致电[[SKPaymentQueue defaultQueue] finishTransaction:transaction];这是故意的,并预防中断的交易。

就是这样!完成所有交易,否则每次你的应用程序在该设备上启动时,你都会被发送到无尽循环地狱,重复请求登录一个不存在的测试用户App Store帐户:(

答案 1 :(得分:0)

您可能需要重复这些步骤几次才能正常工作。 调用事务观察者委托方法后立即完成事务。

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{    
    for (SKPaymentTransaction *transaction in transactions) {

        // Temporary code to solve the loop issue
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

        /*
        switch (transaction.transactionState) {
        // Call the appropriate custom method.
        case SKPaymentTransactionStatePurchased:
            [self completeTransaction:transaction];
            break;
        case SKPaymentTransactionStateFailed:
            [self failedTransaction:transaction];
            break;
        case SKPaymentTransactionStateRestored:
        default:
            break;
        }
        */
    }
}

现在您运行应用程序并使用已删除的沙盒帐户登录。上述方法应立即触发并完成交易。如果transactions数组为nil,请尝试在FOR循环之前调用完成代码。

答案 2 :(得分:0)

通过调用以下代码执行一次,我再次使用它。最后一次可能会要求您输入密码,但在执行代码后,“驱魔”已完成,您可以再次删除该代码。

#ifdef DEBUG
    for (SKPaymentTransaction *transaction in [[SKPaymentQueue defaultQueue] transactions]) {
        NSLog(@"finish transactions pending sind last load...");
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }
#endif