Skip to content

Commit 5b9ebfc

Browse files
KM-16629: call finish on transactions
1 parent 0ef2b33 commit 5b9ebfc

26 files changed

Lines changed: 56 additions & 2 deletions

File tree

LocalPackages/PIALibrary/Sources/PIALibrary/Account/EphemeralAccountProvider.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ final class EphemeralAccountProvider: AccountProvider, ProvidersAccess, InAppAcc
125125
return
126126
}
127127

128+
if let transaction = request.transaction {
129+
accessedStore.finishTransaction(transaction, success: true)
130+
}
131+
128132
let user = UserAccount(credentials: credentials, info: nil)
129133
self.currentUser = user
130134
self.isLoggedIn = true

LocalPackages/PIALibrary/Sources/PIALibrary/ClientError.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ public enum ClientError: Error, Equatable {
9898
/// The selected sandbox subscription is not available in production.
9999
case sandboxPurchase
100100

101+
/// The purchase is pending external action (e.g. "Ask to Buy" approval or SCA).
102+
/// The transaction will be delivered later through `Transaction.updates`.
103+
case purchasePending
104+
101105
/// Cant retrieve regions
102106
case noRegions
103107

LocalPackages/PIALibrary/Sources/PIALibrary/InApp/AppStoreProvider.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ final class AppStoreProvider: NSObject, InAppProvider {
7171

7272
transactionObserverTask = Task {
7373
for await result in Transaction.updates {
74+
if Task.isCancelled { break }
7475
log.debug("transaction result: \(result)")
7576
}
7677
}
@@ -163,7 +164,7 @@ final class AppStoreProvider: NSObject, InAppProvider {
163164
return .failure(.userCancelled)
164165
case .pending:
165166
log.debug("\(#function) pending")
166-
return .failure(.userCancelled)
167+
return .failure(.purchasePending)
167168
@unknown default:
168169
log.warning("Unknown purchase result: \(result)")
169170
return .failure(.unknown(code: 606, message: "Unknown purchase result: \(result)"))
@@ -176,6 +177,13 @@ final class AppStoreProvider: NSObject, InAppProvider {
176177
return
177178
}
178179

180+
guard success else {
181+
// Leave the transaction unfinished so StoreKit keeps re-delivering it through
182+
// `Transaction.updates` until the content is successfully delivered to the backend.
183+
log.debug("Not finishing transaction \(native.id): delivery was not successful")
184+
return
185+
}
186+
179187
log.debug("Finishing transaction: \(native.id)")
180188
Task { await native.finish() }
181189
}

LocalPackages/PIALibrary/Sources/PIALibrary/InApp/AppStoreTransaction.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import StoreKit
2626

2727
struct AppStoreTransaction: InAppTransaction<Transaction> {
2828
var identifier: String {
29-
return native.appTransactionID
29+
return String(native.id)
3030
}
3131

3232
let native: Transaction

LocalPackages/PIALocalizations/Sources/PIALocalizations/Generated/L10n.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,10 @@ public enum L10n {
11601160
/// Sign-up failed
11611161
public static let vcTitle = L10n.tr("Localizable", "signup.failure.vc_title", fallback: "Sign-up failed")
11621162
public enum Purchase {
1163+
public enum Pending {
1164+
/// Your purchase is awaiting approval. Once it's approved, reopen the app to finish setting up your account.
1165+
public static let message = L10n.tr("Localizable", "signup.failure.purchase.pending.message", fallback: "Your purchase is awaiting approval. Once it's approved, reopen the app to finish setting up your account.")
1166+
}
11631167
public enum Sandbox {
11641168
/// The selected sandbox subscription is not available in production.
11651169
public static let message = L10n.tr("Localizable", "signup.failure.purchase.sandbox.message", fallback: "The selected sandbox subscription is not available in production.")

LocalPackages/PIALocalizations/Sources/PIALocalizations/Resources/ar.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@
534534
"signup.failure.title"= "فشل إنشاء الحساب";
535535
"signup.failure.message"= "يتعذر علينا إنشاء حساب في الوقت الحالي. يرجى إعادة المحاولة لاحقًا. \n\nعند إعادة فتح التطبيق سيتم إعادة محاولة إنشاء حساب.";
536536
"signup.failure.purchase.sandbox.message"= "اشتراك الصندوق المحدد غير متاح في الإنتاج.";
537+
"signup.failure.purchase.pending.message"= "عملية الشراء الخاصة بك في انتظار الموافقة. بمجرد الموافقة عليها، أعد فتح التطبيق لإكمال إعداد حسابك.";
537538
"signup.failure.redeem.invalid.title"= "رمز بطاقة غير صالح";
538539
"signup.failure.redeem.invalid.message"= "يبدو أنك أدخلت رمز بطاقة غير صالح. يرجى إعادة المحاولة.";
539540
"signup.failure.redeem.claimed.title"= "تم استخدام هذه البطاقة بالفعل";

LocalPackages/PIALocalizations/Sources/PIALocalizations/Resources/da.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@
534534
"signup.failure.title"= "Kunne ikke oprette konto";
535535
"signup.failure.message"= "Vi kan ikke oprette en konto på nuværende tidspunkt. Prøv igen senere.\n\nGenåbning af appen vil genoptage forsøget på at oprette en konto.";
536536
"signup.failure.purchase.sandbox.message"= "Det valgte sandbox-abonnement er ikke tilgængeligt i produktionen.";
537+
"signup.failure.purchase.pending.message"= "Dit køb afventer godkendelse. Når det er godkendt, skal du genåbne appen for at færdiggøre opsætningen af din konto.";
537538
"signup.failure.redeem.invalid.title"= "Ugyldig kort-pinkode";
538539
"signup.failure.redeem.invalid.message"= "Det ser ud til, at du har indtastet en ugyldig kort-pinkode. Prøv igen.";
539540
"signup.failure.redeem.claimed.title"= "Kort allerede taget";

LocalPackages/PIALocalizations/Sources/PIALocalizations/Resources/de.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@
534534
"signup.failure.title"= "Konto nicht erstellt";
535535
"signup.failure.message"= "Zur Zeit können wir kein Konto erstellen. Bitte später erneut versuchen.\n\nBeim erneuten Öffnen der App wird wieder versucht, ein Konto zu erstellen.";
536536
"signup.failure.purchase.sandbox.message"= "Das ausgewählte Sandbox-Abonnement ist in der Produktion nicht verfügbar.";
537+
"signup.failure.purchase.pending.message"= "Dein Kauf wartet auf Genehmigung. Sobald er genehmigt wurde, öffne die App erneut, um die Einrichtung deines Kontos abzuschließen.";
537538
"signup.failure.redeem.invalid.title"= "Ungültige Karten-PIN";
538539
"signup.failure.redeem.invalid.message"= "Anscheinend haben Sie eine ungültige PIN eingegeben. Bitte erneut versuchen.";
539540
"signup.failure.redeem.claimed.title"= "Karte bereits eingelöst";

LocalPackages/PIALocalizations/Sources/PIALocalizations/Resources/en.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@
534534
"signup.failure.title"= "Account creation failed";
535535
"signup.failure.message"= "We're unable to create an account at this time. Please try again later. Reopening the app will re-attempt to create an account.";
536536
"signup.failure.purchase.sandbox.message"= "The selected sandbox subscription is not available in production.";
537+
"signup.failure.purchase.pending.message"= "Your purchase is awaiting approval. Once it's approved, reopen the app to finish setting up your account.";
537538
"signup.failure.redeem.invalid.title"= "Invalid card PIN";
538539
"signup.failure.redeem.invalid.message"= "Looks like you entered an invalid card PIN. Please try again.";
539540
"signup.failure.redeem.claimed.title"= "Card claimed already";

LocalPackages/PIALocalizations/Sources/PIALocalizations/Resources/es-MX.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@
534534
"signup.failure.title"= "Falló la creación de la cuenta";
535535
"signup.failure.message"= "No pudimos crear una cuenta en este momento. Por favor, inténtalo de nuevo más tarde. \nSi vuelves a abrir la aplicación intentaremos crear una cuenta otra vez.";
536536
"signup.failure.purchase.sandbox.message"= "La suscripción del entorno aislado seleccionado no está disponible en la producción.";
537+
"signup.failure.purchase.pending.message"= "Tu compra está pendiente de aprobación. Una vez aprobada, vuelve a abrir la aplicación para terminar de configurar tu cuenta.";
537538
"signup.failure.redeem.invalid.title"= "El PIN de la tarjeta no es válido";
538539
"signup.failure.redeem.invalid.message"= "Parece que ingresaste un PIN de tarjeta inválido. Por favor, inténtalo de nuevo.";
539540
"signup.failure.redeem.claimed.title"= "La tarjeta ya fue reclamada";

0 commit comments

Comments
 (0)