【问题标题】:Unable to finish unfinished transactions in payment queue无法完成支付队列中未完成的交易
【发布时间】:2014-04-12 09:12:18
【问题描述】:

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

  • 我已从 itunesconnect 中删除了该测试用户
  • 应用程序一启动,我就致电[[SKPaymentQueue defaultQueue] addTransactionObserver:self]
  • 输入特定测试用户的密码或点击取消后,未收到付款队列更新通知
  • [SKPaymentQueue defaultQueue].transactions.count 总是0,所以我无法手动完成未完成的事务
  • 我已从设备中删除应用程序,重新启动设备 - 仍然要求输入密码
  • 我正在从设置 -> iTunes 和 App Store 中注销用户
  • 取消询问密码的对话框后,不知何故我可以用另一个测试用户登录,但下次我仍然得到旧测试用户密码的对话框。

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

【问题讨论】:

  • 这似乎是沙盒中罕见的“无限循环”问题。
  • 你有第二个设备可以试试这个吗?您是否尝试过在 Xcode 中进行清理?在出现此问题之前,您可以尝试重新安装设备 iOS 或从备份中恢复 iTunes 吗?在飞行模式下会发生这种情况吗?
  • 遗憾的是没有其他设备。是的,我试图清理 Xcode。我目前无法恢复,并且在飞行模式下也不会发生。我打算联系苹果来清理这个无限循环
  • @pablo 你有没有找到任何解决方案...? Becoz 现在我也遇到同样的问题,我做了你上面所做的所有事情,但没有好运。
  • 为我的应用程序切换到其他包 ID。苹果承诺会回答,但从未给出任何答案。

标签: ios in-app-purchase storekit


【解决方案1】:

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

不要:

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

做:

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

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

【讨论】:

  • 我希望在删除我的沙盒用户之前在这里阅读您的评论 ;-)
  • 哇哈哈。是的,这就是我试图警告人们的事情。如果你这样做......非常糟糕的joujou。
  • 但问题是,即使我对所有事务调用完成,它也会在事务队列中保留很长时间。
  • ?不跟随。如果你完成了,那么它应该被清除。如果您仍然收到通知,则说明您没有完成所有交易。
  • 我认为您应该提到您应该完成事务,而不是通过等待回调,而是直接枚举队列中的事务。这是它对我有用的唯一方法。
【解决方案2】:

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

- (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 循环之前调用完成代码。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-04-02
      • 1970-01-01
      • 2020-10-01
      • 2013-07-28
      • 2020-08-06
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      相关资源
      最近更新 更多