What does StoreKitError.systemError mean?

StoreKitError.systemError means the operating system reported a failure during a StoreKit 2 call and passes the underlying error along.

Quick facts#

Error StoreKitError.systemError(Error)
Where StoreKit 2, Swift (StoreKitError)
Available since iOS 15.0, iPadOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, visionOS 1.0
What the vendor says A system error occurred.

Cause#

  • The system, not your app's request, failed the operation. The case carries the underlying Error, which is the only place the detail lives.
  • Apple does not list what triggers it. Treat it as a failure outside your code that may be temporary.
  • Because the cause is not documented, do not assume a product or configuration problem until the underlying error shows one.

Fix#

  1. Log underlying.localizedDescription and its NSError domain and code, so you can group repeated failures.
  2. Retry once after a short pause. If it keeps failing, check that the device has an App Store account signed in and that the App Store app works.
  3. Test on a second device or account to separate a device problem from a setup problem.
  4. Keep the paywall open and tell the person the store had a problem. Do not unlock content.

Example#

Swift
import StoreKit

// The underlying error is the only detail StoreKit gives you, so log it before you show a generic message.
func refreshProducts(ids: [String]) async {
    do {
        let products = try await Product.products(for: ids)
        print("Loaded \(products.count) products")
    } catch StoreKitError.systemError(let underlying) {
        let ns = underlying as NSError
        print("StoreKit system error: domain \(ns.domain), code \(ns.code), \(ns.localizedDescription)")
    } catch {
        print("Other error: \(error)")
    }
}

Compile-checked: npm run check:snippets type-checks this snippet with swiftc against the Apple SDK (macOS target, checked 2026-10-03).

How the RevenueDot SDK reports it#

The RevenueDot purchases-ios fork maps StoreKitError.systemError to ErrorCode.storeProblemError (code 2) and keeps the system error as the underlying error. Retrying once is reasonable; see what storeProblemError means.

Source#

Checked: 2026-10-03

Edit this page on GitHub ↗ View as Markdown Last updated