Мой IAP не работает. Ошибки в func Paymentqueue

Когда я нажимаю на один из моих IAPS, появляется сообщение о том, что IAP уже был куплен (что не так) и будет восстановлен бесплатно, тогда ничего не произойдет, IAP не будет выполнен.

Вот что я получаю в консоли:

No Value. IAP is enabled, loading... true Product Request Product Added IAP id Remove Ads Removes ads from the app. 2 Buy: IAP id Add Payment nil default: Error 

Вот мой код:

GameViewController.Swift

 import UIKit import StoreKit class GameViewController: UIViewController, ADBannerViewDelegate, SKProductsRequestDelegate, SKPaymentTransactionObserver, GKGameCenterControllerDelegate,GADBannerViewDelegate{ @IBOutlet var outRemoveAds: UIButton! @IBOutlet var outRestorePurchases: UIButton! override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) if NSUserDefaults.standardUserDefaults().objectForKey("val") != nil { print("Has a value.") banner.removeFromSuperview() bannerGoogle.removeFromSuperview() outRemoveAds.removeFromSuperview() outRestorePurchases.removeFromSuperview() removeInterFrom = 1 } else { print("No Value.") } if(SKPaymentQueue.canMakePayments()){ print("IAP is enabled, loading...") let productID:NSSet = NSSet(objects:"IAP id") let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set) request.delegate = self request.start() } else{ print("Please enable IAPS") } } //IAP Ads @IBAction func removeAds(sender: UIButton) { for product in list{ let prodID = product.productIdentifier if (prodID == "IAP id"){ p = product buyProduct() break } } } @IBAction func restorePurchases(sender: UIButton) { SKPaymentQueue.defaultQueue().addTransactionObserver(self) SKPaymentQueue.defaultQueue().restoreCompletedTransactions() } //IAP Functions var list = [SKProduct]() var p = SKProduct() func removeAds(){ banner.removeFromSuperview() bannerGoogle.removeFromSuperview() outRemoveAds.removeFromSuperview() outRestorePurchases.removeFromSuperview() let theValue = 10 NSUserDefaults.standardUserDefaults().setObject(theValue, forKey: "val") NSUserDefaults.standardUserDefaults().synchronize() } 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) } } 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("IAP unlocked") print(p.productIdentifier) let prodID = p.productIdentifier as String switch prodID{ case "IAP id": print("Remove Ads") removeAds() default: print("IAP not setup") } queue.finishTransaction(trans) break case .Failed: print ("Buy error") queue.finishTransaction(trans) break default: print("default: Error") break } } } func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { print("Purchases Restored") _ = [] for transaction in queue.transactions { let t: SKPaymentTransaction = transaction as SKPaymentTransaction let prodID = t.payment.productIdentifier as String switch prodID{ case "IAP id": print("Remove Ads") removeAds() default: print("IAP not setup") } } } func finishTransaction(trans:SKPaymentTransaction){ print("Finshed Transaction") } func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) { print("Remove Transaction") } } 

MenuViewController.swift

 import UIKit import StoreKit import Social class MenuViewController: UIViewController, SKProductsRequestDelegate,SKPaymentTransactionObserver { @IBOutlet var outRestart: UIButton! @IBOutlet var outBuy: UIButton! override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) if(SKPaymentQueue.canMakePayments()){ print("IAP is enabled, loading...") let productID:NSSet = NSSet(objects:"IAP id") let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set) request.delegate = self request.start() } else{ print("Please enable IAPS") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func buy(sender: UIButton) { for product in list{ let prodID = product.productIdentifier if (prodID == "IAP id"){ p = product buyProduct() break } } } //IAP Functions var list = [SKProduct]() var p = SKProduct() func keepOn(){ buyornot = 1 Back() } 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) } } 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("IAP unlocked") print(p.productIdentifier) let prodID = p.productIdentifier as String switch prodID{ case "IAP id": print("Keep on") keepOn() default: print("IAP not setup") } queue.finishTransaction(trans) break case .Failed: print ("Buy error") queue.finishTransaction(trans) break default: print("default: Error") break } } } func finishTransaction(trans:SKPaymentTransaction){ print("Finshed Transaction") } func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) { print("Remove Transaction") } 

Я нашел решение!

Удалить

 SKPaymentQueue.defaultQueue().addTransactionObserver(self) 

везде, где у вас есть это, и поместите его один раз (ТОЛЬКО ОДИН РАЗ) в месте, где он будет выполняться каждый раз, когда ваше приложение загружается (я положил его в viewDidLoad ()).

Это проверяет все незавершенные транзакции и завершает их после загрузки приложения, тем самым устраняя возможные ошибки до того, как ваши пользователи активируют IAP.

(Если этот ответ, или этот вопрос помог вам, не забудьте запереть;))

PS: Кроме того, это была не моя проблема, но обязательно завершитеTransaction () для каждого PurchaseState, как здесь:

 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("IAP unlocked") print(p.productIdentifier) let prodID = p.productIdentifier as String switch prodID{ case "IAP id": print("Keep on") keepOn() default: print("IAP not setup") } queue.finishTransaction(trans) break case .Failed: print ("Buy error") queue.finishTransaction(trans) break default: print("default: Error") break } } } 

Никогда не забывайте об этом:

  queue.finishTransaction(trans) 
  • Что такое строго типизированный вид в ASP.NET MVC
  • Android - в чем смысл StableID?
  • Listview itemclick не работает
  • Как показать кнопку в конце Android ListView
  • Android: Как получить пользовательский вид высоты и ширины?
  • Просмотр списка Android-файлов Drag and Drop
  • ASP.NET MVC - просмотр с несколькими моделями
  • как настроить listview row android
  • Как динамически удалять элементы из списка ListView при нажатии кнопки?
  • setEmptyView в ListView не показывает его вид в приложении для Android?
  • Показывать пустое представление, когда ListView пуст
  • Давайте будем гением компьютера.