Summary: We gate premium access on the renewal status returned by Product.SubscriptionInfo.Status.all, following the pattern in your Implementing a store in your app using the StoreKit API sample (CustomerEntitlements.checkCurrentStatuses()). In production we are seeing a subset of users whose Status.all yields zero statuses, even though they hold an active subscription with a future expiration date (according to our own persisted state). This causes us to incorrectly treat them as unsubscribed.
How we read status: func currentSubscriptionStatuses() async -> [SubscriptionStatusInfo] { await Product.SubscriptionInfo.Status.all .collect() .flatMap(.1) .compactMap(SubscriptionStatusInfo.init(skStatus:)) } The compactMap only drops entries failing case .verified. In the affected cases Status.all itself emits no (groupID, statuses) pairs at all - the sequence is empty, not filtered.
Affected population:
- Previously had an active paid subscription (our own persisted state shows pro with an expiry date in the future).
- Not new installs.
Questions:
- Under what conditions can Product.SubscriptionInfo.Status.all return an empty sequence for an Apple Account that currently holds an active auto-renewable subscription (e.g. not signed into the App Store, StoreKit not yet initialized at launch, offline, renewal in flight, Family Sharing)?
- Is an empty result from Status.all ever authoritative ("no subscription"), or must it always be treated as inconclusive and never used to revoke access?
- Is there a recommended way to distinguish "no subscription for this account" from "status temporarily unavailable" (e.g. a signal for no signed-in App Store account, or a readiness/error path)?
- Does Status.all guarantee it reflects a signed-in account context, and what is the expected behavior when the device has no active App Store account at call time?