SwiftyStoreKit: покупка запускает обратный вызов в AppDelegate

#ios #swift #in-app-purchase #storekit #swiftystorekit

#iOS #swift #покупка в приложении #storekit #swiftystorekit

Вопрос:

Я внедряю SwiftyStoreKit, чтобы помочь с покупками в приложении на iOS. У меня есть сервер, который настроен для проверки квитанций, поэтому я пытаюсь выполнить:

  1. Пользователь нажимает, чтобы купить продукт IAP
  2. В случае успеха квитанция извлекается и отправляется на сервер для проверки
  3. В случае успеха транзакция продукта IAP будет завершена
  4. Обновите пользовательский интерфейс.

После того, как пользователь нажимает на покупку, запускается функция, подобная этой:

 func purchase(productId: String) {

    SwiftyStoreKit.purchaseProduct(productId, quantity: 1, atomically: false) { result in

        switch result {

        case .success(let product):

            self.validateReceiptOnServer() { (success) in

                if product.needsFinishTransaction {
                    SwiftyStoreKit.finishTransaction(product.transaction)
                }

                if success {
                    self.updateUI()
                }
                else {
                    self.showError()
                }
            }

        case .error(let error):
            self.showError()
        }
    }
}
  

SwiftyStoreKit также предоставляет метод, который должен вызываться при первом запуске приложения. Это также указано в документах Apple. Для меня функция выглядит примерно так:

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    SwiftyStoreKit.completeTransactions(atomically: false) { purchases in

        for purchase in purchases {

            switch purchase.transaction.transactionState {

            case .purchased:

                self.validateReceiptOnServer() { (result) in

                    if purchase.needsFinishTransaction {
                        SwiftyStoreKit.finishTransaction(purchase.transaction)
                    }
                    switch result {
                    case .success: print("success validating receipt")
                    case .failure: print("failure validating receipt")
                    } 
                }

            case .restored:

                if purchase.needsFinishTransaction {
                    SwiftyStoreKit.finishTransaction(purchase.transaction)
                }

            case .failed, .purchasing, .deferred: break
            @unknown default: break
            }
        }
    }
    return true
}
  

Для обычных, непрерывных покупок эта настройка, похоже, работает нормально. Моя проблема в том, что при тестировании прерванных покупок после вызова SwiftyStoreKit.purchaseProduct вместо обратного вызова покупки каким-то образом запускается обратный вызов для SwiftyStoreKit.completeTransactions в didFinishLaunchingWithOptions. Я ожидаю, что это не предназначено, поскольку это делает продолжение работы с кодом в файле, который вызвал покупку, действительно громоздким.