我在iOS上的应用内购买有问题.我在游戏中有5个应用内购买,所有这些都在iPhone 6(iOS 8.3)上进行测试时正常工作.当我在iPad Air 2(iOS 8.2)上进行测试时,所有IAP都会立即失败.有没有人遇到这个问题?有没有一些特定于iPad的代码,我必须添加?
编辑:奇怪的是,将iPad更新到iOS 8.3修复了问题.关于为什么发生这个问题的任何想法?我应该将应用程序更改为仅支持iOS 8.3及更高版本?
要测试应用程序,我使用的是TestFlight,相同的网络连接和相同的Apple ID.
我在应用内购买中使用的代码如下:
- 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: "infiniteLives")
- } else if product_id == "com.shv.FrenzyRemoveAds" {
- defaults.setBool(true,forKey: "adsRemoved")
- adBanner.hidden = true
- }
- break;
- default:
- break;
- }
- }
- }
- }
解决方法
没有“立即失败”的定义,我最好的猜测是,您没有登录到iPad上的有效的沙盒测试帐户,并且在更新iOS版本的同时,这是为什么它工作在8.3.
让IAP测试工作的最简单方法是注销iTunes:
- Settings -> App and iTunes Store -> Tap apple ID and log out.
一旦您注销,尝试创建一个IAP,您将被提示登录 – 一旦您输入有效的测试帐户凭据,IAP将下载 – 如果没有,请在此发布您的日志文件.请注意,您可以在iTunes Connect中查找或创建测试帐户.
IAP是一个非常复杂的主题,具有许多故障点 – 知道您的IAP在一个设备上工作,但不是另一个指向特定于IAP失败的设备的配置问题.