Я заявил, что использую StoreKit2 и мне не нужно подтверждать получение, поэтому я не считаю, что это руководство полезно. Ниже мой код. Чтобы инициировать покупку продукта, достаточно одного щелчка мыши. Есть идеи, почему это работает хорошо, но не для TestFlight и рецензентов Apple?
Button(action: {
Task { try await storeManager.purchase() }
}) {
Text("Continue")
}
import Foundation
import StoreKit
let productIDs = ["my_product_1", "my_product_2"]
class StoreManager: ObservableObject {
static let shared = StoreManager()
@Published var storeProducts: [Product] = []
@Published var purchasedProducts: Set = []
var transacitonListener: Task? = nil
init() {
transacitonListener = listenForTransactions()
Task {
await loadProducts()
await updateCurrentEntitlements()
}
}
func getProduct(index: Int) -> Product? {
for product in storeProducts {
if product.id == productIDs[index] {
return product
}
}
return nil
}
func getProductPrice() -> String {
if let product = getProduct(index: 0) {
return product.displayPrice
}
return "4.99 USD"
}
func getProductPriceOrigin() -> String {
if let product = getProduct(index: 1) {
return product.displayPrice
}
return "9.99 USD"
}
func isPurchased() -> Bool {
return purchasedProducts.contains { $0.id == productIDs[0] }
}
@MainActor
func purchase() async throws -> Transaction? {
log("enter")
let product: Product? = getProduct(index: 0)
if product == nil {
log("product nil")
return nil
}
log("before purchase")
let result = try await product!.purchase()
log("after purchase")
switch result {
case let .success(.verified(transaction)):
purchasedProducts.insert(product!)
await transaction.finish()
log("success")
return transaction
case let .success(.unverified(_, error)):
print("purchase.success.unverified:", error)
log("success unverified")
break
case .pending:
log("pending")
break
case .userCancelled:
log("userCancelled")
break
default:
log("default")
break
}
return nil
}
@MainActor
private func loadProducts() async {
do {
storeProducts = try await Product.products(for: productIDs)
} catch {
print("Failed to load product \(productIDs):", error)
}
}
private func listenForTransactions() -> Task < Void, Error > {
return Task.detached {
for await result in Transaction.updates {
await self.handleTransaction(transactionVerification: result)
}
}
}
private func updateCurrentEntitlements() async {
for await result in Transaction.currentEntitlements {
await self.handleTransaction(transactionVerification: result)
}
}
@MainActor
private func handleTransaction(transactionVerification result: VerificationResult ) async {
switch result {
case let.verified(transaction):
guard
let product = self.storeProducts.first(where: {
$0.id == transaction.productID
})
else {
return
}
self.purchasedProducts.insert(product)
await transaction.finish()
default:
return
}
}
@MainActor
func restore() async throws {
try await AppStore.sync()
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... testflight