Покупка в приложении iOS: состояние транзакции .purchased не вызывается в среде песочницы. - PullRequest
1 голос
/ 25 мая 2020

Я внедряю IAP в свое приложение. Когда я совершаю транзакцию в среде Sandbox, вызывается transactionState .purchasing, после чего приложение показывает мне успешную оплату, как показано на фото ниже. Однако transactionState .purchased не вызывается. Мне не удалось выполнить транзакцию.

Вот мой код:

class IAPHelper: NSObject {

// MARK: Variables
static let shared = IAPHelper()
private var productsRequest: SKProductsRequest?
private var productsRequestCompletionHandler: ProductsRequestCompletionHandler?

// MARK: Initialization
private override init() {
    super.init()
    SKPaymentQueue.default().add(self) //for SKPaymentTransactionObserver
    clearPendingTransaction()
}

deinit {
    SKPaymentQueue.default().remove(self)
}

// MARK: Functionalities
// The reason to implement and call this method here: https://stackoverflow.com/a/42790492/8120939
func clearPendingTransaction() {
    for transaction in SKPaymentQueue.default().transactions {
        SKPaymentQueue.default().finishTransaction(transaction)
    }
}

func requestProducts(productIdentifiers: Set<ProductIdentifier>, _ completionHandler: @escaping ProductsRequestCompletionHandler) {
    productsRequest?.cancel()
    productsRequestCompletionHandler = completionHandler

    productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers)
    productsRequest!.delegate = self
    productsRequest!.start()
}

public func buyProduct(_ product: SKProduct) {
    print("Buying \(product.productIdentifier)...")
    let payment = SKPayment(product: product)
    SKPaymentQueue.default().add(payment)
}

public func canMakePayments() -> Bool {
    return SKPaymentQueue.canMakePayments()
}

static func restorePurchases() {
    SKPaymentQueue.default().restoreCompletedTransactions()
}

}

enter image description here

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Использование шаблона проектирования Singleton будет решено

0 голосов
/ 25 мая 2020

Я использую queue.finishTransaction(transaction) в случаях .purchased, .restored и .failed. Сохранение только в .purchased и. restored. Думаю, вам нужно break только в случаях .purchasing и default.

...