iOS "This in-app purchase has already been bought" 弹窗
iOS "This in-app purchase has already been bought" pop-up
我的 iOS 应用程序出现问题:当我触摸 'buy' 按钮购买 IAP 产品时,弹出窗口显示此消息:
This In-App purchase has already been bought. It will be restored for free.
我以前从来没有过这个弹窗,而且我的产品只是非续订订阅,所以我想知道为什么在购买订阅时会出现这个消息。
当我触摸确定关闭此弹出窗口时,购买并未执行。
这是我的代码:
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
}
}
我遇到了同样的问题。已在此处修复:
这是我找到的解决方案:
删除
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
你有它的任何地方,并将它放在每次你的应用程序启动时都会执行的地方一次(仅一次)(我把它放在 viewDidLoad() 中)。
这将检查所有未完成的交易并在应用加载后终止它们,从而在您的用户触发 IAP 之前消除任何可能的错误。
P.S.:此外,这不是我的问题,但请确保为每个 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
}
}
}
永远不要忘记这一点:
queue.finishTransaction(trans)
我在非定期订阅时遇到了同样的问题。说是已经购买了,会免费恢复,但不让我再买续费。
部分问题是我的事务切换逻辑:
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
...
对于案例 .purchased 我打电话给:
SKPaymentQueue.default().finishTransaction(transaction)
但是对于 case .restored 我从来没有调用过 finishTransaction。不知何故,在开发过程中,我一定错过了一个 finishTransaction 并且有一个我从未完成的 "in the queue"。
我的解决方法是将我的 restoreTransaction 修改为(在确保订阅记录在我的许可对象中之后)调用 .finishTransaction。我检查过我没有重复订阅检查唯一交易 ID。
然后我又尝试购买了2次。第一次成交,第二次又能买到!
我们还可以使用以下方法获取所有交易并将其标记为已完成。
您可以在 viewdidload
方法中添加以下代码。
for transactionPending in SKPaymentQueue.default().transactions {
SKPaymentQueue.default().finishTransaction(transactionPending)
}
我尝试了很多其他解决方案,但这适用于 me.So,现在我可以多次购买产品。
我的 iOS 应用程序出现问题:当我触摸 'buy' 按钮购买 IAP 产品时,弹出窗口显示此消息:
This In-App purchase has already been bought. It will be restored for free.
我以前从来没有过这个弹窗,而且我的产品只是非续订订阅,所以我想知道为什么在购买订阅时会出现这个消息。
当我触摸确定关闭此弹出窗口时,购买并未执行。
这是我的代码:
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
}
}
我遇到了同样的问题。已在此处修复:
这是我找到的解决方案:
删除
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
你有它的任何地方,并将它放在每次你的应用程序启动时都会执行的地方一次(仅一次)(我把它放在 viewDidLoad() 中)。
这将检查所有未完成的交易并在应用加载后终止它们,从而在您的用户触发 IAP 之前消除任何可能的错误。
P.S.:此外,这不是我的问题,但请确保为每个 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
}
}
}
永远不要忘记这一点:
queue.finishTransaction(trans)
我在非定期订阅时遇到了同样的问题。说是已经购买了,会免费恢复,但不让我再买续费。
部分问题是我的事务切换逻辑:
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
...
对于案例 .purchased 我打电话给:
SKPaymentQueue.default().finishTransaction(transaction)
但是对于 case .restored 我从来没有调用过 finishTransaction。不知何故,在开发过程中,我一定错过了一个 finishTransaction 并且有一个我从未完成的 "in the queue"。
我的解决方法是将我的 restoreTransaction 修改为(在确保订阅记录在我的许可对象中之后)调用 .finishTransaction。我检查过我没有重复订阅检查唯一交易 ID。
然后我又尝试购买了2次。第一次成交,第二次又能买到!
我们还可以使用以下方法获取所有交易并将其标记为已完成。
您可以在 viewdidload
方法中添加以下代码。
for transactionPending in SKPaymentQueue.default().transactions {
SKPaymentQueue.default().finishTransaction(transactionPending)
}
我尝试了很多其他解决方案,但这适用于 me.So,现在我可以多次购买产品。