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

时间:2015-11-30 15:17:01

标签: ios swift in-app-purchase

我的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
        }
    }

3 个答案:

答案 0 :(得分:5)

我有同样的问题。修正了这里:
My IAP isn't working. Bugs at func Paymentqueue

这是我找到的解决方案:

删除

var url = data.url;
console.log(url.substring(0, url.lastIndexOf('.')));

无处不在,你拥有它,并把它一次(仅一次)在它每次都会被执行的地方你的应用程序启动时(我把它放在viewDidLoad中())。

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

P.S。:另外,这不是我的问题,但请确保为每个PurchaseState完成事务处理(),如下所示:

SKPaymentQueue.defaultQueue().addTransactionObserver(self) 

永远不要忘记:

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
        }
    }
}

答案 1 :(得分:1)

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

您可以使用viewdidload方法添加以下代码。

for transactionPending in SKPaymentQueue.default().transactions {
        SKPaymentQueue.default().finishTransaction(transactionPending)
    }

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

答案 2 :(得分:0)

我对非定期订阅有相同的问题。有人说它已经被购买了,它将免费恢复,但不允许我再购买另一个订阅扩展。

部分问题是我的交易切换逻辑:

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case .purchased:
                complete(transaction: transaction)
            case .restored:
                restore(transaction: transaction)
                break
...

购买的情况是我打电话给

        SKPaymentQueue.default().finishTransaction(transaction)

但对于.restored来说,我从来没有称其为finishTransaction。在开发过程中,我一定以某种方式错过了finishTransaction,并且有一个我从未完成的“排队”中。

我的解决方法是将我的restoreTransaction修改为(确保在我的许可证对象中记录了预订之后)调用.finishTransaction。我检查了是否没有重复订阅检查唯一的交易ID。

然后我尝试再购买2次。交易第一次完成,第二次我可以再次购买!

相关问题