4.30.1

RevenueCatUI

4.30.0

New Features

RevenueCatUI

Dependency Updates

Other Changes

4.29.0

New Features

RevenueCatUI

Bugfixes

Other Changes

4.28.1

Bugfixes

Other Changes

4.28.0

New Features

RevenueCatUI

Bugfixes

Other Changes

4.27.2

RevenueCatUI

Bugfixes

Performance Improvements

Other Changes

4.27.1

RevenueCatUI

Bugfixes

Other Changes

4.27.0

New Features

Other Changes

4.26.2

RevenueCatUI

Dependency Updates

Other Changes

4.26.1

RevenueCatUI

Dependency Updates

Other Changes

4.26.0

New Features

✨ Introducing RevenueCatUI 📱

RevenueCat's Paywalls allow you to to remotely configure your entire paywall view without any code changes or app updates. Our paywall templates use native code to deliver smooth, intuitive experiences to your customers when you’re ready to deliver them an Offering; and you can use our Dashboard to pick the right template and configuration to meet your needs.

To use RevenueCat Paywalls on iOS, simply:

  1. Create a Paywall on the Dashboard for the Offering you intend to serve to your customers
  2. Add the RevenueCatUI SPM dependency to your project
  3. import RevenueCatUI at the point in the user experience when you want to display a paywall:
import RevenueCatUI
import SwiftUI

struct YourApp: View {

    var body: some View {
        YourContent()
            .presentPaywallIfNeeded(
                requiredEntitlementIdentifier: "pro",
                purchaseCompleted: { customerInfo in
                    print("Purchase completed: \(customerInfo)")
                },
                restoreCompleted: { customerInfo in
                    print("Purchases restored: \(customerInfo)")
                }
            )
    }

}

You can find more information in our documentation.

