#ios #swift #in-app-purchase #storekit #swiftystorekit
#iOS #swift #покупка в приложении #storekit #swiftystorekit
Вопрос:
Я внедряю SwiftyStoreKit, чтобы помочь с покупками в приложении на iOS. У меня есть сервер, который настроен для проверки квитанций, поэтому я пытаюсь выполнить:
- Пользователь нажимает, чтобы купить продукт IAP
- В случае успеха квитанция извлекается и отправляется на сервер для проверки
- В случае успеха транзакция продукта IAP будет завершена
- Обновите пользовательский интерфейс.
После того, как пользователь нажимает на покупку, запускается функция, подобная этой:
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. Я ожидаю, что это не предназначено, поскольку это делает продолжение работы с кодом в файле, который вызвал покупку, действительно громоздким.