r/swift•
wakeuphaku

Subscribe in TestFlight

Hi! I created a subscription class and a button that starts the purchase flow. In the Xcode environment and Simulator everything works correctly — the purchase sheet appears and the subscription flow works as expected.

But when I test the app in TestFlight, the subscription button doesn’t appear at all. I cannot trigger a purchase, and I can’t find a clear tutorial that explains how to make subscriptions work specifically in TestFlight.

Here is what I have already done:

I created the subscription in App Store Connect

I set up a Sandbox account and logged in on the device.

StoreKit sync works and the product ID matches the one in App Store Connect.

The same code works perfectly in Xcode Debug and Simulator, but the button is missing in TestFlight.

I’m totally stuck.

Can someone explain how to correctly set up and test subscriptions in TestFlight and why the subscription button would disappear even though everything works in Xcode?

Any help or guidance would be greatly appreciated!

THIS IS SUB CLASS

```class Subscription: ObservableObject {

u/Published private(set) var products: [Product] = []

u/Published private(set) var activeSubscriptions: Set<StoreKit.Transaction> = []

private var updates: Task<Void, Never>?

var hasActiveSubscription: Bool {

activeSubscriptions.contains { transaction in

guard let expirationDate = transaction.expirationDate else { return false }

return expirationDate > Date() && transaction.revocationDate == nil

}

}

init() {

updates = Task {

for await update in StoreKit.Transaction.updates {

if case .verified(let transaction) = update {

activeSubscriptions.insert(transaction)

await transaction.finish()

}

}

}

}

deinit {

updates?.cancel()

}

// MARK: PRODUCT LOADING

func fetchProducts() async {

do {

let ids = ["test_name"]

products = try await Product.products(for: ids)

} catch {

print("Failed to load products: \(error)")

products = []

}

}

// MARK: PURCHASE

func purchase(_ product: Product) async throws {

let result = try await product.purchase()

switch result {

case let .success(.verified(transaction)):

await transaction.finish()

case .success(.unverified):

break

case .pending:

break

case .userCancelled:

break

u/unknown default:

break

}

}

// MARK: ACTIVE SUBSCRIPTIONS

func fetchActiveSubsciptions() async {

var active: Set<StoreKit.Transaction> = []

for await entitlement in StoreKit.Transaction.currentEntitlements {

if case .verified(let transaction) = entitlement {

active.insert(transaction)

}

}

self.activeSubscriptions = active

}

> ```

THIS IS BUTTON

```VStack(spacing: 8) {

ForEach(sub.products) { product in

PrimaryButtonView(text: mainButtonTitle) {

Task {

do {

try await sub.purchase(product)

} catch {

print("Purchase error: \(error)")

}

}

}

}

}```

Вот твой вопрос на грамотном английском:

My subscription button doesn’t appear in TestFlight because the product can’t be found — I assume it’s because the subscription is still waiting for review. If the button isn’t visible, how will Apple be able to test the subscription during App Review?

Posted Dec 3, 2025, 2:23 PM UTC

22
Loading comments…