# Changelog

Release notes for the Superwall iOS SDK

4.15.3 [#4153]

Fixes [#fixes]

* Fixes computed period prices (`weeklyPrice`, `dailyPrice`) being off by a small amount for products whose subscription period is expressed in days.

4.15.2 [#4152]

Enhancements [#enhancements]

* Improves Apple Search Ads attribution capture rate.

Fixes [#fixes-1]

* Changes the Superscript spm package repo source to a new lightweight repo meaning that the download of the package is way faster.
* Filters out the all-zeros IDFA sentinel (returned when App Tracking Transparency is denied) so it no longer pollutes the `idfa` attribute on attribution payloads.

4.15.1 [#4151]

Enhancements [#enhancements-1]

* Adds an `onCustomCallback` parameter to `getPaywall`.
* `SuperwallOptions.localResources` now accepts UIImage's from xcasset files, e.g. `UIImage(named: "my-image")`.
* Exposes abandoned transaction product params in audience filters.

Fixes [#fixes-2]

* Sanitizes email user attribute.

4.15.0 [#4150]

Enhancements [#enhancements-2]

* Adds support for custom store products. This allows you to purchase products that are on stores outside of the App Store using the `PurchaseController`.
* Adds `formUnion` override when unioning sets of `Entitlement` objects.

Fixes [#fixes-3]

* Fixes issue where test mode products had trial price data missing.
* Fixed computed period prices (`weeklyPrice`, `dailyPrice`, `monthlyPrice`, `yearlyPrice`) displaying incorrectly rounded values on StoreKit 2 in production. For example, a £4.99/week product could show as £5.00/week. This was caused by Apple's `priceFormatStyle` applying storefront-specific rounding to computed values.

4.14.2 [#4142]

Enhancements [#enhancements-3]

* Adds multipage paywall navigation tracking by tracking a `paywall_page_view` event, which contains information about the page view.

4.14.1 [#4141]

Enhancements [#enhancements-4]

* Localizes all alerts into 41 languages.
* Makes sure to refresh free trial eligibility on every paywall open.

Fixes [#fixes-4]

* Makes `device.isSandbox` more reliable.
* Fixes the web restore alert not showing the "Yes" action button and "Cancel" incorrectly triggering the restore action.
* Fixes a rare issue where a user's subscription could remain active after a refund, preventing paywalls from being shown.
* Fixes trial eligibility for Stripe paywalls and tracks `freeTrial_start`.
* Fixes an issue where `transaction_complete` could be missing transaction information when a crossgrade occurred while using a purchase controller.
* Fixes terminated webviews refreshing in a loop on low RAM devices.

4.14.0 [#4140]

Enhancements [#enhancements-5]

* Adds support for "Test Mode", which allows you to simulate in-app purchases without involving StoreKit. Test Mode can be enabled through the Superwall dashboard by marking specific users as test store users, or activates automatically when a bundle ID mismatch is detected. When active, a configuration modal lets you select starting entitlements and override free trial availability. Purchases are simulated with a UI that lets users complete, abandon, or fail transactions, with all purchase events firing normally for end-to-end paywall testing.
* Adds prioritized campaign preloading. When a campaign is marked as prioritized in the dashboard, its paywalls are preloaded before all others.
* Adds Stripe checkout message handling for `stripe_checkout_start`, `stripe_checkout_submit`, `stripe_checkout_complete`, `stripe_checkout_fail`, and `stripe_checkout_abandon`.
* Adds SDK-side analytics tracking for Stripe checkout lifecycle events (`start`, `submit`, `complete`, `fail`) with `store` and `product_identifier` payload fields.

Fixes [#fixes-5]

* Fixes issue with compiling on Xcode 26.4 beta.
* Fixes dashboard display of multiple active entitlements.

The changelog for `SuperwallKit`. Also see the [releases](https://github.com/superwall/Superwall-iOS/releases) on GitHub.

4.13.0 [#4130]

Enhancements [#enhancements-6]

* Adds support for local images and videos in paywalls.
* Schedules trial notifications after purchasing Stripe products.

Fixes [#fixes-6]

* Fixes race condition relating to the user ID when upgrading from v3 of the SDK to v4.
* Fixes issue where the Superscript version hadn't been upgraded to 1.0.13 if installed via CocoaPods.

4.12.11 [#41211]

Enhancements [#enhancements-7]

* Adds `appstackId` as an `IntegrationAttribute`.

4.12.10 [#41210]

Enhancements [#enhancements-8]

* Adds native haptic feedback support for paywalls. Haptic types can be configured in the paywall editor and include light, medium, heavy, success, warning, error, and selection.
* Adds `custom callback` action support allowing you to perform an async action and send the result back to the paywall.

Fixes [#fixes-7]

* Fixes issue where the `app_install` event was being cleared upon reset, which meant that this couldn't be used with `device.daysSince_app_install` after reset.

4.12.9 [#4129]

Fixes [#fixes-8]

* Updates Superscript version to 1.0.13. This fixes an issue with String and Int comparison. View the original Rust release changelog [here](https://github.com/superwall/superscript/releases/tag/1.0.13).
* Fixes an issue where dismissing a modally presented paywall didn't fire `paywall_decline`.

4.12.8 [#4128]

Enhancements [#enhancements-9]

* Exposes the `introOfferToken` on `StoreProduct` so that those using a PurchaseController can take advantage of the introductory offer eligiblity override.

Fixes [#fixes-9]

* Stop logging `paywallWebviewLoad_timeout` events because they were confusing.
* Only refreshes terminated webviews once to avoid infinite reloading loops on low RAM devices.

4.12.7 [#4127]

Fixes [#fixes-10]

* Fixes microphone permission request to prevent App Store Connect warnings.

4.12.6 [#4126]

Enhancements [#enhancements-10]

* Adds post purchase actions support.

Fixes [#fixes-11]

* Fixes a rare issue where TestFlight products could display in a different currency on the paywall than on Apple's payment sheet.

4.12.5 [#4125]

Enhancements [#enhancements-11]

* Adds microphone permission request support.

Fixes [#fixes-12]

* Fixes issue where the notification permission prompt would not appear if provisional notification permission was already granted.

4.12.4 [#4124]

Enhancements [#enhancements-12]

* Adds back in contacts and location permission requests but this time will not get flagged in App Store review if they're not being used.
* Adds App Tracking Transparency permission request.

4.12.3 [#4123]

Fixes [#fixes-13]

* Removes contacts and location permission APIs to prevent App Store warnings.

4.12.2 [#4122]

Fixes [#fixes-14]

* Fixes issue building for Mac Catalyst.

4.12.1 [#4121]

Enhancements [#enhancements-13]

* Adds `redemptionInfo.paywallInfo.product` which contains information about the product that was purchased. This deprecates `redemptionInfo.paywallInfo.productIdentifier` in favor of `redemptionInfo.paywallInfo.product.identifer`.

4.12.0 [#4120]

Enhancements [#enhancements-14]

* Adds `paywallPreload_start` and `paywallPreload_complete` events.
* Adds `request permission` action support allowing you to request notification, location, photos, contacts, and camera permissions from paywalls.
* Improves drawer presentation style corner rounding by applying the device radius on bottom corners.

Fixes [#fixes-15]

* Updates Superscript version to 1.0.12. This fixes an issue with `appVersionPadded` comparison. View the original Rust release changelog [here](https://github.com/superwall/superscript/releases/tag/1.0.12).

4.11.2 [#4112]

Fixes [#fixes-16]

* Deprecates `device.isApplePayAvailable` and defaults it to `true`. This also removes the PassKit import, which was getting flagged for some developers in review.

4.11.1 [#4111]

Fixes [#fixes-17]

* Fixes issue where `isApplePayAvailable` being calculated off the main thread could cause a crash.
* Fixes potential crashes in WebKit navigation delegate methods.

4.11.0 [#4110]

Enhancements [#enhancements-15]

* Adds the ability to override introductory offer eligibility via the paywall editor.
* Adds dynamic notification support and scheduling.
* Adds `refreshConfiguration()` to manually refresh the SDK configuration. This should only be used in wrapper SDKs in development for hot reloading.
* Adds `offerType`, `subscriptionGroupId` and `store` to `SubscriptionTransaction` and `NonSubscriptionTransaction`.

Fixes [#fixes-18]

* Fixes an issue where not all product IDs belonging to `Entitlement`s in `CustomerInfo` were being included.

4.10.8 [#4108]

Enhancements [#enhancements-16]

* Adds support for `Set user attributes` action.
* Adds new `SuperwallDelegate` method called `userAttributesDidChange` that notifies you when user attributes change from an external source.
* Adds `firebaseInstallationId` as an `IntegrationAttribute`.

Fixes [#fixes-19]

* Fixes a crash caused by a race condition when accessing JSON dictionaries concurrently.
* Fixes issue returning the `PurchaseResult` from `Superwall.shared.purchase(_:)` when using StoreKit 1 inside a `PurchaseController`.
* Fixes `handleDeepLink` returning true for non-Superwall URLs when called before configuration completes.

4.10.6 [#4106]

Fixes [#fixes-20]

* Fixes issue that prevented the SDK from being built on old Xcode versions.

4.10.5 [#4105]

Fixes [#fixes-21]

* Updates `device.isApplePayAvailable` for more accurate filtering. Previously it returned true whenever the device supported Apple Pay, even if no card was added. It now returns true only when the device supports Apple Pay and the user has added a card.
* Fixes issue where `didRedeemLink` might not get called if there's no paywall available to present an alert from.

4.10.4 [#4104]

Fixes [#fixes-22]

* Updates Superscript version to 1.0.10. This fixes an issue with namespacing in cocoapods. View the original Rust release changelog [here](https://github.com/superwall/superscript/releases/tag/1.0.10).
* Fixes some issues building for visionOS.

4.10.3 [#4103]

Fixes [#fixes-23]

* Fixes issue where `Superwall.shared.confirmAllAssignments()` would be return an empty `Set` if config hadn't been retrieved.

4.10.1 [#4101]

Fixes [#fixes-24]

* Fixes issue where `willRedeemLink` might get called twice during the web checkout payment sheet flow.
* Fixes issue where paywall might get dismissed prematurely during web checkout.
* Fixes issue where the spinner on the paywall wasn't showing for a few seconds after the system closed the web checkout payment sheet due to a successful purchase.

4.10.0 [#4100]

Enhancements [#enhancements-17]

* Adds `CustomerInfo`. This contains the latest information about all of the customer's purchase and subscription data. This can be accessed via the published property `Superwall.shared.customerInfo`, via `Superwall.shared.getCustomerInfo()`, via the `AsyncStream` `customerInfoStream`, or via the delegate method `customerInfoDidChange(from:to:)`. This updates the `Entitlement` object to have more properties such as `startsAt` and `expiredAt`. These can be used in audience filters.
* Adds `Superwall.shared.entitlements.byProductIds(_:)` to return a `Set` of `Entitlement` objects belonging to a given set of product identifiers.
* Changes the `PurchaseController` examples to account for `CustomerInfo` changes.
* Adds `transaction_abandon` capability to web checkout payment sheet.

Fixes [#fixes-25]

* Fixes issue after purchasing web products where localized strings weren't correct in SDK wrappers like Expo.