title: In-App Purchase Works on iPhone but not iPad
body: <p>I'm having an issue with In-App purchases on iOS. I have 5 In-App Purchases in a game, all of which work exactly as expected when tested on an iPhone 6 (iOS 8.3). When I go to test on iPad Air 2 (iOS 8.2), all IAPs fail immediately. Has anyone else experienced this problem? Is there some code that is specific to iPad that I have to add?</p>
  
  <p>EDIT: Strangely, updating the iPad to iOS 8.3 fixed the problem. Any ideas as to why this issue is occurring? Should I change my app to only support iOS 8.3 and above?</p>
  
  <p>To test the app, I'm using TestFlight, the same network connection, and the same Apple ID.</p>
  
  <p>The code I'm using for In-App Purchases is Below:</p>
  
  <pre><code>func inApp() {
      if (SKPaymentQueue.canMakePayments())
      {
          var productID:NSSet = NSSet(object: product_id);
          var productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as Set&lt;NSObject&gt;);
          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&gt;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;
              }
          }
      }
  }
  </code></pre>