Sto riscontrando un problema con gli acquisti in-app su iOS. Ho 5 acquisti in-app in un gioco, i quali funzionano esattamente come previsto quando vengono testati su un iPhone 6 (iOS 8.3). Quando vado a testare su iPad Air 2 (iOS 8.2), tutti gli IAP falliscono immediatamente. Qualcun altro ha avuto questo problema? C'è un codice specifico per iPad che devo aggiungere?L'acquisto in-app funziona su iPhone ma non su iPad
MODIFICA: Stranamente, l'aggiornamento dell'iPad su iOS 8.3 ha risolto il problema. Qualche idea sul perché questo problema si sta verificando? Devo cambiare la mia app per supportare solo iOS 8.3 e versioni successive?
Per testare l'app, sto utilizzando TestFlight, la stessa connessione di rete e lo stesso ID Apple.
Il codice che sto utilizzando per acquisti in-app è qui sotto:
func inApp() {
if (SKPaymentQueue.canMakePayments())
{
var productID:NSSet = NSSet(object: product_id);
var productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as Set<NSObject>);
productsRequest.delegate = self;
productsRequest.start();
}else{
displayAlert()
}
}
func buyProduct(product: SKProduct){
var payment = SKPayment(product: product)
SKPaymentQueue.defaultQueue().addPayment(payment);
}
func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
var count : Int = response.products.count
if (count>0) {
var validProducts = response.products
var validProduct: SKProduct = response.products[0] as! SKProduct
if (validProduct.productIdentifier == product_id) {
println(validProduct.localizedTitle)
println(validProduct.localizedDescription)
println(validProduct.price)
buyProduct(validProduct);
} else {
println(validProduct.productIdentifier)
}
} else {
displayAlert()
}
}
func request(request: SKRequest!, didFailWithError error: NSError!) {
self.displayAlert()
}
func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
for transaction:AnyObject in transactions {
if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
switch trans.transactionState {
case .Purchased:
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
if product_id == "com.shv.FrenzyTenLives" {
defaults.setInteger(10, forKey: "totalLives")
} else if product_id == "com.shv.FrenzyFiveLives" {
defaults.setInteger(5, forKey: "totalLives")
} else if product_id == "com.shv.FrenzyInfiniteLives" {
defaults.setBool(true, forKey: "infiniteLives")
} else if product_id == "com.shv.FrenzyShield" {
defaults.setInteger(5, forKey: "shieldValue")
} else if product_id == "com.shv.FrenzyRemoveAds" {
defaults.setBool(true, forKey: "adsRemoved")
adBanner.hidden = true
}
break;
case .Failed:
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
self.displayAlert()
break;
case .Restored:
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
if product_id == "com.shv.FrenzyTenLives" {
defaults.setInteger(10, forKey: "totalLives")
} else if product_id == "com.shv.FrenzyFiveLives" {
defaults.setInteger(5, forKey: "totalLives")
} else if product_id == "com.shv.FrenzyInfiniteLives" {
defaults.setBool(true, forKey: "infiniteLives")
} else if product_id == "com.shv.FrenzyRemoveAds" {
defaults.setBool(true, forKey: "adsRemoved")
adBanner.hidden = true
}
break;
default:
break;
}
}
}
}
Usi Sandbox Tester? Utilizzi lo stesso account sui tuoi dispositivi? – Krivoblotsky
Definire "fail immediato". Mostra codice o messaggi di errore (o entrambi). Confermare che il dispositivo ha accesso alla rete, login utente sandbox appropriato (come indicato da @Krivoblotsky), ecc. –
Ho aggiornato la domanda per includere il codice e la risposta alla domanda di @Krivoblotsky. –