我试图在 SwiftUI 应用程序中添加我的第一个
in-app purchase
类型 renewable subscription
,但我得到了一个奇怪的行为。我实际上不知道这是我的问题还是只是正常/奇怪的行为。让我解释一下这个问题。
我做的第一件事是初始化
StoreManager class
,然后将其注入到环境中:
import SwiftUI
@main
struct BootcampApp: App {
@StateObject private var storeManager = StoreManager()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(storeManager)
}
}
}
然后,我做的第二件事是使用
load() function
检查用户是否是高级(付费)用户:
import SwiftUI
struct ContentView: View {
@EnvironmentObject private var storeManager: StoreManager
@AppStorage("isPremium") private var isPremium = false
var body: some View {
TabView {
FirstView()
SecondView()
}
.task { await load() }
}
private func load() async {
guard let subscription = storeManager.subscriptions.first else { return }
isPremium = (try? await storeManager.isPurchased(subscription)) ?? isPremium
}
}
郑重声明,我实际上在链接到
storekit file
的 Xcode 项目上使用了 StoreKit Configuration in the Scheme
。
并且,一切都运行得很好,除了有时
isPremium
毫无理由地变成false
。所以,我不知道这是我的 load() function
还是当我们使用 storekit file
而不是 App Store Connect 的真实产品时很常见的东西。
另外,这是
isPurchased function
。这是非常基本的,因为我不检查他的状态,而只检查他在 purchasedSubscription
上的存在。
func isPurchased(_ product: Product) async throws -> Bool {
return purchasedSubscriptions.contains(product)
}
你知道发生了什么事吗?
提前谢谢!
而不是
.task { await load() }
使用
.task(id: storeManager.subscriptions) { await load() }
当然这取决于
storeManager.subscriptions
设置正确。它不会只运行
onAppear
,而是运行 onAppear
和 onChange
。
Apple 有一个很好的例子,一切 g 总是在倾听变化并做出反应。