With this code, I'm getting an error:
import Foundation
import Observation
import StoreKit
enum ProductID: String {
case subscriptionMonthly = "app_monthly"
case subscriptionYearly = "monthly_yearly"
}
@MainActor
@Observable
final class SubscriptionsHandler {
public var activeSubscription: String? = nil
init() {
// Because the tasks below capture 'self' in their closures, this object must be fully initialized before this point.
Task(priority: .background) {
// Finish any unfinished transactions -- for example, if the app was terminated before finishing a transaction.
for await verificationResult in Transaction.unfinished {
await handle(updatedTransaction: verificationResult)
}
// Fetch current entitlements for all product types except consumables.
for await verificationResult in Transaction.currentEntitlements {
await handle(updatedTransaction: verificationResult)
}
}
Task(priority: .background) {
for await verificationResult in Transaction.updates {
await handle(updatedTransaction: verificationResult)
}
}
}
private func handle(updatedTransaction verificationResult: VerificationResult<Transaction>) async {
// The code below handles only verified transactions; handle unverified transactions based on your business model.
guard case .verified(let transaction) = verificationResult else { return }
if let _ = transaction.revocationDate {
// Remove access to the product identified by `transaction.productID`.
// `Transaction.revocationReason` provides details about the revoked transaction.
guard let productID = ProductID(rawValue: transaction.productID) else {
print("Unexpected product: \(transaction.productID).")
return
}
activeSubscription = nil
UserDefaults.standard.set(false, forKey: "isSubscribed")
await transaction.finish()
return
} else if let expirationDate = transaction.expirationDate, expirationDate < Date() {
// In an app that supports Family Sharing, there might be another entitlement that still provides access to the subscription.
activeSubscription = nil
UserDefaults.standard.set(false, forKey: "isSubscribed")
return
} else {
// Provide access to the product identified by transaction.productID.
guard let productID = ProductID(rawValue: transaction.productID) else {
print("Unexpected product: \(transaction.productID).")
return
}
activeSubscription = transaction.productID
UserDefaults.standard.set(true, forKey: "isSubscribed")
await transaction.finish()
return
}
}
}
SwiftUICore/Environment+Objects.swift:34: Fatal error: No Observable object of type SubscriptionsHandler found. A View.environmentObject(_:) for SubscriptionsHandler may be missing as an ancestor of this view.