customerInfo
Contains the latest information about all of the customer's purchase and subscription data.
CustomerInfo was introduced in version 4.10.0. It provides comprehensive information about the customer's purchase history, subscriptions, and entitlements.
CustomerInfo is a published property, so you can subscribe to it using Combine or SwiftUI. You can also use the delegate method customerInfoDidChange(from:to:) or the AsyncStream customerInfoStream.
Purpose
Provides access to the customer's complete purchase and subscription history, including all transactions and entitlements. This is useful for displaying purchase history, understanding subscription status, and implementing features that depend on transaction data.
Signature
@Published
public var customerInfo: CustomerInfo { get }Properties
| Property | Type | Description |
|---|---|---|
subscriptions | [SubscriptionTransaction] | All subscription transactions, ordered by purchase date (ascending). |
nonSubscriptions | [NonSubscriptionTransaction] | All non-subscription transactions (consumables and non-consumables), ordered by purchase date (ascending). |
entitlements | [Entitlement] | All entitlements available to the user. |
activeSubscriptionProductIds | Set<String> | Product identifiers for active subscriptions. |
userId | String | The ID of the user. Equivalent to Superwall.userId. |
Returns / State
Returns a CustomerInfo object containing the latest customer purchase and subscription data. This object is immutable and does not update automatically—you must access the property again to get the latest data.
Usage
Access customer info:
let customerInfo = Superwall.shared.customerInfo
// Get all subscriptions
let subscriptions = customerInfo.subscriptions
// Get all non-subscription purchases
let nonSubscriptions = customerInfo.nonSubscriptions
// Get all entitlements
let entitlements = customerInfo.entitlements
// Get active subscription product IDs
let activeProductIds = customerInfo.activeSubscriptionProductIdsObserve changes with Combine:
import Combine
class ViewController: UIViewController {
private var cancellables = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
Superwall.shared.$customerInfo
.sink { [weak self] customerInfo in
self?.updatePurchaseHistory(customerInfo)
}
.store(in: &cancellables)
}
func updatePurchaseHistory(_ customerInfo: CustomerInfo) {
// Update UI with purchase history
print("User has \(customerInfo.subscriptions.count) subscriptions")
print("User has \(customerInfo.nonSubscriptions.count) non-subscription purchases")
}
}Use with AsyncStream (iOS 15+):
Task {
for await customerInfo in Superwall.shared.customerInfoStream {
// Handle customer info updates
print("Customer info updated: \(customerInfo.subscriptions.count) subscriptions")
}
}Get customer info asynchronously:
// Using async/await
let customerInfo = await Superwall.shared.getCustomerInfo()
// Using completion handler
Superwall.shared.getCustomerInfo { customerInfo in
// Handle customer info
}Display purchase history:
func displayPurchaseHistory() {
let customerInfo = Superwall.shared.customerInfo
// Display subscriptions
for subscription in customerInfo.subscriptions {
print("Product: \(subscription.productId)")
print("Purchase Date: \(subscription.purchaseDate)")
print("Active: \(subscription.isActive)")
if let expirationDate = subscription.expirationDate {
print("Expires: \(expirationDate)")
}
}
// Display non-subscription purchases
for purchase in customerInfo.nonSubscriptions {
print("Product: \(purchase.productId)")
print("Purchase Date: \(purchase.purchaseDate)")
print("Consumable: \(purchase.isConsumable)")
}
}Check active subscriptions:
func hasActiveSubscription() -> Bool {
let customerInfo = Superwall.shared.customerInfo
return !customerInfo.activeSubscriptionProductIds.isEmpty
}
func getActiveSubscriptionProductIds() -> Set<String> {
return Superwall.shared.customerInfo.activeSubscriptionProductIds
}Related
getCustomerInfo()- Get customer info asynchronouslycustomerInfoStream- AsyncStream of customer info changescustomerInfoDidChange(from:to:)- Delegate method for customer info changesSubscriptionTransaction- Represents a subscription transactionNonSubscriptionTransaction- Represents a non-subscription transactionEntitlement- Represents an entitlement
How is this guide?
Edit on GitHub