@uzolenta

Как обработать in-app-purchase статус deferred?

Здравствуйте!
данный статус "deferred" же означает, что покупка совершена, но не закончена?

У Google, например, есть проблема, что пользователь начинает покупку, а заканчивает ее через долгое время (не знаю как так до сих пор), соответственно, приложение не дожидается ответа от Google и не может дальше зачислять внутренние монеты в приложении. У Apple такая же проблема есть?

Не понял, как поступать: https://developer.apple.com/documentation/storekit...
В основном везде примерно как и у меня код, без обработки этого статуса покупки:
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
        purchaseStatusBlock?(.restored)
    }
    
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction:AnyObject in transactions {
            if let trans = transaction as? SKPaymentTransaction {
                
                switch trans.transactionState {
                case .purchased:
                    print("purchased")
                    SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)
                    purchaseStatusBlock?(.purchased)
                    check()
                    break
                    
                case .failed:
                    print("failed")
                    SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)
                    break
                case .restored:
                    print("restored")
                    SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)
                    break
                    
                default: break
                }}}
    }


Разъясните, пожалуйста, как обрабатывать незавершенные транзакции.
  • Вопрос задан
  • 478 просмотров
Пригласить эксперта
Ответы на вопрос 2
YeahGarage
@YeahGarage
Developer
Интересно что опытные ребята ответят, я deferred отлавливаю только в данном варианте
extension IAPManager: SKPaymentTransactionObserver {
    
    
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        
        for transaction in transactions {
            switch transaction.transactionState {
            case .deferred: break
            case .purchasing: break
            case .failed: print("failed")
            case .purchased: print("purchased")
            case .restored: print("restored")
            }
        }
    }
    
}
Ответ написан
Комментировать
fury21
@fury21
Программирую на Swift
Может уже не актуально, но отвечу.

Если в делегате paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) попадается отложенная (deferred) транзакция, я показываю юзеру алерт, что покупка ушла на проверку "маме" и как только будет одобрена, тут же будет активирована и закрываю экран покупок.

Соответственно, как покупка будет одобрена, сработает этот же делегат, но уже с transactionState == .purchased и тут уже обрабатываете покупку, как обычно.

Замечу, что обязательно при старте приложения в AppDelegate в методе didFinishLaunchingWithOptions нужно подписывать на уведомления свой класс IAPPManager, например, так:

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

, что бы при старте приложения не пропустить одобренную, ту саму встроенную покупку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы