在 App Purchase 中不恢复与沙盒用户的交易
In App Purchase not restoring transactions with sandbox user
根据我的研究,这似乎是一个常见问题
这一切都是在真实设备上完成的。
我的应用程序购买了应用内购买,但是当我恢复应用内购买时它没有反应。
接下来,
@IBAction func RestoreItem(_ sender: Any) {
SKPaymentQueue.default().restoreCompletedTransactions()
print("RESTORING PURCHASES")
}
它应该调用 products request
然后 payment queue
函数。
我读过,如果 iTunes 帐户不包含未调用的购买。
如果我 运行 该应用程序并购买了该应用程序购买的每件商品,并且说这些商品之前已经购买过,所以它知道购买历史记录
我不明白的是,如果知道商品已购买,它在调用该函数后不会做出反应(如上所示)。
如果我在我的设备上完全注销我的 iTunes 帐户并触发上面的操作,它会要求我登录我的帐户。我这样做(我之前购买的同一个帐户)并且它不会触发 product request
(我到处都有 NSlog
语句以查看我处于什么状态)
任何想法,因为我已经为此苦苦挣扎了好几天。
谢谢
我已经在下面添加了代码,这适用于购买(仅供参考)。
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print("product request")
let myProduct = response.products
for product in myProduct {
print("product added")
print(product.productIdentifier)
print(product.localizedTitle)
print(product.localizedDescription)
print(product.price)
list.append(product)
}
}
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("add payment")
for transaction: AnyObject in transactions {
let trans = transaction as! SKPaymentTransaction
print(trans.error as Any)
switch trans.transactionState {
case SKPaymentTransactionState.purchased:
print("buy ok, unlock IAP HERE")
print(p.productIdentifier)
let prodID = p.productIdentifier
switch prodID {
case "com.clivedancey.social":
print("Social Reality Unlocked")
outBuySocial.setTitle("Social Reality Enabled", for: UIControlState.normal)
SocialReality()
case "com.clivedancey.inapp":
print("MAIN UPGRADE UNLOCKED")
outBuyMain.setTitle(" Main Upgrade Complete", for: UIControlState.normal)
mainunlock()
default:
print("IAP not setup")
}
queue.finishTransaction(trans)
case SKPaymentTransactionState.restored:
print("buy ok, unlock IAP HERE")
print(p.productIdentifier)
let prodID = p.productIdentifier
switch prodID {
case "com.clivedancey.social":
print("Social Reality Unlocked")
outBuySocial.setTitle("Social Reality Enabled", for: UIControlState.normal)
SocialReality()
outTransactionLabel.text = " Purchases restored"
case "com.clivedancey.inapp":
print("MAIN UPGRADE UNLOCKED")
outBuyMain.setTitle(" Main Upgrade Complete", for: UIControlState.normal)
outTransactionLabel.text = " Purchases restored1"
mainunlock()
default:
print("IAP not setup")
}
queue.finishTransaction(trans)
case.failed:
print("buy error")
queue.finishTransaction(trans)
break
default:
print("Default")
break
}
}
}
几件事。首先 - 希望不重要 - 是你在 中使用 "react" 但是当我恢复应用程序内购买时它没有反应 。我希望你不要意思是永远不会命中断点。
我的 StoreKit 代码有两件事我在你发布的代码中没有看到。
(1) 在 viewDidLoad
我检查购买并存储它:
func fetchAvailableProducts() {
productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
productsRequest.delegate = self
productsRequest.start()
}
public func productsRequest (_ request:SKProductsRequest, didReceive response:SKProductsResponse) {
if (response.products.count > 0) {
iapProducts = response.products
}
}
值得注意的是将视图控制器设置为委托 - 我在您的代码中没有看到这一点。 (虽然逻辑听起来不错。)
(2)我的恢复购买多了一行代码:
func restorePurchases() {
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}
根据我的研究,这似乎是一个常见问题
这一切都是在真实设备上完成的。
我的应用程序购买了应用内购买,但是当我恢复应用内购买时它没有反应。
接下来,
@IBAction func RestoreItem(_ sender: Any) {
SKPaymentQueue.default().restoreCompletedTransactions()
print("RESTORING PURCHASES")
}
它应该调用 products request
然后 payment queue
函数。
我读过,如果 iTunes 帐户不包含未调用的购买。
如果我 运行 该应用程序并购买了该应用程序购买的每件商品,并且说这些商品之前已经购买过,所以它知道购买历史记录
我不明白的是,如果知道商品已购买,它在调用该函数后不会做出反应(如上所示)。
如果我在我的设备上完全注销我的 iTunes 帐户并触发上面的操作,它会要求我登录我的帐户。我这样做(我之前购买的同一个帐户)并且它不会触发 product request
(我到处都有 NSlog
语句以查看我处于什么状态)
任何想法,因为我已经为此苦苦挣扎了好几天。 谢谢
我已经在下面添加了代码,这适用于购买(仅供参考)。
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print("product request")
let myProduct = response.products
for product in myProduct {
print("product added")
print(product.productIdentifier)
print(product.localizedTitle)
print(product.localizedDescription)
print(product.price)
list.append(product)
}
}
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("add payment")
for transaction: AnyObject in transactions {
let trans = transaction as! SKPaymentTransaction
print(trans.error as Any)
switch trans.transactionState {
case SKPaymentTransactionState.purchased:
print("buy ok, unlock IAP HERE")
print(p.productIdentifier)
let prodID = p.productIdentifier
switch prodID {
case "com.clivedancey.social":
print("Social Reality Unlocked")
outBuySocial.setTitle("Social Reality Enabled", for: UIControlState.normal)
SocialReality()
case "com.clivedancey.inapp":
print("MAIN UPGRADE UNLOCKED")
outBuyMain.setTitle(" Main Upgrade Complete", for: UIControlState.normal)
mainunlock()
default:
print("IAP not setup")
}
queue.finishTransaction(trans)
case SKPaymentTransactionState.restored:
print("buy ok, unlock IAP HERE")
print(p.productIdentifier)
let prodID = p.productIdentifier
switch prodID {
case "com.clivedancey.social":
print("Social Reality Unlocked")
outBuySocial.setTitle("Social Reality Enabled", for: UIControlState.normal)
SocialReality()
outTransactionLabel.text = " Purchases restored"
case "com.clivedancey.inapp":
print("MAIN UPGRADE UNLOCKED")
outBuyMain.setTitle(" Main Upgrade Complete", for: UIControlState.normal)
outTransactionLabel.text = " Purchases restored1"
mainunlock()
default:
print("IAP not setup")
}
queue.finishTransaction(trans)
case.failed:
print("buy error")
queue.finishTransaction(trans)
break
default:
print("Default")
break
}
}
}
几件事。首先 - 希望不重要 - 是你在 中使用 "react" 但是当我恢复应用程序内购买时它没有反应 。我希望你不要意思是永远不会命中断点。
我的 StoreKit 代码有两件事我在你发布的代码中没有看到。
(1) 在 viewDidLoad
我检查购买并存储它:
func fetchAvailableProducts() {
productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
productsRequest.delegate = self
productsRequest.start()
}
public func productsRequest (_ request:SKProductsRequest, didReceive response:SKProductsResponse) {
if (response.products.count > 0) {
iapProducts = response.products
}
}
值得注意的是将视图控制器设置为委托 - 我在您的代码中没有看到这一点。 (虽然逻辑听起来不错。)
(2)我的恢复购买多了一行代码:
func restorePurchases() {
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}