iOS 4.13.0

New Features 🚨 StoreKit 2 is now enabled by default 🚨 (#1922) via NachoSoto (@NachoSoto) Extracted PurchasesType and PurchasesSwiftType (#1912) via NachoSoto (@NachoSoto) Bugfixes 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) Other Changes Fixed iOS 12 tests (#1936) 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 PublicErrors 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) To view new release, visit https://github.com/RevenueCat/purchases-ios/releases/tag/4.13.0

iOS 4.12.0

Bugfixes 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) Introduced type-safe PurchasesError and fixed some incorrect returned error types (#1879) via NachoSoto (@NachoSoto) CustomerInfoManager: fixed thread-unsafe implementation (#1878) via NachoSoto (@NachoSoto) New Features Disable SK1's StoreKitWrapper if SK2 is enabled and available (#1882) via NachoSoto (@NachoSoto) Sendable support (#1795) via NachoSoto (@NachoSoto) Other Changes Renamed StoreKitWrapper to StoreKit1Wrapper (#1886) via NachoSoto (@NachoSoto) Enabled DEAD_CODE_STRIPPING (#1887) via NachoSoto (@NachoSoto) HTTPClient: added X-Client-Bundle-ID and logged on SDK initialization (#1883) via NachoSoto (@NachoSoto) add link to SDK reference (#1872) via Andy Boedo (@aboedo) Added StoreKit2Setting.shouldOnlyUseStoreKit2 (#1881) via NachoSoto (@NachoSoto) Introduced 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) To view new release, visit https://github.com/RevenueCat/purchases-ios/releases/tag/4.12.0

iOS 4.10.3

Bugfixes 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) Other Changes Update fastlane-plugin-revenuecat_internal and fix release-train job (#1866) via Cesar de la Vega (@vegaro) fix typo in comment (#1863) via Andy Boedo (@aboedo) Use Dangerfile repository (#1864) via Cesar de la Vega (@vegaro) 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) Added Collection.onlyElement (#1857) via NachoSoto (@NachoSoto) README updates (#1856) via rglanz-rc (@rglanz-rc) IntegrationTests: actually fail test if tests aren't configured (#1855) via NachoSoto (@NachoSoto) Configuration.with(usesStoreKit2IfAvailable:): removed "experimental" warning (#1845) via NachoSoto (@NachoSoto) Build fix- Update package requirements for MagicWeather (#1852) via Joshua Liebowitz (@taquitos) Fastfile: test_tvos lane had duplicate parameter (#1846) via NachoSoto (@NachoSoto) To view new release, visit https://github.com/RevenueCat/purchases-ios/releases/tag/4.10.3

React Native 5.0.0

Amazon store support We have introduced support for using the Amazon Store. You can enable Amazon Store support by configuring the SDK using the new configure function: Purchases.configure({ apiKey: "AMAZON_API_KEY", useAmazon: true }); For more information around configuration please take a look at the Amazon Store section in our docs. The official Amazon In-App Purchasing docs also contain very valuable information, specially around testing and best practices. Apple AdServices support New method for automatic collecting of attribution tokens on iOS and macOS using AdServices - Purchases.enableAdServicesAttributionTokenCollection() StoreKit 2 support This version of the SDK automatically uses StoreKit 2 APIs under the hood only for APIs that the RevenueCat team has determined work better than StoreKit 1. New types and cleaned up naming New types that wrap native types from Apple, Google and Amazon, and we cleaned up the naming of other types and methods for a more consistent experience. Removed APIs setUp has been removed in favor of configure configure now expects an Object for the different parameters. Example: Purchases.configure({ apiKey: "key", appUserID: "user ID", observerMode: false, userDefaultsSuiteName: "suite name", usesStoreKit2IfAvailable: true, useAmazon: true }); identify and createAlias have been removed in favor of logIn. reset has been removed in favor of logOut. addAttributionData has been removed in favor of set<NetworkID> methods. PurchasesStoreProduct: removed intro_price_string, intro_price_period, intro_price_cycles, intro_price_period_unit, intro_price_period_number_of_units in favor of new introPrice: PurchasesIntroPrice. PurchasesStoreTransaction: removed revenueCatId and productId in favor of transactionIdentifier and productIdentifier respectively. Renamed APIs 4.x 5.0.0 PurchaserInfo CustomerInfo PurchasesProduct PurchasesStoreProduct PurchasesStoreProductProduct.price_string PurchasesStoreProductProduct.priceString PurchasesStoreProductProduct.currency_code PurchasesStoreProductProduct.currencyCode PurchasesTransaction PurchasesStoreTransaction PurchasesTransaction.revenueCatId PurchasesStoreTransaction.transactionIdentifier PurchasesTransaction.productId PurchasesStoreTransaction.productIdentifier PurchasesDiscount PurchasesStoreProductDiscount PurchasesPaymentDiscount PurchasesPromotionalOffer Purchases.restoreTransactions Purchases.restorePurchases Purchases.getPaymentDiscount Purchases.getPromotionalOffer Purchases.invalidatePurchaserInfoCache Purchases.invalidateCustomerInfoCache Purchases.addPurchaserInfoUpdateListener Purchases.addCustomerInfoUpdateListener Purchases.removePurchaserInfoUpdateListener Purchases.removeCustomerInfoUpdateListener To view new release, visit https://github.com/RevenueCat/react-native-purchases/releases/tag/5.0.0

iOS 4.10.2

Bugfixes ErrorResponse: don't add attribute errors to message if empty (#1844) via NachoSoto (@NachoSoto) Purchase cancellations: unify behavior between SK1 and SK2 (#1841) via NachoSoto (@NachoSoto) StoreKit 2: 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) Directly send delegate customer info when delegate is set (always sends cached CustomerInfo value) (#1828) via Josh Holtz (@joshdholtz) 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) Other Changes DeviceCache: no longer set cache timestamp before beginning request (#1839) via NachoSoto (@NachoSoto) MagicWeatherSwiftUI: updated to use async APIs (#1843) via NachoSoto (@NachoSoto) Release train (#1842) via Cesar de la Vega (@vegaro) Adds hotfixes section to RELEASING doc (#1837) via Cesar de la Vega (@vegaro) Update fastlane plugin (#1838) via Toni Rico (@tonidero) Update migration doc from didReceiveUpdatedCustomerInfo to receivedUpdatedCustomerInfo (#1836) via Josh Holtz (@joshdholtz) 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) Created PurchasesLoginTests (#1832) via NachoSoto (@NachoSoto) SwiftLint: cleaned up output (#1821) via NachoSoto (@NachoSoto) Link to sdk reference (#1831) via aboedo (@aboedo) Atomic: ExpressibleByBooleanLiteral (#1822) via NachoSoto (@NachoSoto) SwiftLint: fixed build warning (#1820) via NachoSoto (@NachoSoto) Adds an approval job that will tag the release (#1815) via Cesar de la Vega (@vegaro) Atomic: ExpressibleByNilLiteral (#1804) via NachoSoto (@NachoSoto) PurchasesAttributionDataTests: fixed potential race condition in flaky test (#1805) via NachoSoto (@NachoSoto) Fixed warnings for unnecessary try (#1816) via NachoSoto (@NachoSoto) Moved AttributionFetcherError inside AttributionFetcher (#1808) via NachoSoto (@NachoSoto) Update documentation for presentCodeRedemptionSheet (#1817) via Joshua Liebowitz (@taquitos) Dangerfile: added "next_release" as supported label (#1810) via NachoSoto (@NachoSoto) PurchaseTester- Update Podfile.lock (#1814) via Joshua Liebowitz (@taquitos) Update to latest fastlane plugin (#1802) via Toni Rico (@tonidero) Clean up: moved 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) Update gems (#1791) via Joshua Liebowitz (@taquitos) Replace usages of replace_in with replace_text_in_files action (#1803) via Toni Rico (@tonidero) To view new release, visit https://github.com/RevenueCat/purchases-ios/releases/tag/4.10.2