#ios #swift #in-app-purchase
Вопрос:
Мой viewDidLoad вызывает все функции для fetchProduct…
Это прекрасно работает в песочнице на устройстве, когда я строю из XCode, но когда я строю для тестового полета, приложение выходит из строя, но платежная ведомость отображается на главном экране при сбое. Каждый раз, когда пользователь пытается совершить покупку после сбоя, это работает нормально. Но крах немедленно приводит к потере покупок.
func fetchProductLove(){
print("Fetching")
let request = SKProductsRequest(productIdentifiers: ["LOVEDECK"])
request.delegate = self
request.start()
}
func fetchProductExplicit(){
print("Fetching")
let request = SKProductsRequest(productIdentifiers: ["EXPLICITDECK"])
request.delegate = self
request.start()
}
func fetchProductAll(){
print("Fetching")
let request = SKProductsRequest(productIdentifiers: ["ALLQUESTIONSDECK"])
request.delegate = self
request.start()
}
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
DispatchQueue.main.async {
if let product = response.products.first { //14:30 of IAP by iOSAcademy for multiple products
self.myProduct = product
print(product.productIdentifier)
print(product.localizedTitle)
print(product.localizedDescription)
print(product.priceLocale)
print(product.price)
}
else {
print("Couldnt find product")
}
}
}
@IBAction func clickStartGame(_ sender: Any) {
startLoading()
if deckIsPurchased == true
{
getQuestionsForGame()
}
else if deckIsPurchased == false {
if(SKPaymentQueue.canMakePayments()) {
startTransaction()
}
else {
let alert = UIAlertController(title: "Warning", message: "Apple ID is unable to make purchases. Contact Apple or info@whostmostapp.com to resolve.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Close", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
}
func startTransaction(){
guard let PurchasingProduct = myProduct else {
print("Did Not Find At All")
if myProduct == nil {
let alert = UIAlertController(title: "Unable to Download", message: "The purchase has not been made. Check your connection and try again", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Close", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
endLoading()
}
return
}
if myProduct != nil{
let payment = SKPayment(product: PurchasingProduct)
print(payment)
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().add(payment)
}
}
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
print(transaction.error ?? "")
switch transaction.transactionState {
case .purchasing:
break
case .purchased, .restored:
//unlock item
print("DeckRefName",deckNameRefValue)
if deckNameRefValue == "LovePotion"{
UserDefaults.standard.set("Yes", forKey: "hasPurchasedLovePotionDeck")
}
else if deckNameRefValue == "Explicit"{
UserDefaults.standard.set("Yes", forKey: "hasPurchasedExplicitDeck")
}
else if deckNameRefValue == "All"{
UserDefaults.standard.set("Yes", forKey: "hasPurchasedLovePotionDeck")
UserDefaults.standard.set("Yes", forKey: "hasPurchasedExplicitDeck")
UserDefaults.standard.set("Yes", forKey: "hasPurchasedAllDeck")
}
SKPaymentQueue.default().finishTransaction(transaction)
SKPaymentQueue.default().remove(self)
layoutForCompletedPurchase()
deckIsPurchased = true
Analytics.logEvent(AnalyticsEventPurchase, parameters: ["Product": deckNameRefValue, "Price":deckPriceValue])
endLoading()
break
case .failed, .deferred:
//no operation
SKPaymentQueue.default().finishTransaction(transaction)
SKPaymentQueue.default().remove(self)
let alert = UIAlertController(title: "Purchase Failed", message: "Unable to complete the purchase. Check your network connection and try again", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
endLoading()
break
default:
//no operation
SKPaymentQueue.default().finishTransaction(transaction)
SKPaymentQueue.default().remove(self)
break
}
}
}
Комментарии:
1. Что такое сообщение о сбое? Предположительно, если вы находитесь в тестовом полете, вы можете получать отчеты о сбоях. Без учета этого это довольно умозрительно.
2. Кроме того, с точки зрения реализации вам следует добавить наблюдателя очереди платежей
didFinishLaunching
и никогда не удалять его. Если у вас есть незавершенные транзакции, они будут представлены при запуске вашего приложения. developer.apple.com/documentation/storekit/skpaymentqueue/…3. Мне нужно было поближе ознакомиться с отчетами о крушениях во время испытательных полетов! — решено
Ответ №1:
НАЙДЕНО РЕШЕНИЕ — я использовал SKPaymentQueue на другой странице приложения, и он был неправильно закрыт