Я тестирую покупку подписки в моем приложении для iOS. Я использую комплект магазина 2. отправка для бэкэнд транзакции для проверки и записи данных о членстве в DB. После возвращения в бэкэнд я заканчиваю транзакцию и отклоняю формы оплаты. < /P>
Я, кажется, столкнулся с проблемой. После нескольких успешно завершенных покупок с помощью: < /p>
Форма платежа Apple, выступающая правильно < /li>
Форма пароля песочницы < /li>
Предупреждение о том, что я уже купил подписку (это не демодлевая статическая подписка), и я хочу, чтобы я снова нажимал). Завершенная покупка < /li>
< /ol>
Так казалось, что все работает нормально. Но потом я начал получать неправильное поведение - нажимая на любые варианты в моем пользовательском интерфейсе, которые называют My ProductManager.Swift
ProductManager.shared.purchase(productID: productID, isAutoRenewable: isAutoRenewable, amount: amount) { [weak self] success, error in
< /code>
не показывает никакой формы платежа Apple, но моя функция SendTobackend активируется, потому что iOS отправляет транзакцию на бэкэнд и проверяет Apple и записывает данные в DB. Я бы даже сразу увидел, как мое пользовательское поздравительное всплывающее окно, которое должно показаться после завершенной покупки (возвращен из бэкэнда). < /P>
И это несовместимо. Но сейчас я не могу, чтобы любовь Бога совершила автоматическую продленную покупку, чтобы показать мне любые формы платежей, это просто молча обрабатывает все в моем узле. JS: < /p>
{"transactionId":"2000000902832874","originalTransactionId":"20000008992983721","webOrderLineItemId":"200000009127659","bundleId":"some.bundle.id","productId":"some.product.id","subscriptionGroupIdentifier":"21647158","purchaseDate":1745246764000,"originalPurchaseDate":1744788721000,"expiresDate":1745247064000,"quantity":1,"type":"Auto-Renewable Subscription","inAppOwnershipType":"PURCHASED","signedDate":1745446227570,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":9990,"currency":"USD","appTransactionId":"704404281845301369"}
< /code>
Вот моя покупка и купить функции: < /p>
func purchase(productID: String, isAutoRenewable: Bool, amount: Int?, completion: @escaping (Bool, Error?) -> Void) {
Task {
// Ensure products are fetched before proceeding
if !isProductsFetched {
await fetchProducts()
}
var product = products.first(where: { $0.id == productID })
if product == nil {
await fetchProducts()
product = products.first(where: { $0.id == productID })
}
guard let finalProduct = product else {
completion(false, NSError(domain: "StoreKit", code: 404, userInfo: [NSLocalizedDescriptionKey: "Product not found"]))
return
}
await self.buy(product: finalProduct, isAutoRenewable: isAutoRenewable, amount: amount, completion: completion)
}
}
private func buy(product: Product, isAutoRenewable: Bool, amount: Int?, completion: @escaping (Bool, Error?) -> Void) async {
do {
let result = try await product.purchase()
switch result {
case .success(let verification):
switch verification {
case .verified(let transaction):
// Send transaction data directly to backend
let backendSuccess = await self.sendToBackend(transaction: transaction, productId: product.id, amount: amount, isAuto: isAutoRenewable)
if backendSuccess {
// Ensure backend processed before finishing the transaction
try await transaction.finish()
completion(true, nil)
} else {
let error = NSError(domain: "BackendError", code: -1, userInfo: [NSLocalizedDescriptionKey: "Backend validation failed"])
print("❌ Backend validation failed")
completion(false, error)
}
case .unverified(_, let error):
completion(false, error)
}
case .userCancelled, .pending:
completion(false, nil)
@unknown default:
completion(false, nil)
}
} catch {
completion(false, error)
}
}
Я тестирую покупку подписки в моем приложении для iOS. Я использую комплект магазина 2. отправка для бэкэнд транзакции для проверки и записи данных о членстве в DB. После возвращения в бэкэнд я заканчиваю транзакцию и отклоняю формы оплаты. < /P> Я, кажется, столкнулся с проблемой. После нескольких успешно завершенных покупок с помощью: < /p>
Форма платежа Apple, выступающая правильно < /li> Форма пароля песочницы < /li> Предупреждение о том, что я уже купил подписку (это не демодлевая статическая подписка), и я хочу, чтобы я снова нажимал). Завершенная покупка < /li> < /ol> Так казалось, что все работает нормально. Но потом я начал получать неправильное поведение - нажимая на любые варианты в моем пользовательском интерфейсе, которые называют My ProductManager.Swift[code]ProductManager.shared.purchase(productID: productID, isAutoRenewable: isAutoRenewable, amount: amount) { [weak self] success, error in < /code> не показывает никакой формы платежа Apple, но моя функция SendTobackend активируется, потому что iOS отправляет транзакцию на бэкэнд и проверяет Apple и записывает данные в DB. Я бы даже сразу увидел, как мое пользовательское поздравительное всплывающее окно, которое должно показаться после завершенной покупки (возвращен из бэкэнда). < /P> И это несовместимо. Но сейчас я не могу, чтобы любовь Бога совершила автоматическую продленную покупку, чтобы показать мне любые формы платежей, это просто молча обрабатывает все в моем узле. JS: < /p> {"transactionId":"2000000902832874","originalTransactionId":"20000008992983721","webOrderLineItemId":"200000009127659","bundleId":"some.bundle.id","productId":"some.product.id","subscriptionGroupIdentifier":"21647158","purchaseDate":1745246764000,"originalPurchaseDate":1744788721000,"expiresDate":1745247064000,"quantity":1,"type":"Auto-Renewable Subscription","inAppOwnershipType":"PURCHASED","signedDate":1745446227570,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":9990,"currency":"USD","appTransactionId":"704404281845301369"} < /code> Вот моя покупка и купить функции: < /p> func purchase(productID: String, isAutoRenewable: Bool, amount: Int?, completion: @escaping (Bool, Error?) -> Void) { Task { // Ensure products are fetched before proceeding if !isProductsFetched { await fetchProducts() }