Но когда я тестирую приложение в TestFlight, кнопка подписки вообще не появляется. Я не могу инициировать покупку и не могу найти четкое руководство, объясняющее, как заставить подписки работать именно в TestFlight.
Вот что я уже сделал:
- Я создал подписку в App Store Connect.
- Я настроил учетную запись Sandbox и вошел в систему на устройстве.
- Синхронизация StoreKit работает, и идентификатор продукта соответствует идентификатору продукта в App Store Connect.
- Тот же код отлично работает в Xcode Debug и Simulator, но кнопка отсутствует в TestFlight.
Может кто-нибудь объяснить, как правильно настроить и протестировать подписки в TestFlight и почему кнопка подписки исчезнет, даже если в Xcode все работает?
Класс подписки:
Код: Выделить всё
class Subscription: ObservableObject {
u/Published private(set) var products: [Product] = []
u/Published private(set) var activeSubscriptions: Set = []
private var updates: Task?
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 = []
for await entitlement in StoreKit.Transaction.currentEntitlements {
if case .verified(let transaction) = entitlement {
active.insert(transaction)
}
}
self.activeSubscriptions = active
}
Код: Выделить всё
VStack(spacing: 8) {
ForEach(sub.products) { product in
PrimaryButtonView(text: mainButtonTitle) {
Task {
do {
try await sub.purchase(product)
} catch {
print("Purchase error: \(error)")
}
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... testflight
Мобильная версия