我在我的游戏中添加了一个非消耗品购买,用户可以在游戏中以 99 美分的价格购买一个角色。我还没有部署我的应用程序,但我需要先让付款工作,否则 App Store 不会接受它,所以我正在 Testflight 上进行测试。我看过很多关于如何购买物品的不同教程,但也有不同的方法。我想知道为什么购买有时只在我的应用程序中有效,因为我有一个朋友昨晚在 TestFlight 上对其进行了测试,但他无法打开支付窗口。他会按下“购买”按钮,但什么也没有发生,这是为什么呢?
这是当用户按下按钮购买角色时我调用的函数:
@objc func buyCharacterPressed(){ //Person clicks to buy the character!
print("in buyCharacter func")
guard let myProduct = myProduct else{
return
}
if SKPaymentQueue.canMakePayments() {
let payment = SKPayment(product: myProduct)
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().add(payment)
}
}
这是我的 productsRequest 函数:
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print("inside productsRequest func")
//print(response.products.first)
if let product = response.products.first{
myProduct = product
print(product.productIdentifier)
print(product.price)
print(product.localizedTitle)
print(product.localizedDescription)
}
}
这是我的 fetchProducts 函数(blablabla 是我在代码中购买的实际地址):
func fetchProducts(){
let request = SKProductsRequest(productIdentifiers: Set(["com.kylan.blablabla"]))
request.delegate = self
request.start()
}
最后是我的支付队列:
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchasing:
print("purchasing...")
characterInfoLabel1.text = "Purchasing..."
break
case .purchased, .restored:
//unlock their item
print("Item has been purchased!")
let defaults = UserDefaults()
defaults.set(true, forKey: "purchasedPhotoCharacter")
SKPaymentQueue.default().finishTransaction(transaction)
SKPaymentQueue.default().remove(self)
restorePurchasesButton.removeFromSuperview()
buyOrDoneButton.removeFromSuperview()
let CreateCharacterScene = CreateCharacter(size: scene!.size)
self.view?.presentScene(CreateCharacterScene)
HapticsManager.sharedInstance.selectionVibrate()
break
case .failed, .deferred:
SKPaymentQueue.default().finishTransaction(transaction)
SKPaymentQueue.default().remove(self)
characterInfoLabel1.text = "blablabla!"
print("payment .failed or .deferred")
break
default:
SKPaymentQueue.default().finishTransaction(transaction)
SKPaymentQueue.default().remove(self)
break
}
}
}
另外,我不确定我的 restorePurchases 按钮是否正确,我在网上看到了一些相互冲突的教程,并且它并不总是与 TestFlight 一起使用。有时按钮没有任何作用,我必须再次购买,但当我再次购买时,它说我已经购买了...这是功能,它的超级基本所以我希望有人知道我应该怎么做:
@objc func restorePurchases(){
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}
相互冲突的教程说我需要 .add(self) 但另一个说我只需要 restoreCompletedTransactions()。哪一个是对的??
非常感谢您阅读我的长问题,对不起,它太长了,但我想确保我做对了,这是我提交应用程序之前需要做的最后一件事!!!