Das Produkt ist ein nicht verbrauchbares Produkt (einmaliger Kauf) und In-App-Kauftests werden über TestFlight durchgeführt.
Einige Tester haben die App über einen öffentlichen TestFlight-Link heruntergeladen und führen Kauftests mit ihren persönlichen Apple-IDs durch, ohne spezielle Sandbox-Testkonten zu verwenden.
(Diese Käufe werden weiterhin als Testtransaktionen und nicht als echte Gebühren verarbeitet.)
Das Problem besteht darin, dass „transaction.finish()“ nach Abschluss eines Kaufs nicht im Status „.verified“ funktioniert.
Wenn die App gestartet wird, überprüfe ich nicht abgeschlossene Transaktionen mithilfe von „Transaction.unfinished“.
Die Transaktion wird in der Switch-Anweisung unter „.verified“ erkannt und ich rufe an dieser Stelle „transaction.finish()“ auf.
Nach dem Schließen und Neustarten der App wird jedoch dieselbe Transaktion bei der Iteration erneut erkannt Transaction.unfinished.
Tatsächlich gibt es keine Codeunterschiede im Vergleich zur zuvor veröffentlichten Produktionsversion, aber beim TestFlight-Kauftest scheint transaction.finish() nicht ordnungsgemäß abgeschlossen zu werden.
Aufgrund dieses Problems:
Beim Versuch, dasselbe Produkt erneut zu kaufen, wird das Produktkaufformular manchmal nicht angezeigt, oder
Nach dem Löschen und Neuinstallieren der App wird das Produkt als bereits behandelt gekauft und wiederhergestellt.
Ich habe gelesen, dass das Verhalten in der Produktionsumgebung unterschiedlich sein kann, aber ich würde gerne wissen, wie dies behoben oder richtig gehandhabt werden sollte.
mein einfacher Code
Code: Select all
public func buyProduct(_ product: Product){
Task {
do{
let result = try await product.purchase()
switch result{
case .success(let verification):
switch verification{
case .verified(let transaction):
await handleTransaction(transaction)
await transaction.finish()
case .unverified(_, let error):
}
case .userCancelled:
case .pending:
@unknown default:
}
}catch{
print("purchase failed: \(error.localizedDescription)")
}
}
}
Code: Select all
public func checkedTransaction(){
for await result in Transaction.unfinished {
switch result {
case .verified(let transaction):
awaiat transaction.finish()
case .unverified(_, let error):
}
}
}
Mobile version