Пробую потестить покупку в приложении. Код беру из одноименного курса. Создал тестового пользователя, верифицировал почту. Разлогинился на телефоне в Настройки/AppStore. При нажатии “Оплатить” ничего не происходит.
var listOfProducts = [SKProduct]() var productToPurchase = SKProduct() func success() { UserDefaults.standard.set(true, forKey: "123") }
override func viewDidLoad() {
super.viewDidLoad()
if SKPaymentQueue.canMakePayments() {
print (“Покупки доступны”)
let productID: Set = [“com.myPurchaseIdentifier”]
let request = SKProductsRequest(productIdentifiers: productID)
request.delegate = self
request.start()
} else {
print(“Покупки недоступны”)
}
}
func buyProduct() {
print(“buy” + productToPurchase.productIdentifier)
let pay = SKPayment(product: productToPurchase)
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().add(pay)
}
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print(“productRequest Phase”)
let myProduct = response.productsfor product in myProduct { print("товар добавлен") print("идентификатор продукта " + product.productIdentifier) print(product.localizedTitle) listOfProducts.append(product) } } func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction in transactions { print("Ошибка: + \(transaction.error)") switch transaction.transactionState { case .purchased: print("Оплата прошла успешно \(productToPurchase.productIdentifier)") let prodID = productToPurchase.productIdentifier switch prodID { case "com.myPurchaseIdentifier": print("Покупка прошла") success() default: break } queue.finishTransaction(transaction) break case .failed: print("Transaction Failed") queue.finishTransaction(transaction) default: print("сработал дефолт") break } } } func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { for transaction in queue.transactions { let prodID = transaction.payment.productIdentifier as String switch prodID { case "com.myPurchaseIdentifier": print("Покупка прошла") success() default: break } } } func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) { print("удаляем транзакцию из очереди") }
Сама кнопка при нажатии вызывает алерт:
@IBAction func buttonTapped(_ sender: UIButton) {
let alert = UIAlertController(title: “Покупка”, message: “”, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: “Отмена”, style: .cancel, handler: nil))
alert.addAction(UIAlertAction(title: “Оплатить”, style: .default, handler: {
()in
print(“Зашли внутрь кнопки”)
for product in self.listOfProducts {
let productID = product.productIdentifier
if productID == “com.myPurchaseIdentifier” {
self.productToPurchase = product
print(“Получили продукт”)
self.buyProduct()
break
}
}
}))
alert.addAction(UIAlertAction(title: “Восстановить покупку”, style: .default, handler: {
()in
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}))
self.present(alert, animated: true, completion: nil)
}
Алерт появляется, при нажатии кнопки “Оплатить” полный лог выглядит так:
Покупки доступны
productRequest Phase
Зашли внутрь кнопки
И все. При нажатии “Восстановить покупку” уже просит ввести AppleID или создать новый. Тут видимо все как надо работает.