【发布时间】:2015-12-13 22:01:35
【问题描述】:
我在 Swift 中使用 Xcode 7 和 SpriteKit 制作了一个游戏,我完成了它。在我将它提交给 iTunes Connect 后,Apple 拒绝了它,他们给我发了一条消息,他们说问题出在 Restore Purchase,但我把它和购买放在同一个按钮上,所以我做了一个有两个功能的按钮:
1. 购买,
2. 恢复购买。
当我对其进行测试时,它运行良好,当用户必须恢复购买时,他们不再付费。我不知道这是否可以被 Apple 接受。或者如果我忘记了要放的东西,请检查我的代码!
消息是:
来自苹果
缺少恢复机制
我们发现您的应用提供可恢复的应用内购买,但不包括允许用户恢复之前购买的应用内购买的“恢复购买”功能,如应用内购买编程指南的“恢复购买产品”部分
“用户恢复交易以保持对他们已经购买的内容的访问。例如,当他们升级到新手机时,他们不会丢失他们在旧手机上购买的所有物品。在你的应用程序让用户恢复他们的购买,例如恢复购买按钮。”
要恢复以前购买的应用内购买产品,最好提供一个“恢复”按钮并在用户点击“恢复”按钮时启动恢复过程。在购买按钮中包含恢复并不是一个足够的恢复机制。
我使用的代码是:
override func viewDidLoad() {
super.viewDidLoad()
func addTransactionObserver() {
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
}
func removeTransactionObserver() {
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
}
@IBAction func removeAds(sender: UIButton) {
print("Remove Ads Button pressed")
for product in list {
let prodID = product.productIdentifier
if(prodID == "Squares.RemoveAds") {
p = product
buyProduct()
break;
}
}
////SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
override func prefersStatusBarHidden() -> Bool {
return true
}
//Remove Ads Payment
var list = [SKProduct]()
var p = SKProduct()
//Squares.RemoveAds
func buyProduct() {
print("Buy" + p.productIdentifier)
let pay = SKPayment(product: p)
////SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
}
func productsRequest(request: SKProductsRequest, didReceiveResponse 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 as SKProduct)
}
removeAdsButton.enabled = true
removeAdsIPhone6Plus.enabled = true
}
func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
print("Transactions Restored")
var purchasedItemIDS = []
for transaction in queue.transactions {
let t: SKPaymentTransaction = transaction as SKPaymentTransaction
let prodID = t.payment.productIdentifier as String
switch prodID {
case ProductID.removeAds:
print("Remove Ads")
Ads.removeAllAds()
case ProductID.removeAds:
print("Remove Ads for iPhone 6 Plus")
Ads.removeAllAds()
default:
print("IAP not setup")
}
}
}
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("Buy, Ok unlock Squares here")
print(p.productIdentifier)
let prodID = p.productIdentifier as String
switch prodID {
case ProductID.removeAds:
print("Remove Ads")
Ads.removeAllAds()
case ProductID.removeAds:
print("Remove Ads for iPhone 6 Plus")
Ads.removeAllAds()
default:
print("IAP not Setup")
}
queue.finishTransaction(trans)
break;
case .Failed:
print("Buy Error")
queue.finishTransaction(trans)
break;
default:
print("Default")
break;
}
}
}
func finishTransaction(trans:SKPaymentTransaction){
print("Finish Transaction")
}
func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) {
print("Remove Transaction")
}
}
希望你的贡献能帮助到我。
【问题讨论】:
标签: in-app-purchase swift2 xcode7