Я выполнил пошаговое руководство, чтобы включить в приложение непотребляемые покупки. К сожалению, ничего не происходит после того, как пользователь нажимает кнопку покупки. Я не получаю приглашение войти в iTunes или принять платеж. Я что-то упускаю здесь?
Я пробовал несколько пошаговых инструкций, и все они, похоже, имеют похожий код, я выполнил шаги через веб-сайт Apple, однако я не уверен, нужно ли мне делать полную заявку на приложение, прежде чем я смогу проверить приложение покупает через песочницу.
IAPService.swift
import Foundation
import StoreKit
import UIKit
class IAPService: NSObject {
private override init() {}
static let shared = IAPService()
var products = [SKProduct]()
let paymentQueue = SKPaymentQueue.default()
func getProducts() {
let products: Set = [IAPProduct.nonConsumable.rawValue]
let request = SKProductsRequest(productIdentifiers: products)
request.delegate = self
request.start()
paymentQueue.add(self)
}
func purchase(product: IAPProduct) {
guard let productToPurchase = products.filter({
$0.productIdentifier == product.rawValue }).first else { return }
let payment = SKPayment(product: productToPurchase)
paymentQueue.add(payment)
}
func restorePurchases() {
print("restore purchases")
paymentQueue.restoreCompletedTransactions()
}
}
extension IAPService: SKProductsRequestDelegate {
func productsRequest(_ request: SKProductsRequest, didReceive
response: SKProductsResponse) {
products = response.products
for product in response.products {
print(product.localizedTitle)
}
}
}
extension IAPService: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions
transactions: [SKPaymentTransaction]) {
for transaction in transactions {
print(transaction.transactionState.status(),
transaction.payment.productIdentifier)
switch transaction.transactionState {
case .purchasing: break
default: queue.finishTransaction(transaction)
}
}
}
}
extension SKPaymentTransactionState {
func status() -> String {
switch self {
case .deferred: return "deferred"
case .failed: return "failed"
case .purchased: return "purchased"
case .purchasing: return "purchasing"
case .restored: return "restored"
}
}
}
В моем файле товаров
IAP.Products.swift
import Foundation
enum IAPProduct: String {
case nonConsumable = "Quizly"
}
В моем основном ВК
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
IAPService.shared.getProducts()
print("IAP == \(IAPService.shared.products)") // Why is this an empty array?
}
@objc func pressToGetPremium(_ sender : UIButton) {
IAPService.shared.purchase(product: .nonConsumable)
print("IAP ===== \(IAPService.shared.products)")
}
Когда пользователь нажимает кнопку, я надеялся, что появится всплывающее окно, в результате чего пользователь должен будет войти в свою учетную запись Apple, а затем другое всплывающее окно спросит, хотят ли они принять не расходуемый продукт (1,99 долл. США). ) и т. д. Но я вообще не получаю всплывающее окно.
Я получаю это обратно от продуктов didReceive ......
ответ SKProductsResponse 0x00000002811cba10
baseNSObject @ 0 NSObject
ISA Class 0x2811cba10 0x00000002811cba10
_internal SKПродуктыResponseInternal * 0x28139c0e0 0x000000028139c0e0
NSObject NSObject
_invalidIdentifiers __NSSingleObjectArrayI * 1 элемент 0x00000002811cb930
[0] __NSCFString * "Quizly" 0x000000028139c620
NSMutableString NSMutableString
_products __NSArray0 * 0 элементов 0x00000002811c0050
NSArray NSArray
NSObject NSObject
Класс ISA __NSArray0 0x000001a25a605811