Но когда я тестирую приложение в TestFlight, кнопка подписки вообще не появляется. Я не могу инициировать покупку и не могу найти четкое руководство, объясняющее, как заставить подписки работать конкретно в TestFlight.
Вот что я уже сделал:
Я создал подписку в App Store Connect.
Я настроил учетную запись Sandbox и вошел в систему на устройстве.
Синхронизация StoreKit работает, и идентификатор продукта совпадает с идентификатором в App Store Connect.
Тот же код отлично работает в Xcode Debug и Simulator, но кнопка отсутствует в TestFlight.
Я совсем застрял.
Может кто-нибудь объяснить, как правильно настраивать и тестировать подписки в TestFlight и почему кнопка подписки исчезнет, хотя в Xcode все работает?
Код: Выделить всё
THIS IS SUB CLASS
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
}
Код: Выделить всё
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)")
}
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... testflight
Мобильная версия