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)
我们还可以使用以下方法获取所有交易并将其标记为已完成。
您可以在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)