Releases: RevenueCat/purchases-ios
4.27.2
RevenueCatUI
Paywalls
: improved purchase-in-progress UI (#3279) via NachoSoto (@NachoSoto)
Bugfixes
SK2StoreProduct.priceFormatter
: use locale fromStoreKit.Product
(#3278) via NachoSoto (@NachoSoto)
Performance Improvements
AAAttribution.attributionToken
: avoid using on main thread (#3281) via NachoSoto (@NachoSoto)
Other Changes
Paywalls Tester
: group live paywalls by template (#3276) via NachoSoto (@NachoSoto)
4.27.1
RevenueCatUI
Paywalls
: added shimmer effect toLoadingPaywallView
(#3267) via NachoSoto (@NachoSoto)
Bugfixes
Paywalls
: fixedmacOS
compilation (#3272) via NachoSoto (@NachoSoto)
Other Changes
- Update
SwiftLint
(#3273) via NachoSoto (@NachoSoto) - PaywallsTester: allow for configuration for demos (#3260) via Andy Boedo (@aboedo)
Paywalls
: simplifiedLoadingPaywallView
(#3265) via NachoSoto (@NachoSoto)
4.27.0
New Features
- Add
Attribution.setOnesignalUserID
(#3268) via Raquel Diez (@Raquel10-RevenueCat) - StoreKit In App messages support (#3252) via Toni Rico (@tonidero)
Other Changes
4.26.2
RevenueCatUI
Paywalls
: polished template 4 layout math (#3249) via NachoSoto (@NachoSoto)Paywalls
: improved template 1 iPad layout and iOS 15 fix (#3241) via NachoSoto (@NachoSoto)Paywalls
: polishedPurchaseButton
on iPad (#3240) via NachoSoto (@NachoSoto)
Dependency Updates
- Bump cocoapods from 1.12.1 to 1.13.0 (#3251) via dependabot[bot] (@dependabot[bot])
Other Changes
Paywalls
: added previews forIntroEligibilityStateView
(#3248) via NachoSoto (@NachoSoto)debugRevenueCatOverlay
: added list of active entitlements (#3247) via NachoSoto (@NachoSoto)- PaywallsTester: allow easy testing of paywall modes for All Offerings tab (#3254) via Andy Boedo (@aboedo)
- PaywallsTester: allow resizing on macOS (#3258) via Andy Boedo (@aboedo)
- PaywallsTester: replace opening default paywall automatically with button (#3256) via Andy Boedo (@aboedo)
- PaywallsTester: fix StoreKit Configuration scheme (#3257) via Andy Boedo (@aboedo)
- PaywallsTester: improve navigation on macOS and iPadOS (#3255) via Andy Boedo (@aboedo)
PrivacyInfo.xcprivacy
: changedNSPrivacyCollectedDataTypePurchaseHistory
tofalse
(#3242) via NachoSoto (@NachoSoto)Paywalls
: changedPaywallsTester
to allow not configuring API key (#3244) via NachoSoto (@NachoSoto)Paywalls
: renamedSimpleApp
toPaywallsTester
(#3243) via NachoSoto (@NachoSoto)- Make revisionID private in PaywallData+Default (#3239) via Cesar de la Vega (@vegaro)
4.26.1
RevenueCatUI
Paywalls
: don't display progress view inLoadingPaywallView
(#3235) via NachoSoto (@NachoSoto)Paywalls
: don't display "Purchases restored successfully" if nothings was restored (#3233) via NachoSoto (@NachoSoto)Paywalls
: avoid displaying offer details twice on.condensedFooter
s (#3230) via NachoSoto (@NachoSoto)Paywalls
: improvedfooterView
to use.continuous
rounded corners (#3222) via NachoSoto (@NachoSoto)
Dependency Updates
- Bump danger from 9.3.1 to 9.3.2 (#3229) via dependabot[bot] (@dependabot[bot])
- Bump fastlane from 2.215.1 to 2.216.0 (#3228) via dependabot[bot] (@dependabot[bot])
- Bump fastlane from 2.214.0 to 2.215.1 (#3221) via dependabot[bot] (@dependabot[bot])
Other Changes
Paywalls
: removed unused property (#3226) via NachoSoto (@NachoSoto)Configuration
: log warning if attempting to use observer mode with StoreKit 2 (#3066) via NachoSoto (@NachoSoto)PurchasedProductsFetcher
: refactoredfetchTransactions
(#3225) via NachoSoto (@NachoSoto)CI
: updated iOS 17 simulator (#3223) via NachoSoto (@NachoSoto)Integration Tests
: prevent false positives when purchasing returns 5xx (#3209) via NachoSoto (@NachoSoto)Integration Tests
: add coverage forPurchases.customerInfoStream
(#3213) via NachoSoto (@NachoSoto)
4.26.0
New Features
✨📱 Introducing RevenueCatUI 🐾🧱
RevenueCat's Paywalls allow you 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:
- Create a Paywall on the Dashboard for the
Offering
you intend to serve to your customers - Add the
RevenueCatUI
SPM dependency to your project 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...4.25.10
Bugfixes
Performance Improvements
OperationDispatcher
: add support for "long" delays (#3168) via NachoSoto (@NachoSoto)
Other Changes
Integration Tests
: add tests for ghost transfer behavior (#3135) via NachoSoto (@NachoSoto)Xcode
: removedpurchases-ios
SPM reference (#3166) via NachoSoto (@NachoSoto)Integration Tests
: another flaky failure (#3165) via NachoSoto (@NachoSoto)Integration Tests
: fix flaky test failure due to leftover transaction (#3167) via NachoSoto (@NachoSoto)Xcode 13
: removed lastSwift 5.7
checks (#3161) via NachoSoto (@NachoSoto)Integration Tests
: improve flaky tests (#3163) via NachoSoto (@NachoSoto)Codable
: improved decoding errors (#3153) via NachoSoto (@NachoSoto)- Refactor: extract
HealthOperation
(#3154) via NachoSoto (@NachoSoto) Xcode 13
: remove conditional code (#3147) via NachoSoto (@NachoSoto)CircleCI
: change all jobs to useXcode 14.x
and replacexcode-install
withxcodes
(#2421) via NachoSoto (@NachoSoto)
4.26.0-beta.4
New Features
✨ Introducing RevenueCatUI 📱 (beta):
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:
- Create a Paywall on the Dashboard for the
Offering
you intend to serve to your customers - Add the
RevenueCatUI
SPM dependency to your project 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)")
}
)
}
}
4.26.0-beta.3
New Features
✨ Introducing RevenueCatUI 📱 (beta):
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:
- Create a Paywall on the Dashboard for the
Offering
you intend to serve to your customers - Add the
RevenueCatUI
SPM dependency to your project 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") { customerInfo in
print("Purchase completed: \(customerInfo)")
}
}
}
4.25.9
Bugfixes
DebugViewModel
: fixed runtime crash on iOS < 16 (#3139) via NachoSoto (@NachoSoto)
Performance Improvements
PurchasesOrchestrator
: return early if receipt has no transactions when checking for promo offers (#3123) via Mark Villacampa (@MarkVillacampa)Purchases
: don't clear intro eligibility / purchased products cache on first launch (#3067) via NachoSoto (@NachoSoto)
Dependency Updates
SPM
: updatePackage.resolved
(#3130) via NachoSoto (@NachoSoto)
Other Changes
ReceiptParser
: fixed SPM build (#3144) via NachoSoto (@NachoSoto)carthage_installation_tests
: optimize SPM package loading (#3129) via NachoSoto (@NachoSoto)CI
: add workaround forCarthage
timing out (#3119) via NachoSoto (@NachoSoto)Integration Tests
: workaround to not lose debug logs (#3108) via NachoSoto (@NachoSoto)