iOS“此应用内购买已被购买”弹出窗口

Kar*_*arz 5 in-app-purchase ios swift

我的iOS应用程序出现问题:触摸“购买”按钮购买IAP产品时,将出现一个弹出窗口,显示以下消息:

此应用内购买已购买。它将免费恢复。

我以前从未出现过此弹出窗口,并且我的产品仅是非续订订阅,因此我想知道为什么在购买订阅时会出现此消息。

当我触摸确定以关闭此弹出窗口时,不会执行购买。

这是我的代码:

for transaction in transactions {
        switch transaction.transactionState {

        case SKPaymentTransactionState.Purchased, SKPaymentTransactionState.Restored:
            print("Transaction completed successfully.")
            SKPaymentQueue.defaultQueue().finishTransaction(transaction)
            transactionInProgress = false
            // Sauvegarde le produit acheté
            savePurchasedProduct(transaction.transactionDate!);
            break

        case SKPaymentTransactionState.Failed:
            print("Transaction Failed");
            SKPaymentQueue.defaultQueue().finishTransaction(transaction)
            transactionInProgress = false
            break

        default:
            break
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mau*_*iya 6

我们还可以使用以下方法获取所有交易并将其标记为已完成。

您可以在viewdidload方法中添加以下代码。

for transactionPending in SKPaymentQueue.default().transactions {
        SKPaymentQueue.default().finishTransaction(transactionPending)
    }
Run Code Online (Sandbox Code Playgroud)

我尝试了很多其他解决方案,但这对我有用。所以,现在我可以多次购买产品。


小智 5

我遇到过同样的问题。已在此处修复:
我的IAP无法正常工作。功能付款队列中的错误

这是我找到的解决方案:

删除

SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
Run Code Online (Sandbox Code Playgroud)

到处都可以找到它,并将它放置一次(仅一次)在每次应用启动时都会执行的位置(我将其放置在viewDidLoad()中)。

这将检查所有未完成的交易,并在应用程序加载后终止它们,从而在用户触发IAP之前消除任何可能的错误。

PS:另外,这不是我的问题,但请确保为每个PurchaseState完成finishTransaction(),如下所示:

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    print("Add Payment")

    for transaction:AnyObject in transactions{
        let trans = transaction as! SKPaymentTransaction
        print(trans.error)
        switch trans.transactionState{
        case .Purchased:
            print("IAP unlocked")
            print(p.productIdentifier)

            let prodID = p.productIdentifier as String
            switch prodID{
            case "IAP id":
                print("Keep on")
                keepOn()
            default:
                print("IAP not setup")
            }
            queue.finishTransaction(trans)
            break
        case .Failed:
            print ("Buy error")
            queue.finishTransaction(trans)
            break
        default:
            print("default: Error")
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

永远不要忘记这一点:

queue.finishTransaction(trans)  
Run Code Online (Sandbox Code Playgroud)

  • 这非常有帮助,谢谢![Ray Wenderlich的IAP教程] [1]所建议的方法存在问题,导致某些交易被“挂起”在默认队列中,因此“此应用程序内购买已被购买。免费恢复。” 警报,这对于消耗性IAP尤其麻烦。[1]:https://www.raywenderlich.com/127423/in-app-purchases-tutorial: (3认同)
  • 相同教程的相同问题。修改后,如何完成待处理的事务并正常执行新代码? (2认同)
  • 它根本不起作用。我只添加了一次观察者。收到消息后,它不会恢复交易并放弃它 (2认同)
  • [Apple 的 IAP 文档](https://developer.apple.com/library/archive/technotes/tn2387/_index.html) 建议在应用启动时在 AppDelegate 中添加事务观察器** (2认同)