Skip to content

iOS refund requests

On iOS 15 or later, embed RefundRequestSection() in an existing SwiftUI Form or List. Use RefundRequestView() when the app needs a complete form in its own navigation container. UIKit apps can host the SwiftUI view with UIHostingController.

Form {
RefundRequestSection()
}

This feature needs no One configuration, initialized OneSDK instance, customer identity, or One API call.

For a custom UIKit flow, load verified purchases and request the selected transaction in the presenting scene:

@MainActor
func requestLatestRefund(in scene: UIWindowScene) async throws {
let purchases = try await RefundRequests.purchases()
guard let purchase = purchases.first else { return }
_ = try await purchase.requestRefund(in: scene)
}

The SDK lists verified StoreKit purchase history, including individual subscription renewals and expired subscriptions. It excludes revoked and family-shared purchases. Apple decides eligibility and collects the reason in its native sheet.

A successful result means Apple received the request. It does not mean Apple approved a refund. The SDK does not finish transactions, restore purchases, call One, or change access. Existing StoreKit updates and Apple server notifications continue to determine any later refund and access change.

For paid app downloads or a purchase that is not listed, direct customers to Apple’s Report a Problem page. Finished consumables appear only when the app has enabled Apple’s supported SKIncludeConsumableInAppPurchaseHistory setting.

Test the Apple sheet and cancellation path in a Sandbox build or StoreKit Testing configuration. Also test the no-purchases and StoreKit-load-failure states. A local SDK test or build does not verify the Apple sheet in the consuming app.

Next: iOS setup and Purchases and paywalls.