SKPaymentQueue не будет сохранять транзакции в ваши UserDefaults.Однако в квитанции App Store сохраняется все, кроме покупок расходных материалов.И если шаг 5 не завершен, вы всегда можете повторить проверку квитанции от Apple, поскольку квитанция хранится на устройстве и переустанавливается при каждой переустановке приложения.
Используете ли вы какие-либо библиотеки, которые обрабатывают процесс оплаты?Основной процесс покупки выглядит следующим образом:
func makePurchase(product: SKProduct){
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
}
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch (transaction.transactionState) {
case .purchased:
SKPaymentQueue.default().finishTransaction(transaction)
handlePurchased()
break
case .failed:
SKPaymentQueue.default().finishTransaction(transaction)
break
case .restored:
SKPaymentQueue.default().finishTransaction(transaction)
handlePurchased()
break
case .deferred, .purchasing:
break
default:
break
}
}
}
func handlePurchased(){
guard let receiptUrl = Bundle.main.appStoreReceiptURL else {
// refresh receipt using SKReceiptRefreshRequest
return
}
#if DEBUG
let urlString = "https://sandbox.itunes.apple.com/verifyReceipt"
#else
let urlString = "https://buy.itunes.apple.com/verifyReceipt"
#endif
let receiptData = try? Data(contentsOf: receiptUrl).base64EncodedString()
let requestData = ["receipt-data" : receiptData ?? "", "password" : "YOUR_SHARED_SECRET", "exclude-old-transactions" : true] as [String : Any]
var request = URLRequest(url: URL(string: urlString)!)
request.httpMethod = "POST"
request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: [])
request.httpBody = httpBody
URLSession.shared.dataTask(with: request) { (data, response, error) in
DispatchQueue.main.async {
if data != nil, let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) {
// parse your receipt data here, get expires date for subscription or whatever your in-app type is.
} else {
// Error occurred while validating receipt.
// You can ask user to restore completed transactions.
// Or restore automatically
// But make sure you don't make infinite loop
}
}
}.resume()
}
Полный текст статьи о процессе оплаты и подтверждении получения вы можете получить здесь: https://blog.apphud.com/swift-tutorial-subscriptions/
Я являюсь автором этого блога.Речь идет об автообновляемых подписках, но процесс покупки и проверки такой же.