In-app purchases and subscriptions made easy. Support for iOS, watchOS, tvOS, macOS, and visionOS.
MIT License
Bot releases are hidden (Show)
Published by NachoSoto 9 months ago
PaywallViewController
: new initializer with Offering
identifier (#3587) via NachoSoto (@NachoSoto)Paywalls
: improve template 5 layout for long product names (#3589) via NachoSoto (@NachoSoto)Paywalls
: extracted PaywallViewConfiguration
(#3586) via NachoSoto (@NachoSoto)CircleCI
: avoid installing Xcodes
when not needed (#3585) via NachoSoto (@NachoSoto)CircleCI
: change all jobs to M1 (#3140) via NachoSoto (@NachoSoto)Published by aboedo almost 2 years ago
RCProductInfo
: added SKStoreFront.countryCode
to post store_country
with receiptsPublished by revenuecat-ops almost 2 years ago
fastlane
(#1998) via NachoSoto (@NachoSoto)Xcode 13.2.1
/ Swift 5.5
(#1990) via NachoSoto (@NachoSoto)TrialOrIntroPriceEligibilityCheckerType
(#1983) via NachoSoto (@NachoSoto)swiftlint
installation (#1993) via NachoSoto (@NachoSoto)Nimble
: use a fixed version (#1991) via NachoSoto (@NachoSoto)Purchases.logIn
: log warning if attempting to use a static appUserID
(#1958) via NachoSoto (@NachoSoto)InternalAPI
for "health" request (#1971) via NachoSoto (@NachoSoto)Published by revenuecat-ops almost 2 years ago
TrialOrIntroPriceEligibilityChecker
: only use SK2 implementation if enabled (#1984) via NachoSoto (@NachoSoto)Published by revenuecat-ops about 2 years ago
ErrorUtils
: improved logging and localizedDescription
to include underlying errors (#1974) via NachoSoto (@NachoSoto)PaymentQueueWrapper
: also implement shouldShowPriceConsent
(#1963) via NachoSoto (@NachoSoto)ReceiptFetcher
: added retry mechanism (#1945) via NachoSoto (@NachoSoto)PaymentQueueWrapper
: also conform to SKPaymentTransactionObserver
to fix promoted purchases (#1962) via NachoSoto (@NachoSoto)OfferingsManager
: added ability to fail if any product is not found (#1976) via NachoSoto (@NachoSoto)OfferingsManager
: added missing test for ignoring missing products (#1975) via NachoSoto (@NachoSoto)PaymentQueueWrapper
: improved abstraction for active SKPaymentQueue
wrapper (#1968) via NachoSoto (@NachoSoto)ErrorUtils.purchasesError(withUntypedError:)
handle PurchasesErrorConvertible
(#1973) via NachoSoto (@NachoSoto)CallbackCache.add(callback:)
(#1970) via NachoSoto (@NachoSoto)SKPaymentQueue.presentCodeRedemptionSheet
to StoreKitWorkarounds
(#1967) via NachoSoto (@NachoSoto)Async.call
method to convert completion-block call to async
(#1969) via NachoSoto (@NachoSoto)PostReceiptDataOperation
: added initiationSource
parameter (#1957) via NachoSoto (@NachoSoto)StoreKit1Wrapper
: separated SKPaymentTransactionObserver
and SKPaymentQueueDelegate
implementations (#1961) via NachoSoto (@NachoSoto)Error.isCancelledError
into Error+Extensions
(#1960) via NachoSoto (@NachoSoto)Integration Tests
: simplified testIneligibleForIntroAfterPurchaseExpires
to fix flakiness (#1952) via NachoSoto (@NachoSoto)Published by revenuecat-ops about 2 years ago
⚠️ ⚠️ This version does not support promoted purchases initiated directly from the App Store when StoreKit 2 is enabled. we’re working on a hotfix to address this). In the meantime, you can stick with 4.11.0 if you’re using promoted purchases.
ProductsFetcherSK2
: removed now redundant caching logic (#1908) via NachoSoto (@NachoSoto)CachingProductsManager
to provide consistent caching logic when fetching products (#1907) via NachoSoto (@NachoSoto)ReceiptFetcher.receiptData
(#1941) via NachoSoto (@NachoSoto)async
to completion-block APIs (#1943) via NachoSoto (@NachoSoto)InAppPurchase
into AppleReceipt
(#1942) via NachoSoto (@NachoSoto)Purchases+async
: combined @available
statements into a single one (#1944) via NachoSoto (@NachoSoto)Integration Tests
: don't initialize Purchases
until the SKTestSession
has been re-created (#1946) via NachoSoto (@NachoSoto)PostReceiptDataOperation
: print receipt data if debug
logs are enabled (#1940) via NachoSoto (@NachoSoto)Published by revenuecat-ops about 2 years ago
⚠️ ⚠️ This version does not support promoted purchases initiated directly from the App Store when StoreKit 2 is enabled. we’re working on a hotfix to address this). In the meantime, you can stick with 4.11.0 if you’re using promoted purchases.
StoreKit 2
is now enabled by default 🚨 (#1922) via NachoSoto (@NachoSoto)PurchasesType
and PurchasesSwiftType
(#1912) via NachoSoto (@NachoSoto)StoreKit 1
: changed result of cancelled purchases to be consistent with StoreKit 2
(#1910) via NachoSoto (@NachoSoto)PaymentQueueWrapper
: handle promotional purchase requests from App Store when SK1 is disabled (#1901) via NachoSoto (@NachoSoto)CacheableNetworkOperation
: fixed race condition in new test (#1932) via NachoSoto (@NachoSoto)BasePurchasesTests
: changed default back to SK1 (#1935) via NachoSoto (@NachoSoto)Logger
: refactored default LogLevel
definition (#1934) via NachoSoto (@NachoSoto)AppleReceipt
: refactored declarations into nested types (#1933) via NachoSoto (@NachoSoto)Integration Tests
: relaunch tests when retrying failures (#1925) via NachoSoto (@NachoSoto)CircleCI
: downgraded release jobs to Xcode 13.x (#1927) via NachoSoto (@NachoSoto)ErrorUtils
: added test to verify that PublicError
s can be catch
'd as ErrorCode
(#1924) via NachoSoto (@NachoSoto)StoreKitIntegrationTests
: print AppleReceipt
data whenever verifyEntitlementWentThrough
fails (#1929) via NachoSoto (@NachoSoto)OperationQueue
: log debug message when requests are found in cache and skipped (#1926) via NachoSoto (@NachoSoto)GetCustomerInfoAPI
: avoid making a request if there's any PostReceiptDataOperation
in progress (#1911) via NachoSoto (@NachoSoto)PurchaseTester
: allow HTTP requests and enable setting ProxyURL
(#1917) via NachoSoto (@NachoSoto)Published by revenuecat-ops about 2 years ago
⚠️ ⚠️ This version does not support promoted purchases initiated directly from the App Store when StoreKit 2 is enabled. we’re working on a hotfix to address this). In the meantime, you can stick with 4.11.0 if you’re using promoted purchases.
Purchases.beginRefundRequest
: ensured errors are PublicError
(#1913) via NachoSoto (@NachoSoto)PurchaseTesterSwiftUI
: fixed macOS target (#1915) via NachoSoto (@NachoSoto)tvOS
tests (#1928) via NachoSoto (@NachoSoto)SnapshotTesting
: require version 1.9.0 to keep supporting iOS 12/13 tests (#1931) via NachoSoto (@NachoSoto)pre-commit
hook: also verify leftover API keys in PurchaseTester
(#1914) via NachoSoto (@NachoSoto)CircleCI
: changed iOS 12/13 to use Xcode 13 (#1918) via NachoSoto (@NachoSoto)PurchaseTesterSwiftUI
: removed unnecessary UIApplicationDelegate
(#1916) via NachoSoto (@NachoSoto)CircleCI
: changed all jobs to use Xcode 14 (#1909) via NachoSoto (@NachoSoto)Atomic
: added unit test to verify value
's setter (#1905) via NachoSoto (@NachoSoto)spm build
CI job: changed to release build (#1903) via NachoSoto (@NachoSoto)StoreKitUnitTests
: compile on iOS 11.0+ (#1904) via NachoSoto (@NachoSoto)Purchases
: only expose testing data on DEBUG
(#1902) via NachoSoto (@NachoSoto)Integration Tests
: added test to verify re-subscription behavior (#1898) via NachoSoto (@NachoSoto)IntegrationTests
: simplified testExpireSubscription
to fix flaky test (#1899) via NachoSoto (@NachoSoto)Integration Tests
: actually verify that entitlement is active (#1880) via NachoSoto (@NachoSoto)Published by revenuecat-ops about 2 years ago
⚠️ ⚠️ This version does not support promoted purchases initiated directly from the App Store when StoreKit 2 is enabled. we’re working on a hotfix to address this). In the meantime, you can stick with 4.11.0 if you’re using promoted purchases.
watchOS
: fixed crash when ran on single-target apps with Xcode 14 and before watchOS 9.0
(#1895) via NachoSoto (@NachoSoto)CustomerInfoManager
/OfferingsManager
: improved display of underlying errors (#1888) via NachoSoto (@NachoSoto)Offering
: improved confusing log for PackageType.custom
(#1884) via NachoSoto (@NachoSoto)PurchasesOrchestrator
: don't log warning if allowSharingAppStoreAccount
setting was never explicitly set (#1885) via NachoSoto (@NachoSoto)PurchasesError
and fixed some incorrect returned error types (#1879) via NachoSoto (@NachoSoto)CustomerInfoManager
: fixed thread-unsafe implementation (#1878) via NachoSoto (@NachoSoto)StoreKitWrapper
if SK2 is enabled and available (#1882) via NachoSoto (@NachoSoto)Sendable
support (#1795) via NachoSoto (@NachoSoto)StoreKitWrapper
to StoreKit1Wrapper
(#1886) via NachoSoto (@NachoSoto)DEAD_CODE_STRIPPING
(#1887) via NachoSoto (@NachoSoto)HTTPClient
: added X-Client-Bundle-ID
and logged on SDK initialization (#1883) via NachoSoto (@NachoSoto)StoreKit2Setting.shouldOnlyUseStoreKit2
(#1881) via NachoSoto (@NachoSoto)TestLogHandler
to simplify how we test logged messages (#1858) via NachoSoto (@NachoSoto)Integration Tests
: added test for purchasing StoreProduct
instead of Package
(#1875) via NachoSoto (@NachoSoto)ErrorUtils
: added test to verify that returned errors can be converted to ErrorCode
(#1871) via NachoSoto (@NachoSoto)Published by revenuecat-ops about 2 years ago
async
SK1 cancelled purchase (#1869) via NachoSoto (@NachoSoto)beginRefundRequest
overload with completion block (#1861) via NachoSoto (@NachoSoto)Published by revenuecat-ops about 2 years ago
TrialOrIntroPriceEligibilityChecker
: return .noIntroOfferExists
if the product has no introductory offer (#1859) via NachoSoto (@NachoSoto)watchOS
: fixed crash on single-target apps (#1849) via NachoSoto (@NachoSoto)CircleCI
: added job for building SDK with SPM
(#1860) via NachoSoto (@NachoSoto)Lock
: changed default implementation to use NSLock
(#1819) via NachoSoto (@NachoSoto)Offering
/StoreProductType
: Sendable
conformance (#1826) via NachoSoto (@NachoSoto)ReceiptParser: Sendable
conformance (#1825) via NachoSoto (@NachoSoto)CustomerInfo: Sendable
conformance (#1824) via NachoSoto (@NachoSoto)Collection.onlyElement
(#1857) via NachoSoto (@NachoSoto)IntegrationTests
: actually fail test if tests aren't configured (#1855) via NachoSoto (@NachoSoto)Configuration.with(usesStoreKit2IfAvailable:)
: removed "experimental" warning (#1845) via NachoSoto (@NachoSoto)Fastfile
: test_tvos
lane had duplicate parameter (#1846) via NachoSoto (@NachoSoto)Published by revenuecat-ops about 2 years ago
ErrorResponse
: don't add attribute errors to message if empty (#1844) via NachoSoto (@NachoSoto)PurchasesOrchestrator
: don't log "purchased product" if it was cancelled (#1840) via NachoSoto (@NachoSoto)Backend
: fixed potential race conditions introduced by OperationDispatcher.dispatchOnWorkerThread(withRandomDelay:)
(#1827) via NachoSoto (@NachoSoto)DeviceCache
: Sendable
conformance and fixed thread-safety (#1823) via NachoSoto (@NachoSoto)SystemInfo.finishTransactions
: made thread-safe (#1807) via NachoSoto (@NachoSoto)Purchases.shared
and Purchases.isConfigured
are now thread-safe (#1813) via NachoSoto (@NachoSoto)PriceFormatterProvider: Sendable
conformance and fixed thread-safety (#1818) via NachoSoto (@NachoSoto)StoreKitConfigTestCase.changeStorefront
: re-enabled on iOS 16 (#1811) via NachoSoto (@NachoSoto)DeviceCache
: no longer set cache timestamp before beginning request (#1839) via NachoSoto (@NachoSoto)MagicWeatherSwiftUI
: updated to use async
APIs (#1843) via NachoSoto (@NachoSoto)PurchasesDelegate
: added test for latest cached customer info always being sent (#1830) via NachoSoto (@NachoSoto)CallbackCache: Sendable
conformance (#1835) via NachoSoto (@NachoSoto)CallbackCache
: simplified implementation using Atomic
(#1834) via NachoSoto (@NachoSoto)PurchasesLogInTests
: added test to verify logIn
updates offerings cache (#1833) via NachoSoto (@NachoSoto)PurchasesLoginTests
(#1832) via NachoSoto (@NachoSoto)SwiftLint
: cleaned up output (#1821) via NachoSoto (@NachoSoto)Atomic: ExpressibleByBooleanLiteral
(#1822) via NachoSoto (@NachoSoto)SwiftLint
: fixed build warning (#1820) via NachoSoto (@NachoSoto)Atomic: ExpressibleByNilLiteral
(#1804) via NachoSoto (@NachoSoto)PurchasesAttributionDataTests
: fixed potential race condition in flaky test (#1805) via NachoSoto (@NachoSoto)try
(#1816) via NachoSoto (@NachoSoto)AttributionFetcherError
inside AttributionFetcher
(#1808) via NachoSoto (@NachoSoto)Dangerfile
: added "next_release" as supported label (#1810) via NachoSoto (@NachoSoto)BackendIntegrationTests.xctestplan
to TestPlans
folder (#1812) via NachoSoto (@NachoSoto)SK2StoreProduct
: conditionally removed @available
workaround (#1794) via NachoSoto (@NachoSoto)SwiftLint
: fixed deprecation warning (#1809) via NachoSoto (@NachoSoto)Published by revenuecat-ops about 2 years ago
Published by revenuecat-ops about 2 years ago
OfferingsManager
: expose underlying error when ProductsManager
returns an error (#1792) via NachoSoto (@NachoSoto)Published by joshdholtz about 2 years ago
⚠️ ⚠️ ⚠️
Please do not use this version unless you have been in communication with the RevenueCat team about joining the AdServices beta. This functionality will not work otherwise, as it requires special RevenueCat setup.
⚠️ ⚠️ ⚠️
New method:
Purchases.shared.attribution.enableAdServicesAttributionTokenCollection()
to be called after configuration and after successful permission request (if advanced data is desired).
Please refer to the docs for detailed information on setup.
Published by revenuecat-ops about 2 years ago
CustomerInfoResponseHandler
: return CustomerInfo
instead of error if the response was successful (#1778) via NachoSoto (@NachoSoto)logErrorIfNeeded
no longer prints message if it's the same as the error description (#1776) via NachoSoto (@NachoSoto)Logger
: wrap message
in @autoclosure
to avoid creating when LogLevel
is disabled (#1781) via NachoSoto (@NachoSoto)SubscriberAttributesManager
(#1774) via NachoSoto (@NachoSoto)Published by revenuecat-ops over 2 years ago
Published by revenuecat-ops over 2 years ago
EntitlementInfo
: added isActiveInCurrentEnvironment
and isActiveInAnyEnvironment
(#1755) via NachoSoto (@NachoSoto)autoSyncPurchases
is disabled (#1749) via aboedo (@aboedo)bug_report.md
: clarify SK2 support (#1752) via NachoSoto (@NachoSoto)logErrorIfNeeded
: also log message if present (#1754) via NachoSoto (@NachoSoto)Published by joshdholtz over 2 years ago
⚠️ ⚠️ ⚠️
Please do not use this version unless you have been in communication with the RevenueCat team about joining the AdServices beta. This functionality will not work otherwise, as it requires special RevenueCat setup.
⚠️ ⚠️ ⚠️
New method:
Purchases.shared.attribution.enableAdServicesAttributionTokenCollection()
to be called after configuration and after successful permission request (if advanced data is desired).
Please refer to the docs for detailed information on setup.
Published by revenuecat-ops over 2 years ago
This release is compatible with Xcode 14 beta 2
CustomerInfo.nonSubscriptionTransactions
with a new non-StoreTransaction
type (#1733) via NachoSoto (@NachoSoto)Purchases.configure
: added overload taking a Configuration.Builder
(#1720) via NachoSoto (@NachoSoto)All attribution APIs can now be accessed from Purchases.shared.attribution
.
PurchasesOrchestrator
: don't log attribute errors if there are none (#1742) via NachoSoto (@NachoSoto)FatalErrorUtil
: don't override fatalError
on release builds (#1736) via NachoSoto (@NachoSoto)SKPaymentTransaction
: added more context to warnings about missing properties (#1731) via NachoSoto (@NachoSoto)showManageSubscriptions
(#1729) via aboedo (@aboedo)PurchasesOrchestrator
: unify finish transactions between SK1 and SK2 (#1704) via NachoSoto (@NachoSoto)SubscriberAttribute
: converted into struct
(#1648) via NachoSoto (@NachoSoto)CacheFetchPolicy.notStaleCachedOrFetched
: added warning to docstring (#1708) via NachoSoto (@NachoSoto)ROT13
: optimized initialization and removed magic numbers (#1702) via NachoSoto (@NachoSoto)logIn
/logOut
: sync attributes before aliasing (#1716) via NachoSoto (@NachoSoto)Purchases.customerInfo(fetchPolicy:)
: actually use fetchPolicy
parameter (#1721) via NachoSoto (@NachoSoto)PurchasesOrchestrator
: fix behavior dealing with nil
SKPaymentTransaction.productIdentifier
during purchase (#1680) via NachoSoto (@NachoSoto)PurchasesOrchestrator.handlePurchasedTransaction
: always refresh receipt data (#1703) via NachoSoto (@NachoSoto)