Приложение продолжает запрашивать Apple ID после открытия просмотра с помощью SKPaymentTransactionObserver

Так что я знаю, что проблема в ViewController с IAP, но не знаю, как это исправить.

я добавить SKPaymentQueue.defaultQueue().addTransactionObserver(self) в viewDidLoad и иметь делегатов для класса; SKProductsRequestDelegate, SKPaymentTransactionObserver,

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

Но независимо от того, что пользователь делает, после загрузки IAPViewController приложение продолжает предлагать пользователю войти в систему. В основном, когда пользователь выходит из приложения, затем открывает его снова.

Я пытался добавить SKPaymentQueue.defaultQueue().removeTransactionObserver(self) при отклонении зрения, однако, это не похоже на работу.

У кого-нибудь есть предложения?? Мне пришлось вытащить мое приложение из обзора из-за этой ошибки:(

Вот полный код;

class IAPViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {

var productIDs: Array<String!> = []
var productsArray: Array<SKProduct!> = []

var selectedProductIndex: Int!
var transactionInProgress = false

override func viewDidLoad() {
    super.viewDidLoad()


    productIDs.append("com.COMPANY.NAME.BUY01")
    productIDs.append("com.COMPANY.NAME.BUY02")
    productIDs.append("com.COMPANY.NAME.BUY03")
    productIDs.append("com.COMPANY.NAME.BUY04")

    requestProductInfo()
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
 }

@IBAction func purchase04(sender: AnyObject) {

    selectedProductIndex = 0
    transactionAction()


}

@IBAction func restoreAction(sender: AnyObject) {
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}


    //StoreKit


    func transactionAction() {
        let payment = SKPayment(product: self.productsArray[self.selectedProductIndex] as SKProduct)
        SKPaymentQueue.defaultQueue().addPayment(payment)
        self.transactionInProgress = true

    }

    //Request Products
    func requestProductInfo() {
        if SKPaymentQueue.canMakePayments() {
            let productIdentifiers = NSSet(array: productIDs)
            let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)

            productRequest.delegate = self
            productRequest.start()

        }
        else {
            print("Cannot perform In App Purchases.")
        }

    }

    func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
        if response.products.count != 0 {
            for product in response.products {
                print("\(product.localizedTitle)")
                productsArray.append(product)
            }
        }
        else {
            print("There are no products.")
        }

        if response.invalidProductIdentifiers.count != 0 {
            print("\(response.invalidProductIdentifiers.description)")
        }

        print("Number of products in productsArray \(productsArray.count) - Number of products in productIDs \(productIDs.count)")

}


    //Payment Observer
    func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case SKPaymentTransactionState.Purchased:
                print("Transaction completed successfully.", terminator: "")
                self.deliverProduct(transaction)
                SKPaymentQueue.defaultQueue().finishTransaction(transaction)
                transactionInProgress = false

            case SKPaymentTransactionState.Failed:
                print("Transaction Failed", terminator: "");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction)
                transactionInProgress = false

            default:
                print(transaction.transactionState.rawValue, terminator: "")
            }
        }
    }

    func deliverProduct(transaction:SKPaymentTransaction) {

        if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY01"
        {
            print("Consumable Product 1 Purchased")

        }
        else if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY02"
        {
            print("Consumable Product 2 Purchased")
        }
        else if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY03"
        {
            print("Product 3 purchased")
        }
        else if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY04"
        {
            print("Product 4 purchased")
        }

    }

//Restore Purchases

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
    print("Transactions Restored")

    let purchasedItemIDS = []


    for transaction:SKPaymentTransaction in queue.transactions {

        if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY04"
        {
            print("Consumable Product Purchased")

        }

    }

    let alertController = UIAlertController(title: "Restored Purchases", message: "Your purchases have been restored. ", preferredStyle: .Alert)

    let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
        // ...
    }
    alertController.addAction(OKAction)

    self.presentViewController(alertController, animated: true) {
        // ...
    }

}

@IBAction func exit(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)

        SKPaymentQueue.defaultQueue().removeTransactionObserver(self)

}

}

1 ответ

Похоже, вы еще не звонили finishTransaction согласно документации здесь:

Транзакции остаются в очереди платежей до тех пор, пока они не будут удалены. StoreKit будет вызывать paymentQueue: updatedTransactions вашего наблюдателя: каждый раз, когда ваше приложение запускается или возобновляется из фона, пока они не будут удалены. В связи с этим ваших клиентов могут неоднократно просить подтвердить подлинность их покупок или лишить их возможности покупать ваши продукты.

Вызовите finishTransaction: для вашей транзакции, чтобы удалить ее из очереди. Завершенные транзакции не подлежат восстановлению. Поэтому обязательно предоставьте свой контент, загрузите весь размещенный в Apple контент продукта или завершите процесс покупки до завершения транзакции. См. Завершение транзакции для получения дополнительной информации.

Знаете ли вы, что один из двух звонков finishTransaction на самом деле работает?

Другие вопросы по тегам