Использование RevenueCat и проверка статуса подписки пользователей.
Подписка или нет будет определять вид, показанный в fullScreenCover
Только поскольку вызов для проверки статуса является асинхронным, мне приходится вызывать его с помощью await и заключить в Task{}
, что невозможно внутри fullScreenCover
.
Как вызвать функцию async
в fullScreenCover
.fullScreenCover(isPresented: $subscriptionIsExpanded){
Task {
if await StoreManager.isPremiumSubscriber() {
ActiveSubscription()
}
else{
PaywallView(displayCloseButton: true)
}
}
}
Task{}
выдает ошибку: Static method 'buildExpression' requires that 'Task<(), Never>' conform to 'View'
Поместите часть async
в тело .task
, они синхронны.
Вы можете попробовать другой подход для вызова вашей асинхронной функции.
внутри .fullScreenCover
или .sheet
.
Например, используя простой @State private var isDone: Bool?
для отображения
соответствующий View
в результате вашей асинхронной задачи.
Пример кода:
struct ContentView: View {
@State private var subscriptionIsExpanded = false
@State private var isDone: Bool?
var body: some View {
VStack {
Button("Click me") {
subscriptionIsExpanded = true
}.buttonStyle(.bordered)
}
// .sheet(isPresented: $subscriptionIsExpanded, onDismiss: { isDone = nil }) {
// sheetView()
// }
.fullScreenCover(isPresented: $subscriptionIsExpanded) {
sheetView()
}
}
@ViewBuilder
func sheetView() -> some View {
VStack {
HStack {
Button("Dismiss") {
isDone = nil
subscriptionIsExpanded = false
}
Spacer()
}
Spacer()
switch isDone {
case true: Text("ActiveSubscription") // ActiveSubscription()
case false: Text("PaywallView") // PaywallView(displayCloseButton: true)
default: ProgressView()
}
Spacer()
}
.task {
isDone = await isPremiumSubscriber()
// isDone = await StoreManager.isPremiumSubscriber()
}
}
// for testing, StoreManager.isPremiumSubscriber()
func isPremiumSubscriber() async -> Bool {
try! await Task.sleep(for: .seconds(2))
return Int.random(in: 0...1) < 1
}
}
Что вам нужно показывать при загрузке isPremiumSubscriber?