Что я сделал
- Настройка локального приложения (Xcode 16.2)
• Создал пустой проект SwiftUI Xcode.
• Включил возможность покупок в приложении в разделе «Подписание и возможности».
• Реализован минимальный код StoreKit 2 для получения доступного кода. продукты (см. ниже).
• Использование правильного идентификатора пакета, соответствующего App Store Connect. - Конфигурация App Store Connect
• Зарегистрировано приложение с тем же идентификатором пакета.
• Создана автоматически возобновляемая подписка с: идентификатором продукта v1 (соответствует моему коду). Все поля заполнены (цены, локализация и т.д.). Статус: готов к проверке. - Пользователь песочницы и настройка тестирования
• Создана учетная запись тестировщика песочницы.
• На моем физическом устройстве (iOS 18.2): вошёл в систему с пользователем песочницы в меню «Настройки» → «Разработчик» → Apple ID «песочницы». Установлено и запущено приложение непосредственно из Xcode. - Проблема: StoreKit не возвращает ни одного продукта.
• Product.products(for:["v1"]) не возвращает никаких продуктов.
• Никаких ошибок не выдается, просто пустой массив.
• Я подтвердил, что для конфигурации StoreKit установлено значение «Нет» в Xcode.
• В консоли не отображаются журналы, связанные со StoreKit.
Код: Выделить всё
//StoreKitManager.swift
import StoreKit
import SwiftUI
@MainActor
class StoreKitManager: ObservableObject {
@Published var products: [Product] = []
@Published var errorMessage: String?
func fetchProducts() async {
do {
let productIDs: Set = ["v1"] // Matches App Store Connect
let fetchedProducts = try await Product.products(for: productIDs)
print(fetchedProducts) // Debug output
DispatchQueue.main.async {
self.products = fetchedProducts
}
} catch {
DispatchQueue.main.async {
self.errorMessage = "Failed to fetch products: \(error.localizedDescription)"
}
}
}
}
Код: Выделить всё
//ContentView.swift
import SwiftUI
struct ContentView: View {
@StateObject private var storeKitManager = StoreKitManager()
var body: some View {
VStack {
if let errorMessage = storeKitManager.errorMessage {
Text(errorMessage).foregroundColor(.red)
} else if storeKitManager.products.isEmpty {
Text("No products available")
} else {
List(storeKitManager.products, id: \.id) { product in
VStack(alignment: .leading) {
Text(product.displayName).font(.headline)
Text(product.description).font(.subheadline)
Text("\(product.price.formatted(.currency(code: product.priceFormatStyle.currencyCode ?? "USD")))")
.bold()
}
}
}
Button("Fetch Products") {
Task {
await storeKitManager.fetchProducts()
}
}
}
.padding()
.onAppear {
Task {
await storeKitManager.fetchProducts()
}
}
}
}
#Preview {
ContentView()
}
• Версия iOS: 18.2
• Версия Xcode: 16.2
• Версия macOS: 15.3.1
• Устройство: физический iPhone (не симулятор)
• Конфигурация StoreKit: установлено значение «Нет».
Есть ли способ выяснить, почему StoreKit не распознает мою подписку?
Подробнее здесь: https://stackoverflow.com/questions/794 ... cos-15-3-1
Мобильная версия