List of changes * NachoSoto: `Paywalls`: renamed `PaywallEvent.view` to `.impression` (#3212) * NachoSoto: `Paywalls`: loading indicator for in-progress purchases (#3217) * NachoSoto: `Paywalls`: fixed template 4 bottom padding (#3211) * NachoSoto: `Paywalls`: only pre-warm images/intro-eligibility for `Offerings.current` (#3210) * NachoSoto: `Paywalls`: fixed mock intro eligibility on snapshot tests (#3205) * NachoSoto: `Paywalls`: fixed SimpleApp release build (#3203) * NachoSoto: `Paywalls`: improved `DebugErrorView` layout (#3204) * NachoSoto: `Paywalls`: refactored `PurchaseHandler` extracting protocol (#3196) * NachoSoto: `Paywalls`: automatically flush events (#3177) * NachoSoto: `Paywalls`: fixed `TemplateBackgroundImageView` aspect ratio (#3201) * NachoSoto: `Paywalls`: fixed broken layout on template 4 (#3202) * NachoSoto: `Paywalls`: events unit and integration tests (#3169) * NachoSoto: `Paywalls`: send events to `Purchases` (#3164) * NachoSoto: `Paywalls`: convert empty images into `nil` (#3195) * NachoSoto: `Paywalls`: new `onRestoreCompleted` handler (#3190) * NachoSoto: `Paywalls`: fixed `IntroEligibilityViewModel` data lifetime (#3194) * NachoSoto: `Paywalls`: test plan for running non-snapshot tests (#3188) * NachoSoto: `Paywalls`: polish template 4 (#3183) * NachoSoto: `Paywalls`: fixed data flow resulting in multiple `PurchaseHandler` instances (#3187) * Cesar de la Vega: `Paywalls`: update `blurred_background_image` key in `PaywallData` test fixture (#3186) * NachoSoto: `Paywalls`: added `Purchases.track(paywallEvent:)` (#3160) * NachoSoto: `Paywalls`: don't apply dark appearance with no dark mode colors (#3184) * NachoSoto: `Paywalls`: fixed template 2 + `.condensedFooter` + iPad (#3185) * NachoSoto: `Paywalls`: new `{{ sub_duration_in_months }}` variable (#3173) * NachoSoto: `Paywalls`: created `PaywallEventsManager` (#3159) * NachoSoto: `Paywalls`: implemented `PostPaywallEventsOperation` (#3158) * NachoSoto: `Paywalls`: new `{{ sub_relative_discount }}` variable (#3131) * Charlie Chapman: `Paywalls`: improved `FooterView` (#3171) * NachoSoto: `Paywalls`: fixed `FooterView` horizontal centering (#3172) * NachoSoto: `Paywalls`: created `PaywallEventStore` (#3157) * NachoSoto: `Paywalls`: add `PaywallEvent` model (#3156) * NachoSoto: `Paywalls`: add `PaywallData.revision` (#3155) * NachoSoto: `Paywalls`: support fuzzy-Locale search in `iOS 15` (#3162) * NachoSoto: `PaywallData`: added `@NonEmptyString` to `subtitle` and `offerName` (#3150) * NachoSoto: `Paywalls`: add paywall for Load Shedder integration tests (#3151) * NachoSoto: `Paywalls`: fixed error view being displayed on release builds (#3141) * NachoSoto: `Paywalls`: improved `{{ total_price_and_per_month }}` to include period (#3136) * NachoSoto: `Paywalls`: `{{ price_per_period }}` now takes `SubscriptionPeriod.value` into account (#3133) * NachoSoto: `Paywalls`: add Arabic to SimpleApp for testing (#3132) * NachoSoto: `Paywalls`: update snapshot generation with new separate git repo (#3116) * NachoSoto: `Paywalls`: add support for CTA button gradients (#3121) * NachoSoto: `Paywalls`: template 5 (#3095) * NachoSoto: `Paywalls`: replaced submodule with `gitignore`d reference (#3125) * NachoSoto: `Catalyst`: fixed a couple of Catalyst build warnings (#3120) * NachoSoto: `Paywalls`: reference test snapshots from submodule (#3115) * NachoSoto: `Paywalls`: removed `presentedPaywallViewMode` (#3109) * NachoSoto: `Paywalls`: remove duplicate `RevenueCat` scheme to fix Carthage (#3105) * NachoSoto: `Paywalls`: fixed iOS 12 build (#3104) * NachoSoto: `Paywalls`: fixed template 2 inconsistent spacing (#3091) * NachoSoto: `Paywalls`: improved test custom paywall (#3089) * NachoSoto: `Paywalls`: avoid warming up cache multiple times (#3068) * NachoSoto: `Paywalls`: added all localization (#3080) * NachoSoto: `Paywalls`: temporarily disable `PaywallTemplate.template4` (#3088) * NachoSoto: `Paywalls`: enabled `Catalyst` support (#3087) * NachoSoto: `Paywalls`: iPad polish (#3061) * NachoSoto: `Paywalls`: added MIT license to all headers (#3084) * NachoSoto: `Paywalls`: improved unselected package background color (#3079) * NachoSoto: `Paywalls`: handle already purchased state (#3046) * NachoSoto: `Paywalls`: only dismiss `PaywallView` when explicitly presenting it with `.presentPaywallIfNeeded` (#3075) * NachoSoto: `Paywalls`: add support for generating snapshots on CI (#3055) * NachoSoto: `Paywalls`: removed unnecessary `PaywallFooterView` (#3064) * Josh Holtz: `Paywalls`: new `PaywallFooterView` to replace `modes` (#3051) * Josh Holtz: `Paywalls`: rename card to footer (#3049) * NachoSoto: `Paywalls`: changed `total_price_and_per_month` to include period (#3044) * NachoSoto: `Paywalls`: internal documentation for implementing templates (#3053) * NachoSoto: `Paywalls`: finished `iOS 15` support (#3043) * NachoSoto: `Paywalls`: validate `PaywallData` to ensure displayed data is always correct (#3019) * NachoSoto: `Paywalls`: fixed `total_price_and_per_month` for custom monthly packages (#3027) * NachoSoto: `Paywalls`: tweaking colors on template 2&3 (#3011) * NachoSoto: `Paywalls`: changed snapshots to scale 1 (#3016) * NachoSoto: `Paywalls`: replaced `defaultLocale` with `preferredLocales` (#3003) * NachoSoto: `Paywalls`: improved `PaywallDisplayMode.condensedCard` layout (#3001) * NachoSoto: `Paywalls`: `.card` and `.condensedCard` modes (#2995) * NachoSoto: `Paywalls`: prevent multiple concurrent purchases (#2991) * NachoSoto: `Paywalls`: improved variable warning (#2984) * NachoSoto: `Paywalls`: fixed horizontal padding on template 1 (#2987) * NachoSoto: `Paywalls`: changed `FooterView` to always use `text1` color (#2992) * NachoSoto: `Paywalls`: retry test failures (#2985) * NachoSoto: `Paywalls`: send presented `PaywallViewMode` with purchases (#2859) * NachoSoto: `Paywalls`: added support for custom fonts (#2988) * NachoSoto: `Paywalls`: improved template 2 unselected packages (#2982) * Josh Holtz: `Paywalls`: fix template 2 selected text offer details color (#2975) * NachoSoto: `Paywalls`: warm-up image cache (#2978) * NachoSoto: `Paywalls`: extracted `PaywallCacheWarming` (#2977) * NachoSoto: `Paywalls`: fixed color in template 3 (#2980) * NachoSoto: `Paywalls`: improved default template (#2973) * NachoSoto: `Paywalls`: added links to documentation (#2974) * NachoSoto: `Paywalls`: updated template names (#2971) * NachoSoto: `Paywalls`: updated variable names (#2970) * NachoSoto: `Paywalls`: added JSON debug screen to `debugRevenueCatOverlay` (#2972) * NachoSoto: `Paywalls`: multi-package horizontal template (#2949) * NachoSoto: `Paywalls`: fixed template 3 icon aspect ratio (#2969) * NachoSoto: `Paywalls`: iOS 17 tests on CI (#2955) * NachoSoto: `Paywalls`: deploy `debug` sample app (#2966) * NachoSoto: `Paywalls`: sort offerings list in sample app (#2965) * NachoSoto: `Paywalls`: initial iOS 15 support (#2933) * NachoSoto: `Paywalls`: changed default `PaywallData` to display available packages (#2964) * NachoSoto: `Paywalls`: changed `offerDetails` to be optional (#2963) * NachoSoto: `Paywalls`: markdown support (#2961) * NachoSoto: `Paywalls`: updated icon set to match frontend (#2962) * NachoSoto: `Paywalls`: added support for `PackageType.custom` (#2959) * NachoSoto: `Paywalls`: fixed `tvOS` compilation by making it explicitly unavailable (#2956) * NachoSoto: `Paywalls`: fix crash when computing localization with duplicate packages (#2958) * NachoSoto: `Paywalls`: UIKit `PaywallViewController` (#2934) * NachoSoto: `Paywalls`: `presentPaywallIfNecessary` -> `presentPaywallIfNeeded` (#2953) * NachoSoto: `Paywalls`: added support for custom and lifetime products (#2941) * NachoSoto: `Paywalls`: changed `SamplePaywallsList` to work offline (#2937) * NachoSoto: `Paywalls`: fixed header image mask on first template (#2936) * NachoSoto: `Paywalls`: new `subscription_duration` variable (#2942) * NachoSoto: `Paywalls`: removed `mode` parameter from `presentPaywallIfNecessary` (#2940) * NachoSoto: `Paywalls`: improved `RemoteImage` error layout (#2939) * NachoSoto: `Paywalls`: added default close button when using `presentPaywallIfNecessary` (#2935) * NachoSoto: `Paywalls`: added ability to preview templates in a `.sheet` (#2938) * NachoSoto: `Paywalls`: avoid recomputing variable `Regex` (#2944) * NachoSoto: `Paywalls`: improved `FooterView` scaling (#2948) * NachoSoto: `Paywalls`: added ability to calculate and localize subscription discounts (#2943) * NachoSoto: `Offering`: improved description (#2912) * NachoSoto: `Paywalls`: fixed `FooterView` color in template 1 (#2951) * NachoSoto: `Paywalls`: fixed `View.scrollableIfNecessary` (#2947) * NachoSoto: `Paywalls`: improved `IntroEligibilityStateView` to avoid layout changes (#2946) * NachoSoto: `Paywalls`: updated offerings snapshot with new asset base URL (#2950) * NachoSoto: `Paywalls`: extracted `TemplateBackgroundImageView` (#2945) * NachoSoto: `Paywalls`: more polish from design feedback (#2932) * NachoSoto: `Paywalls`: more unit tests for purchasing state (#2931) * NachoSoto: `Paywalls`: new `.onPurchaseCompleted` modifier (#2930) * NachoSoto: `Paywalls`: fixed `LoadingPaywallView` displaying a progress view (#2929) * NachoSoto: `Paywalls`: added default template to `SamplePaywallsList` (#2928) * NachoSoto: `Paywalls`: added a few more logs (#2927) * NachoSoto: `Paywalls` added individual previews for templates (#2924) * NachoSoto: `Paywalls`: improved default paywall configuration (#2926) * NachoSoto: `Paywalls`: moved purchasing state to `PurchaseHandler` (#2923) * NachoSoto: `Paywalls`: updated Integration Test snapshot (#2921) * NachoSoto: `Paywalls`: pre-warm intro eligibility in background thread (#2925) * NachoSoto: `Paywalls`: removed "couldn't find package" log (#2922) * NachoSoto: `Paywalls`: SimpleApp reads API key from Xcode Cloud environment (#2919) * NachoSoto: `Paywalls`: improved template accessibility support (#2920) * NachoSoto: `Paywalls`: work around SwiftUI bug to allow embedding `PaywallView` inside `NavigationStack` (#2918) * NachoSoto: `Paywalls`: some basic polish from design feedback (#2917) * NachoSoto: `Paywalls`: added `OfferingsList` to preview all paywalls (#2916) * NachoSoto: `Paywalls`: fixed tappable area for a couple of buttons (#2915) * NachoSoto: `Paywalls`: new `text1` and `text2` colors (#2903) * NachoSoto: `Paywalls`: updated multi-package bold template design (#2908) * NachoSoto: `Paywalls`: added sample paywalls to `SimpleApp` (#2907) * NachoSoto: `Paywalls`: one package with features template (#2902) * NachoSoto: `Paywalls`: initial support for icons (#2882) * NachoSoto: `Paywalls`: extracted intro eligibility out of templates (#2901) * NachoSoto: `Paywalls`: changed `subtitle` to be optional (#2900) * NachoSoto: `Paywalls`: added "features" to `LocalizedConfiguration` (#2899) * NachoSoto: `Paywalls`: fixed `{{ total_price_and_per_month }}` (#2881) * NachoSoto: `Paywalls`: updated template names (#2878) * NachoSoto: `Paywalls`: added accent colors (#2883) * NachoSoto: `Paywalls`: changed images representation to an object (#2875) * NachoSoto: `Paywalls`: added `offerName` parameter (#2877) * NachoSoto: `Paywalls`: new `{{ period }}` variable (#2876) * NachoSoto: `Paywalls`: disabled `PaywallViewMode`s for now (#2874) * NachoSoto: `Paywalls`: added new `defaultPackage` configuration (#2871) * NachoSoto: `Paywalls`: fixed tests on CI (#2872) * NachoSoto: `Paywalls`: pre-fetch intro eligibility for paywalls (#2860) * Andy Boedo: `Paywalls`: clean up the error view (#2873) * NachoSoto: `Paywalls`: new API for easily displaying `PaywallView` with just one line (#2869) * NachoSoto: `Paywalls`: handle missing paywalls gracefully (#2855) * NachoSoto: `Paywalls`: temporarily disable non-fullscreen `PaywallView`s (#2868) * NachoSoto: `Paywalls`: added test to ensure package selection maintains order (#2853) * NachoSoto: `Paywalls`: added new `blurredBackgroundImage` configuration (#2852) * NachoSoto: `Paywalls`: fuzzy `Locale` lookups (#2847) * NachoSoto: `Paywalls`: basic localization support (#2851) * NachoSoto: `Paywalls`: added `FooterView` (#2850) * NachoSoto: `Paywalls`: multi-package template (#2840) * NachoSoto: `Paywalls`: disable animations during unit tests (#2848) * NachoSoto: `Paywalls`: `TrialOrIntroEligibilityChecker.eligibility(for packages:)` (#2846) * NachoSoto: `Paywalls`: added new `total_price_and_per_month` variable (#2845) * NachoSoto: `Paywalls`: extracted `PurchaseButton` (#2839) * NachoSoto: `Paywalls`: extracted `IntroEligibilityStateView` (#2837) * NachoSoto: `Paywalls`: support for multiple `PaywallViewMode`s (#2834) * NachoSoto: `Paywalls`: add support for multiple images in template configuration (#2832) * NachoSoto: `Paywalls`: extracted configuration processing into a new `TemplateViewConfiguration` (#2830) * NachoSoto: `Paywalls`: improved support for dynamic type with snapshots (#2827) * NachoSoto: `Paywalls`: disable `macOS`/`macCatalyst`/`watchOS` for now (#2821) * NachoSoto: `Paywalls`: using new color information in template (#2823) * NachoSoto: `Paywalls`: set up CI tests and API Tester (#2816) * NachoSoto: `Paywalls`: added support for decoding colors (#2822) * NachoSoto: `Paywalls`: ignore empty strings in `LocalizedConfiguration` (#2818) * NachoSoto: `Paywalls`: updated `PaywallData` field names (#2817) * NachoSoto: `Paywalls`: added support for purchasing (#2812) * NachoSoto: `Paywalls`: added tests for `PackageType` filtering (#2810) * Andy Boedo: `Paywalls`: changed variable handling to use Swift `Regex` (#2811) * NachoSoto: `Paywalls`: added `price` variable (#2809) * NachoSoto: `Paywalls`: determine intro eligibility (#2808) * NachoSoto: `Paywalls`: added header image to configuration (#2800) * NachoSoto: `Paywalls`: added `packages` to configuration (#2798) * NachoSoto: `Paywalls`: add support for displaying `StoreProductDiscount`s (#2796) * NachoSoto: `Paywalls`: added support for variables (#2793) * NachoSoto: `Paywalls`: using `PaywallData` and setting up basic template loading (#2781) * NachoSoto: `Paywalls`: initial configuration types (#2780) * NachoSoto: `Paywalls`: initial `RevenueCatUI` target setup (#2776)

Other Changes

4.25.10

Bugfixes

Performance Improvements

Other Changes

4.25.9

Bugfixes

Performance Improvements

Dependency Updates

Other Changes

4.25.8

Dependency Updates

Other Changes

4.25.7

Other Changes

4.25.6

Bugfixes

4.25.5

Bugfixes

Performance Improvements

Other Changes

4.25.4

This release is compatible with Xcode 15 beta 6 and visionOS beta 3

Bugfixes

Other Changes

4.25.3

This release is compatible with Xcode 15 beta 6 and visionOS beta 3

Bugfixes

Performance Improvements

Other Changes

4.25.2

This release is compatible with Xcode 15 beta 5 and visionOS beta 2

Bugfixes

Performance Improvements

Other Changes

4.25.1

Dependency Updates

Other Changes

4.25.0

New Features

This new feature prevents MitM attacks between the SDK and the RevenueCat server. With verification enabled, the SDK ensures that the response created by the server was not modified by a third-party, and the entitlements received are exactly what was sent. This is 100% opt-in. EntitlementInfos have a new VerificationResult property, which will indicate the validity of the responses when this feature is enabled.

let purchases = Purchases.configure(
  with: Configuration
    .builder(withAPIKey: "")
    .with(entitlementVerificationMode: .informational)
)
let customerInfo = try await purchases.customerInfo()
if !customerInfo.entitlements.verification.isVerified {
  print("Entitlements could not be verified")
}

You can learn more from the documentation.

Other Changes

4.24.1

Bugfixes

Other Changes

4.24.0

New Features

Dependency Updates

Other Changes

4.23.1

Bugfixes

Other Changes

4.23.0

New Features

Bugfixes

Other Changes

4.22.1

Bugfixes

Performance Improvements

Other Changes

4.22.0

New Features

Bugfixes

Dependency Updates

Other Changes

4.21.1

This release is compatible with Xcode 15 beta 1

Bugfixes

Other Changes

4.21.0

New Features

Bugfixes

Performance Improvements

Dependency Updates

Other Changes

4.20.0

New Features

Bugfixes

Performance Improvements

Other Changes

4.19.1

Other Changes

PostReceiptOperation: added ability to also post AdServices token (#2549) via NachoSoto (@NachoSoto)

4.19.0

New Features

Bugfixes

Other Changes
  • Introduced Configuration.EntitlementVerificationMode and VerificationResult (#2277) via NachoSoto (@NachoSoto)
  • PurchasesDiagnostics: added step to verify signature verification (#2267) via NachoSoto (@NachoSoto)
  • HTTPClient: added signature validation and introduced ErrorCode.signatureVerificationFailed (#2272) via NachoSoto (@NachoSoto)
  • ETagManager: don't use ETags if response verification failed (#2347) via NachoSoto (@NachoSoto)
  • Integration Tests: removed @preconcurrency import (#2464) via NachoSoto (@NachoSoto)
  • Clean up: moved ReceiptParserTests-Info.plist out of root (#2460) via NachoSoto (@NachoSoto)
  • Update CHANGELOG (#2461) via NachoSoto (@NachoSoto)
  • Update SwiftSnapshotTesting (#2453) via NachoSoto (@NachoSoto)
  • Fixed docs (#2432) via Kaunteya Suryawanshi (@kaunteya)
  • Remove unnecessary line break (#2435) via Andy Boedo (@aboedo)
  • ProductEntitlementMapping: enabled entitlement mapping fetching (#2425) via NachoSoto (@NachoSoto)
  • BackendPostReceiptDataTests: increased timeout to fix flaky test (#2426) via NachoSoto (@NachoSoto)
  • Updated requirements to drop Xcode 13.x support (#2419) via NachoSoto (@NachoSoto)
  • Integration Tests: fixed flaky errors when loading offerings (#2420) via NachoSoto (@NachoSoto)
  • PurchaseTester: fixed compilation for internal entitlement verification (#2417) via NachoSoto (@NachoSoto)
  • ETagManager/HTTPClient: sending new X-RC-Last-Refresh-Time header (#2373) via NachoSoto (@NachoSoto)
  • ETagManager: don't send validation time if not present (#2490) via NachoSoto (@NachoSoto)
  • SwiftUI Sample Project: Refactor Package terms method to a computed property (#2405) via Joseph Kokenge (@JOyo246)
  • Clean up v3 load shedder integration tests (#2402) via Andy Boedo (@aboedo)
  • Fix iOS 12 compilation (#2394) via NachoSoto (@NachoSoto)
  • Added new VerificationResult.verifiedOnDevice (#2379) via NachoSoto (@NachoSoto)
  • PurchaseTester: fix memory leaks (#2392) via Keita Watanabe (@kitwtnb)
  • Integration tests: add scheduled job (#2389) via Andy Boedo (@aboedo)
  • Add lane for running iOS v3 load shedder integration tests (#2388) via Andy Boedo (@aboedo)
  • iOS v3 load shedder integration tests (#2387) via Andy Boedo (@aboedo)
  • Offline Entitlements: created LoadShedderIntegrationTests (#2362) via NachoSoto (@NachoSoto)
  • Purchases.configure: log warning if attempting to use a static appUserID (#2385) via Mark Villacampa (@MarkVillacampa)
  • SubscriberAttributesManagerIntegrationTests: fixed flaky failures (#2381) via NachoSoto (@NachoSoto)
  • @DefaultDecodable.Now: fixed flaky test (#2374) via NachoSoto (@NachoSoto)
  • PurchaseTesterSwiftUI: fixed iOS compilation (#2376) via NachoSoto (@NachoSoto)
  • SubscriberAttributesManagerIntegrationTests: fixed potential race condition (#2380) via NachoSoto (@NachoSoto)
  • Offline Entitlements: create CustomerInfo from offline entitlements (#2358) via NachoSoto (@NachoSoto)
  • Added @DefaultDecodable.Now (#2372) via NachoSoto (@NachoSoto)
  • HTTPClient: debug log when performing redirects (#2371) via NachoSoto (@NachoSoto)
  • HTTPClient: new flag to force server errors (#2370) via NachoSoto (@NachoSoto)
  • OfferingsManager: fixed Xcode 13.x build (#2369) via NachoSoto (@NachoSoto)
  • Offline Entitlements: store ProductEntitlementMapping in cache (#2355) via NachoSoto (@NachoSoto)
  • Offline Entitlements: added support for fetching ProductEntitlementMappingResponse in OfflineEntitlementsAPI (#2353) via NachoSoto (@NachoSoto)
  • Offline Entitlements: created ProductEntitlementMapping (#2365) via NachoSoto (@NachoSoto)
  • Implemented NetworkError.isServerDown (#2367) via NachoSoto (@NachoSoto)
  • ETagManager: added test for 304 responses with no etag (#2360) via NachoSoto (@NachoSoto)
  • TestLogHandler: increased default capacity (#2357) via NachoSoto (@NachoSoto)
  • OfferingsManager: moved log to common method to remove hardcoded string (#2363) via NachoSoto (@NachoSoto)
  • Offline Entitlements: created ProductEntitlementMappingResponse (#2351) via NachoSoto (@NachoSoto)
  • HTTPClient: added test for 2xx response for request with etag (#2361) via NachoSoto (@NachoSoto)
  • PurchaseTesterSwiftUI improvements (#2345) via NachoSoto (@NachoSoto)
  • ConfigureStrings: fixed double-space typo (#2344) via NachoSoto (@NachoSoto)
  • ETagManagerTests: fixed tests on iOS 12 (#2349) via NachoSoto (@NachoSoto)
  • DeviceCache: simplified constructor (#2354) via NachoSoto (@NachoSoto)
  • Trusted Entitlements: changed all APIs to internal (#2350) via NachoSoto (@NachoSoto)
  • VerificationResult.notRequested: removed caching reference (#2337) via NachoSoto (@NachoSoto)
  • Finished signature verification HTTPClient tests (#2333) via NachoSoto (@NachoSoto)
  • Configuration.Builder.with(entitlementVerificationMode:): improved documentation (#2334) via NachoSoto (@NachoSoto)
  • ETagManager: don't ignore failed etags with Signing.VerificationMode.informational (#2331) via NachoSoto (@NachoSoto)
  • IdentityManager: clear ETagManager and DeviceCache if verification is enabled but cached CustomerInfo is not (#2330) via NachoSoto (@NachoSoto)
  • Made Configuration.EntitlementVerificationMode.enforced unavailable (#2329) via NachoSoto (@NachoSoto)
  • Refactor: reorganized files in new Security and Misc folders (#2326) via NachoSoto (@NachoSoto)
  • CustomerInfo: use same grace period logic for active subscriptions (#2327) via NachoSoto (@NachoSoto)
  • HTTPClient: don't verify 4xx/5xx responses (#2322) via NachoSoto (@NachoSoto)
  • EntitlementInfo: request date is not optional (#2325) via NachoSoto (@NachoSoto)
  • CustomerInfo: removed entitlementVerification (#2320) via NachoSoto (@NachoSoto)
  • Renamed VerificationResult.notVerified to .notRequested (#2321) via NachoSoto (@NachoSoto)
  • EntitlementInfo: add a grace period limit to outdated entitlements (#2288) via NachoSoto (@NachoSoto)
  • Update CustomerInfo.requestDate from 304 responses (#2310) via NachoSoto (@NachoSoto)
  • Signing: added request time & eTag to signature verification (#2309) via NachoSoto (@NachoSoto)
  • HTTPClient: changed header search to be case-insensitive (#2308) via NachoSoto (@NachoSoto)
  • HTTPClient: automatically add nonce based on HTTPRequest.Path (#2286) via NachoSoto (@NachoSoto)
  • PurchaseTester: added ability to reload CustomerInfo with a custom CacheFetchPolicy (#2312) via NachoSoto (@NachoSoto)
  • Fix issue where underlying error information for product fetch errors was not printed in log. (#2281) via Chris Vasselli (@chrisvasselli)
  • PurchaseTester: added ability to set Configuration.EntitlementVerificationMode (#2290) via NachoSoto (@NachoSoto)
  • SwiftUI: Paywall View should respond to changes on the UserView model (#2297) via ConfusedVorlon (@ConfusedVorlon)
  • Deprecate usesStoreKit2IfAvailable (#2293) via Andy Boedo (@aboedo)
  • Signing: updated to use production public key (#2274) via NachoSoto (@NachoSoto)

4.18.0

New Features

This new library allows apps to use a smaller version of the RevenueCat SDK, intended for apps that will do their own entitlement computation separate from RevenueCat.

Apps using this mode rely on webhooks to signal their backends to refresh entitlements with RevenueCat.

See the demo app for an example and usage instructions.

Bugfixes

Other Changes

4.17.11

Bug Fixes

4.17.10

Bugfixes

Other Changes

4.17.9

Bugfixes

Performance Improvements

Other Changes

4.17.8

Bugfixes

Performance Improvements

Other Changes

4.17.7

Bugfixes

Other Changes

4.17.6

Bugfixes

Other Changes

4.17.5

Dependency Updates

Other Changes

4.17.4

Bugfixes

Other Changes

4.17.3

Bugfixes

Other Changes

4.17.2

Bugfixes

Other Changes

4.17.1

Other Changes

4.17.0

New Features

Bugfixes

Other Changes

4.16.0

New Features

Bugfixes

Other Changes

4.15.5

Bugfixes

Other Changes

4.15.4

Bugfixes

Other Changes

4.15.3

Bugfixes

Other Changes

4.15.2

Bugfixes

Other Changes

4.15.1

Bugfixes

Other Changes

4.15.0

New Features

Other Changes

4.14.3

Bugfixes

Other Changes

4.14.2

Bugfixes

Other Changes

4.14.1

Bugfixes

Other Changes

4.14.0

New Features

Bugfixes

Other Changes

4.13.4

Bugfixes

Other Changes

4.13.3

Other Changes

4.13.2

Bugfixes

Other Changes

4.13.1

Other Changes

4.13.0

New Features

Bugfixes

Other Changes

4.12.1

Bugfixes

Other Changes

4.12.0

Bugfixes

New Features

Other Changes

4.11.0

Bugfixes

New Features

Other Changes

4.10.3

Bugfixes

Other Changes

4.10.2

Bugfixes

Other Changes

4.10.1

Bugfixes

4.10.0

New Features

Bugfixes

Other Changes

4.9.1

Fixes:

Improvements:

Other changes:

4.9.0

4.8.0

New API

Other Changes

4.7.0

Changes:

All attribution APIs can now be accessed from Purchases.shared.attribution.

Improvements:

Fixes:

4.6.1

Bug fixes

4.6.0

This release is compatible with Xcode 14 beta 1

New Features

In addition to EntitlementInfos.active, two new methods are added to allow detecting entitlements from sandbox and production environments:

customerInfo.entitlements.activeInCurrentEnvironment
customerInfo.entitlements.activeInAnyEnvironment

Bug fixes

4.5.2

This version supports Xcode 14 beta 1

4.5.1

Fixes

4.5.0

New Features

Bug Fixes

Other Changes

4.4.0

New Features

Fixes

Other changes

4.3.0

API updates:

Other:

4.2.1

4.2.0

API updates:

Other:

4.1.0

API updates:

Other:

4.0.0

RevenueCat iOS SDK v4 is here!!

Dancing cats

Full Changelog

Migration Guide

API changes:

There have been a lot of changes since v3!

Here are the highlights:

Async / Await alternative APIs

New async / await alternatives for all APIs that have completion blocks, as well as an AsyncStream for CustomerInfo.

New types and cleaned up naming

New types that wrap StoreKit's native types, and we cleaned up the naming of other types and methods for a more consistent experience.

New APIs for Customer Support

You can now use showManageSubscriptions() and beginRefundRequest() to help your users manage their subscriptions right from the app.

Rewritten in Swift

We rewrote the SDK in 100% Swift. This made the code more uniform and easy to maintain, and helps us better support StoreKit 2.

StoreKit 2 Support [Beta]

[Experimental] Introduced support for using StoreKit 2 under the hood for compatible devices. This is currently in beta phase, and disabled by default. When enabled, StoreKit 2 APIs will be used under the hood for purchases in compatible devices. You can enable this by configuring the SDK passing useStoreKit2IfAvailable: true. On devices that don't support StoreKit 2, StoreKit 1 will be used automatically instead.

Full API changes list

Documentation:

We built a new Documentation site with Docc with cleaner and more detailed docs. The new documentation can be found here.

4.0.0-RC.4

Full Changelog

RC 4 introduces the following updates:

API changes:

Breaking changes:

Additions:

Documentation:

Other changes:

Changes from previous RC

These changes add to all of the changes from beta RC 2, listed here..

4.0.0-RC.3

Full Changelog

RC 3 introduces the following updates:

API changes:

Documentation:

Migration fixes

Other changes:

Changes from previous RC

These changes add to all of the changes from beta RC 2, listed here..

4.0.0-RC.2

Full Changelog

RC 2 introduces the following updates:

API changes:

Documentation:

Migration fixes

Other changes:

Changes from previous RC

These changes add to all of the changes from beta RC 1, listed here..

4.0.0-RC.1

Full Changelog

RC 1 introduces the following updates:

API changes:

In addition to all of the changes from beta 10, listed here.

Other changes:

4.0.0-beta.10

Full Changelog

Beta 10 introduces the following updates:

Breaking changes:

In addition to all of the changes from Beta 9, listed here.

Other changes:

4.0.0-beta.9

Full Changelog

Breaking changes:

Xcode version requirements and updated deployment targets

purchases-ios v4 requires using Xcode 13.2 or newer. It also updates the minimum deployment targets for iOS, macOS and tvOS.

Minimum deployment targets
v3 v4
iOS 9.0 11.0
tvOS 9.0 11.0
macOS 10.12 10.13
watchOS 6.2 6.2 (unchanged)

StoreKit 2 support:

Async / Await alternative APIs

New APIs:

Known issues:

Other changes:

4.0.0-beta.8

4.0.0-beta.7

4.0.0-beta.6

4.0.0-beta.5

4.0.0-beta.4

4.0.0-beta.3

4.0.0-beta.2

4.0.0-beta.1

3.12.5

3.12.4

3.12.3

3.12.2

3.12.1

3.12.0

Identity V3:

New methods

Deprecations

Other changes:

Public additions

SharedPurchases nullability
Improved log handling

Deprecations

Other

3.11.1

3.11.0

3.10.7

3.10.6

3.10.5

3.10.4

3.10.3

3.10.2

3.10.1

3.10.0

3.9.2

3.9.1

3.9.0

3.8.0

3.7.6

3.7.5

3.7.4

3.7.3

3.7.2

3.7.1

3.7.0

3.6.0

3.5.3

3.5.2

3.5.1

3.5.0

3.4.0

3.3.1

3.3.0

3.2.2

3.2.1

3.2.0

3.1.2

3.1.1

3.1.0

3.0.4

3.0.3

3.0.2

3.0.1

3.0.0

2.6.1

2.6.0

2.5.0

2.4.0

2.3.0

2.2.0

2.1.1

2.1.0

2.0.0

1.2.1

1.2.0

1.1.5

1.1.4

1.1.3

1.1.2

1.1.1

1.1.0

1.0.5

1.0.4

1.0.3

1.0.2

1.0.1

1.0.0

0.12.0

0.11.0

0.10.2

0.10.1

0.10.0

0.9.0

0.8.0

0.7.0

0.6.0

0.5.0

0.4.0

0.3.0

0.2.0

0.1.0