2017-10-10 4 views
0

J'essaie de tester mes achats intégrés et lorsque je l'achète, j'obtiens la boîte de connexion encore et encore. Son est mon aideBoîte de dialogue Ouverture de session continue pour les tests Sandbox

import Foundation 
import StoreKit 

class IAPHelper: NSObject { 
    private final let productIdentifiers: Set<String> = ["non-consumable"] 
    static let sharedIntance = IAPHelper() 

    private var request: SKProductsRequest! 
    private var products: [SKProduct] = [] 

    func performProductRequestForIdentifiers() { 
     request = SKProductsRequest(productIdentifiers: productIdentifiers) 
     request.delegate = self 
     request.start() 
    } 

    func setupPurchases(_ handler: @escaping (Bool) -> Void) { 
     if SKPaymentQueue.canMakePayments() { 
      handler(true) 
      SKPaymentQueue.default().add(self) 
      return 
     } 
     handler(false) 
    } 

    func createPaymentRequestForProduct() { 
     guard let product = products.first else { return } 
     print(product.localizedTitle) 
     let payment = SKMutablePayment(product: product) 
     payment.quantity = 1 
     SKPaymentQueue.default().add(payment) 
    } 
} 

extension IAPHelper: SKProductsRequestDelegate { 
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { 
     products = response.products 
    } 
} 

extension IAPHelper: SKPaymentTransactionObserver { 
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
     for transaction in transactions { 
      switch transaction.transactionState { 
      case .purchasing: 
       print("purchasing") 
       break 
      case .purchased: 
       print("purchased") 
       queue.finishTransaction(transaction) 
       break 
      case .failed: 
       print("failed") 
       queue.finishTransaction(transaction) 
       break 
      case .restored: 
       print("restored") 
       queue.finishTransaction(transaction) 
       break 
      case .deferred: 
       print("deferred") 
       break 
      } 
     } 
    } 
} 

Dans l'App-délégué, je vérifie la capacité de faire des achats et commencer un observateur

IAPHelper.sharedIntance.setupPurchases { (success) in 
    if success { 
     IAPHelper.sharedIntance.performProductRequestForIdentifiers()     
    } 
} 

Et dans ma principale ViewControoller dans un UIButton j'appelle IAPHelper.sharedIntance.createPaymentRequestForProduct()

J'ai mon utilisateur sandbox fait en connect et l'achat in-app réalisé en connect aussi. Je suis déconnecté de mon compte réel sur mon iPhone et connecté avec le bac à sable. Toute aide est la bienvenue.

Répondre

0

Je pense que votre code a quelque chose de mal, en particulier dans la partie où vous ajoutez le SKPaymentTransactionObserver.

Votre fonction ci-dessous est un peu bizarre:

func setupPurchases(_ handler: @escaping (Bool) -> Void) { 
     if SKPaymentQueue.canMakePayments() { 
      handler(true) 
      SKPaymentQueue.default().add(self) 
      return 
     } 
     handler(false) 
    } 

Ce que je vous suggère de faire est la suivante:

func setupPurchases() { 
     SKPaymentQueue.default().add(self) 
} 

et puis ajoutez le code ci-dessous à la classe AppDelegate, à l'intérieur du didFinishLaunchingWithOptions méthode:

IAPHelper.sharedIntance.setupPurchases() 

Espérons que cela résoudra le problème.