diff --git a/.version b/.version
index cc71b9e937..537244950b 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-5.81.0-SNAPSHOT
+5.81.0
diff --git a/CHANGELOG.latest.md b/CHANGELOG.latest.md
index ecec5e0d9d..09db1febd7 100644
--- a/CHANGELOG.latest.md
+++ b/CHANGELOG.latest.md
@@ -1,37 +1,34 @@
-## RevenueCat SDK
-### 🐞 Bugfixes
-* Fix decode for sheet actions without inline sheet (#7158) via Monika Mateska (@MonikaMateska)
-* Expose preferred UI locale override APIs to Objective-C (#7121) via Álvaro Brey (@AlvaroBrey)
-
## RevenueCatUI SDK
### 🐞 Bugfixes
-* fix(paywalls-v2): fix package selection resetting unexpectedly when switching tabs (#7148) via Facundo Menzella (@facumenzella)
+* Fix Paywalls V2 carousel image stuck in size-unknown state on first display (#7180) via Jacob Rakidzich (@JZDesign)
### Paywallv2
-#### 🐞 Bugfixes
-* fix(paywalls-v2): skip stale onChange invocations when propagating tab package to parent (#7168) via Facundo Menzella (@facumenzella)
+#### ✨ New Features
+* feat(paywalls): support transparent sticky footers (#7188) via Álvaro Brey (@AlvaroBrey)
### 🔄 Other Changes
-* other(workflows): unify workflows and remote config into a single gate (#7166) via Facundo Menzella (@facumenzella)
-* perf(remote-config): merge blob data via byte concatenation (#7163) via Antonio Pallares (@ajpallares)
-* other(paywalls): fall back to the offerings paywall when the workflow fetch fails (#7143) via Facundo Menzella (@facumenzella)
-* test(remote-config): add additional regression test coverage (#7164) via Rick (@rickvdl)
-* feat(remote-config): use merged blobs helper for ui config (#7153) via Rick (@rickvdl)
-* other(networking): remove unused workflows OperationQueue and HTTP path cases (#7145) via Facundo Menzella (@facumenzella)
-* other(networking): delete the dead workflows endpoint (#7144) via Facundo Menzella (@facumenzella)
-* other(paywalls): read workflows from remote config (#7141) via Facundo Menzella (@facumenzella)
-* refactor(remote-config): encapsulate topic-ready waiting on RemoteConfigManager (#7157) via Facundo Menzella (@facumenzella)
-* test(remote-config): add integration test coverage with mocked API responses (#7147) via Rick (@rickvdl)
-* other(paywalls): gate getOfferings on remote-config readiness (#7142) via Facundo Menzella (@facumenzella)
-* feat(remote-config): add merged blob data API (#7149) via Rick (@rickvdl)
-* other(remote-config): read ui_config via remote config (#7140) via Facundo Menzella (@facumenzella)
-* fix(remote-config): use RemoteConfigTopic enum in disk cache tests (#7139) via Antonio Pallares (@ajpallares)
-* perf(remote-config): cache persisted config in memory in RemoteConfigDiskCache (#7136) via Antonio Pallares (@ajpallares)
-* feat(remote-config): add APIs for reading topic/blob data from RemoteConfigManager (#7134) via Rick (@rickvdl)
-* Add SecureItemStorage (#7094) via Dave DeLong (@davedelong)
-* Decode id on PaywallComponent.PackageComponent (#7135) via Facundo Menzella (@facumenzella)
-* feat(remote-config): add observability logs (#7132) via Rick (@rickvdl)
-* feat(remote-config): wire up remote config manager behind feature flag (#7130) via Rick (@rickvdl)
-* Support multi-grant reward + moreRewards in reward verification (#7039) via Pol Miro (@polmiro)
-* Add CI build step for app extension safe API checks (#7131) via Rick (@rickvdl)
-* fix(remote-config): rearm exhausted blob sources + in memory knownRefs (#7120) via Rick (@rickvdl)
-* feat(remote-config): disable refresh after client errors (#7118) via Rick (@rickvdl)
+* feat(remote-config): force app_start on the first config request (#7219) via Antonio Pallares (@ajpallares)
+* test(workflows): add Maestro flow for classic-paywall fallback on config failure (#7235) via Facundo Menzella (@facumenzella)
+* test(workflows): add Maestro flow for workflow paywall back navigation (#7224) via Facundo Menzella (@facumenzella)
+* test(remote-config): don't send app_start in no-content config tests (#7222) via Antonio Pallares (@ajpallares)
+* test(workflows): add Maestro flow that navigates a workflow paywall to purchase (#7221) via Facundo Menzella (@facumenzella)
+* ci(remote-config): run the blob health monitor (#7218) via Facundo Menzella (@facumenzella)
+* test(remote-config): add a real-backend health check for CDN blob downloads (#7215) via Facundo Menzella (@facumenzella)
+* feat(remote-config): send fetch_context on config endpoint requests (#7214) via Antonio Pallares (@ajpallares)
+* Internal `DangerousSettings.useWorkflows` to enable remote config/workflows programmatically (#7209) via Cesar de la Vega (@vegaro)
+* test(remote-config): cover downloading several config blobs at once (#7212) via Facundo Menzella (@facumenzella)
+* test(remote-config): cover getOfferings delivering when a prefetch blob fails (#7211) via Facundo Menzella (@facumenzella)
+* Use short timeouts for remote config blob downloads (#7210) via Rick (@rickvdl)
+* perf(remote-config): give /config its own request lane so it overlaps /offerings (#7196) via Facundo Menzella (@facumenzella)
+* Pass Tuist Swift conditions to local package (#7195) via Rick (@rickvdl)
+* other(remote-config): stabilize flaky RemoteConfig blob integration test (#7193) via Antonio Pallares (@ajpallares)
+* Chore(deps): Bump excon from 0.112.0 to 1.5.0 in /Tests/InstallationTests/CocoapodsInstallation (#7190) via dependabot[bot] (@dependabot[bot])
+* fix(ci): stop mirroring main to purchases-ios-spm, tags only (#7189) via Álvaro Brey (@AlvaroBrey)
+* feat(remote-config): add static fallback config endpoint (#7182) via Rick (@rickvdl)
+* Chore(deps): Bump cocoapods from 1.16.2 to 1.17.0 (#7187) via dependabot[bot] (@dependabot[bot])
+* Don't switch hosts on device-connectivity errors (#7176) via Antonio Pallares (@ajpallares)
+* other(offerings): gate getOfferings delivery on ui_config and stale-cache paths (#7181) via Facundo Menzella (@facumenzella)
+* fix(remote-config): align edge-case handling with Android implementation (#7173) via Rick (@rickvdl)
+* fix(paywalls): fail decoding a present-but-malformed custom_variables (#7184) via Antonio Pallares (@ajpallares)
+* Chore(deps): Bump fastlane from 2.236.1 to 2.237.0 (#7175) via dependabot[bot] (@dependabot[bot])
+* fix(remote-config): bind refresh requests to identity clears (#7150) via Rick (@rickvdl)
+* New IAMEnabled configuration option (#7146) via Dave DeLong (@davedelong)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b28b65f6ee..791d1f15c9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,39 @@
+## 5.81.0
+## RevenueCatUI SDK
+### 🐞 Bugfixes
+* Fix Paywalls V2 carousel image stuck in size-unknown state on first display (#7180) via Jacob Rakidzich (@JZDesign)
+### Paywallv2
+#### ✨ New Features
+* feat(paywalls): support transparent sticky footers (#7188) via Álvaro Brey (@AlvaroBrey)
+
+### 🔄 Other Changes
+* feat(remote-config): force app_start on the first config request (#7219) via Antonio Pallares (@ajpallares)
+* test(workflows): add Maestro flow for classic-paywall fallback on config failure (#7235) via Facundo Menzella (@facumenzella)
+* test(workflows): add Maestro flow for workflow paywall back navigation (#7224) via Facundo Menzella (@facumenzella)
+* test(remote-config): don't send app_start in no-content config tests (#7222) via Antonio Pallares (@ajpallares)
+* test(workflows): add Maestro flow that navigates a workflow paywall to purchase (#7221) via Facundo Menzella (@facumenzella)
+* ci(remote-config): run the blob health monitor (#7218) via Facundo Menzella (@facumenzella)
+* test(remote-config): add a real-backend health check for CDN blob downloads (#7215) via Facundo Menzella (@facumenzella)
+* feat(remote-config): send fetch_context on config endpoint requests (#7214) via Antonio Pallares (@ajpallares)
+* Internal `DangerousSettings.useWorkflows` to enable remote config/workflows programmatically (#7209) via Cesar de la Vega (@vegaro)
+* test(remote-config): cover downloading several config blobs at once (#7212) via Facundo Menzella (@facumenzella)
+* test(remote-config): cover getOfferings delivering when a prefetch blob fails (#7211) via Facundo Menzella (@facumenzella)
+* Use short timeouts for remote config blob downloads (#7210) via Rick (@rickvdl)
+* perf(remote-config): give /config its own request lane so it overlaps /offerings (#7196) via Facundo Menzella (@facumenzella)
+* Pass Tuist Swift conditions to local package (#7195) via Rick (@rickvdl)
+* other(remote-config): stabilize flaky RemoteConfig blob integration test (#7193) via Antonio Pallares (@ajpallares)
+* Chore(deps): Bump excon from 0.112.0 to 1.5.0 in /Tests/InstallationTests/CocoapodsInstallation (#7190) via dependabot[bot] (@dependabot[bot])
+* fix(ci): stop mirroring main to purchases-ios-spm, tags only (#7189) via Álvaro Brey (@AlvaroBrey)
+* feat(remote-config): add static fallback config endpoint (#7182) via Rick (@rickvdl)
+* Chore(deps): Bump cocoapods from 1.16.2 to 1.17.0 (#7187) via dependabot[bot] (@dependabot[bot])
+* Don't switch hosts on device-connectivity errors (#7176) via Antonio Pallares (@ajpallares)
+* other(offerings): gate getOfferings delivery on ui_config and stale-cache paths (#7181) via Facundo Menzella (@facumenzella)
+* fix(remote-config): align edge-case handling with Android implementation (#7173) via Rick (@rickvdl)
+* fix(paywalls): fail decoding a present-but-malformed custom_variables (#7184) via Antonio Pallares (@ajpallares)
+* Chore(deps): Bump fastlane from 2.236.1 to 2.237.0 (#7175) via dependabot[bot] (@dependabot[bot])
+* fix(remote-config): bind refresh requests to identity clears (#7150) via Rick (@rickvdl)
+* New IAMEnabled configuration option (#7146) via Dave DeLong (@davedelong)
+
## 5.80.3
## RevenueCat SDK
### 🐞 Bugfixes
diff --git a/Examples/SampleCat/SampleCat.xcodeproj/project.pbxproj b/Examples/SampleCat/SampleCat.xcodeproj/project.pbxproj
index 2ee70025ed..e51aabac86 100644
--- a/Examples/SampleCat/SampleCat.xcodeproj/project.pbxproj
+++ b/Examples/SampleCat/SampleCat.xcodeproj/project.pbxproj
@@ -531,7 +531,7 @@
repositoryURL = "https://github.com/RevenueCat/purchases-ios";
requirement = {
kind = upToNextMajorVersion;
- minimumVersion = 5.80.3;
+ minimumVersion = 5.81.0;
};
};
/* End XCRemoteSwiftPackageReference section */
diff --git a/RevenueCat.podspec b/RevenueCat.podspec
index fcceab6690..910ae70c9d 100644
--- a/RevenueCat.podspec
+++ b/RevenueCat.podspec
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "RevenueCat"
- s.version = "5.81.0-SNAPSHOT"
+ s.version = "5.81.0"
s.summary = "Subscription and in-app-purchase backend service."
s.description = <<-DESC
diff --git a/RevenueCatUI.podspec b/RevenueCatUI.podspec
index e6e07c1a42..6fe9ca9209 100644
--- a/RevenueCatUI.podspec
+++ b/RevenueCatUI.podspec
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "RevenueCatUI"
- s.version = "5.81.0-SNAPSHOT"
+ s.version = "5.81.0"
s.summary = "UI library for RevenueCat paywalls."
s.description = <<-DESC
diff --git a/Sources/Misc/SystemInfo.swift b/Sources/Misc/SystemInfo.swift
index d52b24b514..bcc667e34a 100644
--- a/Sources/Misc/SystemInfo.swift
+++ b/Sources/Misc/SystemInfo.swift
@@ -127,7 +127,7 @@ class SystemInfo {
}
static var frameworkVersion: String {
- return "5.81.0-SNAPSHOT"
+ return "5.81.0"
}
static var installationMethod: String {
diff --git a/Tests/InstallationTests/CommonFiles/RevenueCat-Swift.h b/Tests/InstallationTests/CommonFiles/RevenueCat-Swift.h
index fc9e463d1f..cf935363e8 100644
--- a/Tests/InstallationTests/CommonFiles/RevenueCat-Swift.h
+++ b/Tests/InstallationTests/CommonFiles/RevenueCat-Swift.h
@@ -1123,6 +1123,9 @@ SWIFT_CLASS_NAMED("Builder")
/// With this option disabled you can still collect device identifiers
/// by calling Purchases/collectDeviceIdentifiers()
- (RCConfigurationBuilder * _Nonnull)withAutomaticDeviceIdentifierCollectionEnabled:(BOOL)automaticDeviceIdentifierCollectionEnabled SWIFT_WARN_UNUSED_RESULT;
+/// Set iamEnabled. This is disabled by default.
+/// Enabling tells the SDK to prefer using token-based user sessions for communicating with the server.
+- (RCConfigurationBuilder * _Nonnull)withIAMEnabled:(BOOL)iamEnabled SWIFT_WARN_UNUSED_RESULT;
/// Generate a Configuration object given the values configured by this builder.
- (RCConfiguration * _Nonnull)build SWIFT_WARN_UNUSED_RESULT;
/// Overrides the preferred locale for RevenueCatUI components.
@@ -1135,11 +1138,11 @@ SWIFT_CLASS_NAMED("Builder")
@end
@interface RCConfigurationBuilder (SWIFT_EXTENSION(RevenueCat))
-- (RCConfigurationBuilder * _Nonnull)withObserverMode:(BOOL)observerMode SWIFT_WARN_UNUSED_RESULT SWIFT_AVAILABILITY(macos,obsoleted=1,message="'with' has been renamed to 'withPurchasesAreCompletedBy:storeKitVersion:': Observer Mode is now named PurchasesAreCompletedBy.") SWIFT_AVAILABILITY(watchos,obsoleted=1,message="'with' has been renamed to 'withPurchasesAreCompletedBy:storeKitVersion:': Observer Mode is now named PurchasesAreCompletedBy.") SWIFT_AVAILABILITY(tvos,obsoleted=1,message="'with' has been renamed to 'withPurchasesAreCompletedBy:storeKitVersion:': Observer Mode is now named PurchasesAreCompletedBy.") SWIFT_AVAILABILITY(ios,obsoleted=1,message="'with' has been renamed to 'withPurchasesAreCompletedBy:storeKitVersion:': Observer Mode is now named PurchasesAreCompletedBy.");
+- (RCConfigurationBuilder * _Nonnull)withUsesStoreKit2IfAvailable:(BOOL)usesStoreKit2IfAvailable SWIFT_WARN_UNUSED_RESULT SWIFT_DEPRECATED_MSG("Use .with(storeKitVersion:) to enable StoreKit 2");
@end
@interface RCConfigurationBuilder (SWIFT_EXTENSION(RevenueCat))
-- (RCConfigurationBuilder * _Nonnull)withUsesStoreKit2IfAvailable:(BOOL)usesStoreKit2IfAvailable SWIFT_WARN_UNUSED_RESULT SWIFT_DEPRECATED_MSG("Use .with(storeKitVersion:) to enable StoreKit 2");
+- (RCConfigurationBuilder * _Nonnull)withObserverMode:(BOOL)observerMode SWIFT_WARN_UNUSED_RESULT SWIFT_AVAILABILITY(macos,obsoleted=1,message="'with' has been renamed to 'withPurchasesAreCompletedBy:storeKitVersion:': Observer Mode is now named PurchasesAreCompletedBy.") SWIFT_AVAILABILITY(watchos,obsoleted=1,message="'with' has been renamed to 'withPurchasesAreCompletedBy:storeKitVersion:': Observer Mode is now named PurchasesAreCompletedBy.") SWIFT_AVAILABILITY(tvos,obsoleted=1,message="'with' has been renamed to 'withPurchasesAreCompletedBy:storeKitVersion:': Observer Mode is now named PurchasesAreCompletedBy.") SWIFT_AVAILABILITY(ios,obsoleted=1,message="'with' has been renamed to 'withPurchasesAreCompletedBy:storeKitVersion:': Observer Mode is now named PurchasesAreCompletedBy.");
@end
/// Specifies the behavior for a caching API.
@@ -1701,6 +1704,10 @@ SWIFT_CLASS("_TtC10RevenueCat37GetProductEntitlementMappingOperation")
@interface GetProductEntitlementMappingOperation : CacheableNetworkOperation
@end
+SWIFT_CLASS("_TtC10RevenueCat32GetRemoteConfigFallbackOperation")
+@interface GetRemoteConfigFallbackOperation : CacheableNetworkOperation
+@end
+
SWIFT_CLASS("_TtC10RevenueCat24GetRemoteConfigOperation")
@interface GetRemoteConfigOperation : CacheableNetworkOperation
@end
diff --git a/scripts/docs/index.html b/scripts/docs/index.html
index abfa9dba08..562cb113c9 100644
--- a/scripts/docs/index.html
+++ b/scripts/docs/index.html
@@ -2,7 +2,7 @@