In-app purchases and subscriptions made easy. Support for iOS, iPadOS, watchOS, and Mac.

Overview

😻 In-App Subscriptions Made Easy 😻

License Version Version Carthage compatible SwiftPM compatible

Purchases.framework (currently supported)

We're in the process of migrating the entire framework over to Swift 🎉 . The new framework is called RevenueCat.framework. While this migration is happening, you can (and should) still use the currently supported production version you know and love. If you'd like to help us by testing our beta, please feel free!

IMPORTANT: SPM integration note for users of our stable release:

Swift Package Manager (SPM) integration is currently not working as expected. If you wish to use the currently supported and stable Purchases framework (version 3.12.4), you'll need to specify < 4.0.0 or for your dependencies in Xcode. By default, Xcode will specify exactly 4.0.0 and that won't work because we haven't released that version yet, only 4.0.0-beta.x.

RevenueCat.framework Beta

Purchases and RevenueCat are clients for the RevenueCat subscription and purchase tracking system.

Purchases is the currently supported, production-ready, open source framework that provides a wrapper around StoreKit and the RevenueCat backend to make implementing in-app subscriptions in Swift or Objective-C easy - receipt validation and status tracking included!

RevenueCat is our next big release (what we've been calling Purchases V4). It is a rename of Purchases to RevenueCat, and now, 100% Swift. It contains all the same functionality (and almost exactly the same API) as Purchases. It's not a brand-new framework, but rather, a migration of the ObjC bits over to Swift with improved nullability, various bug fixes, and some new features. We're also going to be adding in StoreKit2 support before we 🚢 it, too! The framework is nearly production-ready, but we're going to keep it in beta while we continue to work on the StoreKit2 bits and iron out any remaining bugs folks find. Keep an eye out over the next few releases if you're excited to try out the StoreKit2 integration- we'll announce when we add it to the beta 😄

Features

RevenueCat
✅ Server-side receipt validation
➡️ Webhooks - enhanced server-to-server communication with events for purchases, renewals, cancellations, and more
🖥 macOS support
🎯 Subscription status tracking - know whether a user is subscribed whether they're on iOS, Android or web
📊 Analytics - automatic calculation of metrics like conversion, mrr, and churn
📝 Online documentation up to date
🔀 Integrations - over a dozen integrations to easily send purchase data where you need it
💯 Well maintained - frequent releases
📮 Great support - Help Center

Getting Started

For more detailed information, you can view our complete documentation at docs.revenuecat.com.

Or browse our iOS sample apps:

Comments
  • How to use the library in watch app?

    How to use the library in watch app?

    Hi, I have the error with version 4.0 when running it with the latest Xcode beta.

    Showing Recent Messages /Users/majid/Library/Developer/Xcode/DerivedData/SleepBot-fcdzzaaaglxzwpcmtdyrkdzbxapm/SourcePackages/checkouts/purchases-ios/Purchases/Public/RCPurchases.m:27:9: 'RCDeviceCache.h' file not found

    opened by mecid 33
  • Feature: xcframeworks

    Feature: xcframeworks

    Adds support for building xcframeworks. Automatically builds and uploads an xcframework to releases, alongside the old universal framework. \

    This should provide seamless compatibility for macOS / macCatalyst and Apple Sillicon for developers who integrate the framework directly through the binary. For folks who use other mechanisms:

    • Carthage: updating to Carthage v0.37+ should already provide seamless compatibility
    • Cocoapods: was already working correctly for all architectures
    • Swift Package Manager: was already working correctly for all architectures
    • Xcode direct integration: I believe that since there's no concept of an XCFramework target in Xcode, you'd have to create the XCFramework yourself. This can be done by running (from the project dir) bundle exec fastlane export_xcframework.
    opened by aboedo 25
  • crash: EXC_BAD_ACCESS in 4.2.1, DeviceCache.swift - Line 123

    crash: EXC_BAD_ACCESS in 4.2.1, DeviceCache.swift - Line 123

    Describe the bug Crash in DeviceCache.cache(customerInfo:appUserID:) + 123 Crashed: Backend callbackQueue EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000b2005a2e0

    see stack trace below

    1. Environment
      1. Platform: iOS
      2. SDK version: 4.2.1
      3. StoreKit 2 enabled (Y/N): not sure.
      4. OS version: 15.5.0
      5. Xcode version: 13.3.1
      6. How widespread is the issue. Percentage of devices affected. unknown as of now
    2. Debug logs that reproduce the issue no logs available for this crash
    3. Steps to reproduce, with a description of expected vs. actual behavior No steps as such - happened randomly
    4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)
    Crashed: Backend callbackQueue
    EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000b2005a2e0
    0
    libobjc.A.dylib
    objc_release + 16
    1
    Foundation
    -[NSObject(NSKeyValueObservingPrivate) _changeValueForKeys:count:maybeOldValuesDict:maybeNewValuesDict:usingBlock:] + 676
    2
    Foundation
    -[NSObject(NSKeyValueObservingPrivate) _notifyObserversOfChangeFromValuesForKeys:toValuesForKeys:] + 816
    3
    CoreFoundation
    -[CFPrefsSource forEachObserver:] + 332
    4
    CoreFoundation
    -[CFPrefsSource _notifyObserversOfChangeFromValuesForKeys:toValuesForKeys:] + 112
    5
    CoreFoundation
    ___CFPrefsDeliverPendingKVONotificationsGuts_block_invoke + 440
    6
    CoreFoundation
    __CFDictionaryApplyFunction_block_invoke + 28
    7
    CoreFoundation
    CFBasicHashApply + 148
    8
    CoreFoundation
    CFDictionaryApplyFunction + 328
    9
    CoreFoundation
    _CFPrefsDeliverPendingKVONotificationsGuts + 300
    10
    CoreFoundation
    -[_CFXPreferences _deliverPendingKVONotifications] + 96
    11
    CoreFoundation
    __108-[_CFXPreferences(SearchListAdditions) withSearchListForIdentifier:container:cloudConfigurationURL:perform:]_block_invoke + 428
    12
    CoreFoundation
    normalizeQuintuplet + 356
    13
    CoreFoundation
    -[_CFXPreferences withSearchListForIdentifier:container:cloudConfigurationURL:perform:] + 152
    14
    CoreFoundation
    -[_CFXPreferences setValue:forKey:appIdentifier:container:configurationURL:] + 128
    15
    CoreFoundation
    _CFPreferencesSetAppValueWithContainerAndConfiguration + 136
    16
    Foundation
    -[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 84
    17
    <my app>
    DeviceCache.swift - Line 123
    closure #1 in DeviceCache.cache(customerInfo:appUserID:) + 123 
    

    Additional context Add any other context about the problem here.

    purchase state is unsubscribed. was on mobile data and not on wifi. app was in foreground, and buttons were pressed, and randomly the crash happened. hasn't happened again today

    bug triaged 
    opened by quantamrhino 24
  • RCAnonymousID doesn't change after identify

    RCAnonymousID doesn't change after identify

    Our app have it’s own user uid’s and usually client obtaining it from backend after installation and login. We follow all the guides on RC identification written here: https://docs.revenuecat.com/docs/user-ids#section-tips-for-setting-app-user-ids but it’s still didn’t works how we expect. So here the problem and steps to reproduce:

    1 First we configure Purchases with nil on appUserId, so SDK creates RCAnonymousID 2 After login and obtaining our own id, we call identify method, with our id as parameter 3 In method closure(RCReceivePurchaserInfoBlock) info contains wrong originalAppUserId 4 And purchaserInfo method are also contains wrong originalAppUserId

    We expect here to see our own id. We have an Android app, built the same way, and the issue doesn’t reproduce on it.

    Also we made some research, and if we call Purchases.shared.appUserID in same closure, it will be correct one We thought that maybe there’s a problem with UserDefaults which RC uses as storage. If we call UserDefaults(suiteName: «»)?.dictionaryRepresentation() we can’t find any correct id

    What suggestions and tips do you have for our problem? Version 3.4.0

    opened by ichikmarev 24
  • PURCHASE_CANCELLED triggered during the purchase.

    PURCHASE_CANCELLED triggered during the purchase.

    Describe the bug A clear and concise description of what the bug is. The more detail you can provide the faster our team will be able to triage and resolve the issue. Do not remove any of the steps from the template below. If a step is not applicable to your issue, please leave that step empty.

    1. Environment
      1. Platform: iOS
      2. SDK version: 4.14.1
      3. StoreKit 2 (disabled with useStoreKit2IfEnabled(false)) (Y/N): Y
      4. OS version: 16.X
      5. Xcode version: 14.1.0
      6. How widespread is the issue. Percentage of devices affected: Random % in Sandbox environment
    2. Debug logs that reproduce the issue
    3. Steps to reproduce, with a description of expected vs. actual behavior A user, in sandbox, tries to renew a subscription. The user taps on the button to purchase the subscription, and in random scenes, the user without a valid subscription gets this error:
    🍎 🤖 PURCHASE_CANCELLED
    
    Problem:
    Indicates the user cancelled their purchase and was not charged.
    
    On iOS, this can also mean the Apple account already owns the product. The user can restore purchases to re-sync any transactions with their current App User Id.
    
    Resolution:
    No action required. The user decided not to proceed with their in-app purchase.
    

    Then the user tries to push the button again, the apple sheet appears, and then the user introduce the sandbox account password, and the user receives the same error again, so the user taps again on the button and wait ... a few seconds latter an alert saying "Purchases already set" appears, the user taps on okey, and the user doesn't receive any error. 4. Other information nserror-domain: RevenueCat.ErrorCode.RevenueCat.ErrorCode, 1 NSLocalizedDescription: Purchase was cancelled. readable_error_code: PURCHASE_CANCELLED source_file: RevenueCat/PurchasesOrchestrator.swift:400 source_function: purchase(sk2Product:promotionalOffer:completion:)

    Additional context Looking at the docs, we found that the error could be triggered from Apple. But I'm here for a clarification. It happens during apple review so, the possibility to be rejected is high. We haven't got any records of it occurring in production

    Also, trying to do retries to avoid push the button 2-3 times, we receive this error

    Error Domain=RevenueCat.ErrorCode Code=0 
    "Unknown error." UserInfo={
    readable_error_code=UNKNOWN,
    NSUnderlyingError= {Error Domain=RevenueCat.ErrorCode Code=16 "There was an unknown backend error. There is another request in flight trying to perform the same action."
    UserInfo={source_function=convertUnsuccessfulResponseToError(), NSUnderlyingError=0x28193c240 {Error Domain=RevenueCat.BackendErrorCode Code=-1 "There is another request in flight trying to perform the same action." 
    UserInfo={NSLocalizedDescription=There is another request in flight trying to perform the same action.}}, 
    source_file=RevenueCat/HTTPClient.swift:378, NSLocalizedDescription=There was an unknown backend error.
    There is another request in flight trying to perform the same action.,
     readable_error_code=UNKNOWN_BACKEND_ERROR, rc_response_status_code=429}}, source_function=purchase(sk2Product:promotionalOffer:completion:),
    NSLocalizedDescription=Unknown error., source_file=RevenueCat/PurchasesOrchestrator.swift:410}
    
    bug status: waiting-for-reply 
    opened by jesus-mg-ios 23
  • Purchase not working in ios 16

    Purchase not working in ios 16

    Describe the bug A clear and concise description of what the bug is. The more detail you can provide the faster our team will be able to triage and resolve the issue. Do not remove any of the steps from the template below. If a step is not applicable to your issue, please leave that step empty.

    1. Environment
      1. Platform: iOS
      2. SDK version: latest
      3. StoreKit 2 (enabled with useStoreKit2IfEnabled) (Y/N): Y
      4. OS version: iOS 16
      5. Xcode version: 14
      6. How widespread is the issue. Percentage of devices affected.
    2. Debug logs that reproduce the issue
    3. Steps to reproduce, with a description of expected vs. actual behavior
    4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

    Additional context Add any other context about the problem here.

    I'm trying to make a purchase using the method below, it prompts me to enter the password, it works fine but the completion block is never called. It seems to be a bug in iOS 16, because in iOS 15 everything works as expected.

    I'm using this code to make the purchase:

              [[RCPurchases sharedPurchases] purchasePackage:obj withCompletion:^(RCStoreTransaction *transaction, RCCustomerInfo *customerInfo, NSError *error, BOOL cancelled) {
                
                  
              }];
    
    bug 
    opened by neowinston 23
  • dylib #23 could not be loaded

    dylib #23 could not be loaded

    RCConfigurationBuilder* configuration = [RCConfiguration builderWithAPIKey:kRevenueCatAPIKey]; configuration = [configuration withAppUserID:myAppUserID]; [RCPurchases configureWithConfiguration:[configuration build]];

    I am seeing:

    dyld: lazy symbol binding failed: can't resolve symbol _$sScMMa in /...RevenueCat.framework/Versions/A/RevenueCat because dependent dylib #23 could not be loaded dyld: can't resolve symbol _$sScMMa in /.../RevenueCat.framework/Versions/A/RevenueCat because dependent dylib #23 could not be loaded (lldb)

    I am using Xcode 12.4 on Catalina, writing in Cocoa on macOS and RevenueCat 4.13

    bug 
    opened by XericDesign 23
  • Apple App store - sandboxing doc for macOS outdated?

    Apple App store - sandboxing doc for macOS outdated?

    Hi there,

    I've specifically updated my mac from Big Sur to Monetery (12.2) to be able to sandbox test with revenue cat. According to your doc(https://docs.revenuecat.com/docs/apple-app-store#add-the-sandbox-test-account-to-your-device) to sandbox user on mac you've to:

    On macOS 11.5.2 or greater, navigate to App Store > Preferences > Sandbox Account.

    Screen Shot 2022-02-04 at 1 08 13 PM

    but such option doesn't seem to appear on when you go to Preferences.

    I'd also like to know if setting:

    Purchases.logLevel = .debug

    in delegate, automatically makes me a sandbox user & won't charge me as a temporary solution.

    bug 
    opened by Daniyaldehleh 22
  • Bug: CheckTrialOrIntroDiscountEligibility too slow

    Bug: CheckTrialOrIntroDiscountEligibility too slow

    Describe the bug Add any other context about the problem here.

    We are using checkTrialOrIntroDiscountEligibility in iOS with swift  after get the product, and we notice that this call is too slow (even 45s - 1 min). 

    Purchases.shared.checkTrialOrIntroDiscountEligibility(productIdentifiers: ["productIdentifier"]) { result in
    ....
    }
    
    1. Environment
      1. Platform: iOS
      2. SDK version: 4.10
      3. StoreKit 2 (enabled with useStoreKit2IfEnabled) (Y/N): N
      4. OS version: 15.5
      5. Xcode version: 13.4.1
      6. How widespread is the issue. Percentage of devices affected: Unknown/Random Additional context

    Environment: Real device & simulator. iOS 15.5 SDK Version: "4.10.0" Code that is too slow

    Purchases.shared.checkTrialOrIntroDiscountEligibility(productIdentifiers: ["productIdentifier"]) { result in
    ....
    }
    
    bug status: waiting-for-reply 
    opened by jesus-mg-ios 21
  • Error: A server with the specified hostname could not be found

    Error: A server with the specified hostname could not be found

    Describe the bug We're receiving a random error on some devices ErrorCode Code=10 "Error performing request.", please see more in additional context. The thing is the error says that the path is satisfied. It's a little bit strange, I mean if the path is satisfied the host should be found. the source function is init(_:dnsChecker:) . Could be an error inside this function that makes it fail?

    Thanks in advance. I really appreciate your hard work.

    1. Environment
      1. Platform: iOS
      2. SDK version: 4.13.3
      3. StoreKit 2 (disabled with useStoreKit2IfEnabled(false)) (Y/N): useStoreKit2IfEnabled(false)
      4. OS version: iOS 15.X
      5. Xcode version: 13.4.1
      6. How widespread is the issue. Percentage of devices affected. -
    2. Debug logs that reproduce the issue -
    3. Steps to reproduce, with a description of expected vs. actual behavior -
    4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

    Additional context

    readable_error_code: NETWORK_ERROR
    
    Error Code: 10
    source_function: init(_:dnsChecker:)
    
    RevenueCat.ErrorCode.Error Domain=RevenueCat.ErrorCode Code=10 "Error performing request."
    UserInfo={NSLocalizedDescription=Error performing request., source_file=RevenueCat/HTTPClient.swift:363, 
    NSUnderlyingError=0x2805cea60 
    {Error Domain=NSURLErrorDomain Code=-1003 "A server with the specified hostname could not be found."
     UserInfo={_kCFStreamErrorCodeKey=8,
     NSUnderlyingError=0x2805cf840 {Error Domain=kCFErrorDomainCFNetwork Code=-1003 "
    
    NSUnderlyingError
    Error Domain=NSURLErrorDomain Code=-1003 "A server with the specified hostname could not be found."
    UserInfo={_kCFStreamErrorCodeKey=8,
     NSUnderlyingError=0x2805cf840 {Error Domain=kCFErrorDomainCFNetwork Code=-1003 "(null)" 
    UserInfo={_NSURLErrorNWPathKey=satisfied (Path is satisfied), interface: en0, ipv4, dns, proxy, _kCFStreamErrorCodeKey=8, _kCFStreamErrorDomainKey=12}},
    _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <ID>.<35>,
    _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask < ID >.<35>" ),
    NSLocalizedDescription=A server with the specified hostname could not be found., 
    NSErrorFailingURLStringKey=https://api.revenuecat.com/v1/subscribers/{SubscriberID}, 
    NSErrorFailingURLKey=https://api.revenuecat.com/v1/subscribers/{SubscriberID}, _kCFStreamErrorDomainKey=12}
    
    bug 
    opened by jesus-mg-ios 20
  • App crashes during SKProductsRequest on iOS 13

    App crashes during SKProductsRequest on iOS 13

    On iOS 13 the app crashes during SKProductsRequest.

    When SK1StoreProductDiscount is initialised it crashes on line 32: self.currencyCode = sk1Discount.priceLocale.currencyCode at priceLocale.

    1. Environment

      1. Platform: iOS
      2. SDK version: 4.2.1 also happnes with 4.1.0
      3. StoreKit 2 enabled (Y/N): Yes
      4. OS version: 13.6.1
      5. Xcode version: 13.3
      6. How widespread is the issue. Percentage of devices affected: All devices with iOS 13 I guess
    2. Debug logs that reproduce the issue Before the crash, there's just:

    [Purchases] - DEBUG: 😻 SKProductsRequest did finish
    [Purchases] - DEBUG: 😻 SKProductsRequest request received response
    
    1. Steps to reproduce, with a description of expected vs. actual behavior Just call Purchases.configure(withAPIKey and it happens every time.

    2. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

    Exception Type:  EXC_BREAKPOINT (SIGTRAP)
    Exception Codes: 0x0000000000000001, 0x00000001d1360494
    Termination Signal: Trace/BPT trap: 5
    Termination Reason: Namespace SIGNAL, Code 0x5
    Terminating Process: exc handler [6572]
    Triggered by Thread:  0
    
    Thread 0 name:
    Thread 0 Crashed:
    0   libswiftFoundation.dylib      	0x00000001d1360494 static Locale._unconditionallyBridgeFromObjectiveC(_:) + 332 (Locale.swift:473)
    1   AppBlock                      	0x00000001051a7bc4 init + 84 (StoreProductDiscount.swift:169)
    2   AppBlock                      	0x00000001051a7bc4 init + 84 (<compiler-generated>:85)
    3   AppBlock                      	0x00000001051a7bc4 compactMap + 84 (SK1StoreProduct.swift:0)
    4   AppBlock                      	0x00000001051a7bc4 SK1StoreProduct.discounts.getter + 1144
    5   AppBlock                      	0x0000000105182010 discounts.get + 40 (StoreProduct.swift:96)
    6   AppBlock                      	0x0000000105182010 extractDiscounts + 64 (ProductRequestData+Initialization.swift:71)
    7   AppBlock                      	0x0000000105182010 specialized ProductRequestData.init(with:) + 1136 (ProductRequestData+Initialization.swift:30)
    8   AppBlock                      	0x0000000105193fd4 init + 8 (PurchasesOrchestrator.swift:0)
    9   AppBlock                      	0x0000000105193fd4 PurchasesOrchestrator.postReceipt(withTransaction:receiptData:products:) + 76
    10  AppBlock                      	0x0000000105198b7c partial apply for closure #1 in PurchasesOrchestrator.fetchProductsAndPostReceipt(withTransaction:receiptData:) + 76 (PurchasesOrchestrator.swift:561)
    11  AppBlock                      	0x000000010518fd20 closure #1 in closure #2 in PurchasesOrchestrator.products(withIdentifiers:completion:) + 256 (PurchasesOrchestrator.swift:117)
    12  AppBlock                      	0x000000010518f2f0 thunk for @escaping @callee_guaranteed () -> () + 28 (<compiler-generated>:0)
    13  libdispatch.dylib             	0x000000019b0959a8 _dispatch_call_block_and_release + 24 (init.c:1408)
    14  libdispatch.dylib             	0x000000019b096524 _dispatch_client_callout + 16 (object.m:495)
    15  libdispatch.dylib             	0x000000019b0485b4 _dispatch_main_queue_callback_4CF$VARIANT$mp + 904 (inline_internal.h:2484)
    16  CoreFoundation                	0x000000019b34e6bc __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12 (CFRunLoop.c:1749)
    17  CoreFoundation                	0x000000019b349590 __CFRunLoopRun + 1724 (CFRunLoop.c:3069)
    18  CoreFoundation                	0x000000019b348ba8 CFRunLoopRunSpecific + 424 (CFRunLoop.c:3192)
    19  GraphicsServices              	0x00000001a54b8344 GSEventRunModal + 160 (GSEvent.c:2246)
    20  UIKitCore                     	0x000000019f4843e4 UIApplicationMain + 1932 (UIApplication.m:4823)
    21  libswiftUIKit.dylib           	0x00000001d15dd2b4 UIApplicationMain(_:_:_:_:) + 168 (UIKit.swift:528)
    22  AppBlock                      	0x0000000104e6ff80 main + 80 (<compiler-generated>:18)
    23  AppBlock                      	0x0000000104e6ff80 $main + 92 (LicensesViewController.swift:0)
    24  AppBlock                      	0x0000000104e6ff80 main + 108
    25  libdyld.dylib                 	0x000000019b1d08f0 start + 4
    
    bug triaged 
    opened by honzakeller 19
  • Fix path to storekit file in purchase tester

    Fix path to storekit file in purchase tester

    Checklist

    • [ ] If applicable, unit tests
    • [ ] If applicable, create follow-up issues for purchases-android and hybrids

    Motivation

    Fix issue on purchase tester

    Description

    Fix path. When opening PurchaseTester and check the schema, I see this error

    image build 
    opened by mcastany 0
  • Issue in UITests with current offerings property.

    Issue in UITests with current offerings property.

    Describe the bug We are using the current property from offerings to get the required purchase offer from the Product team. This is a great feature given by revenuecat because you don't need to know the identifier associated with the product.

    But when you land to tests with storekit tests, if the configuration doesn't match with the configuration (offerings and packages) in revenuecat, the current offer property is not filled.

    1. Environment
      1. Platform: iOS
      2. SDK version: 4.15.x
      3. StoreKit 2 (disabled with useStoreKit2IfEnabled(false)) (Y/N): N
      4. OS version: 16.x
      5. Xcode version: 14.1.0
      6. How widespread is the issue. Percentage of devices affected: No users, because it's only on UI tests.
    2. Debug logs that reproduce the issue
    3. Steps to reproduce, with a description of expected vs. actual behavior (described above)
    4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

    Additional context Maybe there's any way to fill the current offer for tests.

     Purchases.shared.getOfferings { offerings, error in
        ...
    
       print(offerings?.current) // Nil
       ...
      }
    
    
    bug 
    opened by jesus-mg-ios 3
  • `IntroEligibilityCalculator`: fixed logic for subscriptions in same group

    `IntroEligibilityCalculator`: fixed logic for subscriptions in same group

    • Fixes TRIAGE-221 for SK1.
    • Filed FB11889732 for SK2.

    Changes:

    • Added 2 IntroEligibilityCalculatorTests unit tests to cover this scenario
    • Added 1 IntroEligibilityCalculatorTests unit tests to cover the equivalent of the testIneligibleForIntroAfterPurchaseExpires integration test
    • Added 2 StoreKitIntegrationTests to cover this scenario (one of them disabled in SK2)
    • Updated IntroEligibilityCalculator logic to fix the new tests.
    WIP fix 
    opened by NachoSoto 2
  • Fixes RevenueCat.xcframework.zip so that is compatible as a binaryTarget() in SPM.

    Fixes RevenueCat.xcframework.zip so that is compatible as a binaryTarget() in SPM.

    Checklist

    • [ ] If applicable, unit tests
    • [ ] If applicable, create follow-up issues for purchases-android and hybrids

    Motivation

    This update changes the directory structure of the RevenueCat.xcframework.zip file so that is compatible for use with Swift Package Manager as a binary target.

    Resolves #2163

    Description

    Only include the RevenueCat.xcframework in the final zip file. Other directory are superfluous and not compatible with SPM.

    Steps to verify.

    Build the RevenueCat.xcframework.zip file using bundle exec fastlane ios export_xcframework. Unzip the resulting RevenueCat.xcframework.zip file in a temporary directory and verify that RevenueCat.xcframework is the only contents.

    ci 
    opened by scogeo 6
  • RevenueCat.xcframework.zip not compatible with use in SPM binaryTarget()

    RevenueCat.xcframework.zip not compatible with use in SPM binaryTarget()

    Describe the bug The RevenueCat.xcframework.zip that is produced for each release is not compatible for use as a binary target in swift package manager. Using a pre-compiled xcframework can substantially cut down on build times for both development and CI environments and increase overall productivity. For example one could define a Package.swift using a binary target and provide the correct checksum for that release:

    let package = Package(
    /// ....
      targets: [
        /// ...
        .binaryTarget(name: "RevenueCat",
                      url: "https://github.com/RevenueCat/purchases-ios/releases/download/4.15.4/RevenueCat.xcframework.zip",
                      checksum: "<the correct checksum>),
      ],
    /// ...
    )
    

    SPM requires that the zip file contain only the framework and that the framework is available at the root level of the zip file per Apple's documentation. The current xcframework zip file contains a directory at the root named "xcframeworks" and then multiple sub-directories including the RevenueCat.xcframework below it as follows:

    • (root)
      • xcframeworks
        • archives
        • RevenueCat.dSYMs
        • RevenueCat.xcframework

    The directory structure, and the archives and RevenueCat.dSYMs seem to be artifacts of how the xcframework was built using fastlane and are certainly not needed in the final zip. #1118 already included the dSYMs info directly in the xcframework.

    The fix is fairly straightforward which is to only include RevenueCat.xcframework directory in the final zip file so the structure would be as follows:

    • (root)
      • RevenueCat.xcframework

    This would then be compatible with both SPM and Carthage. Note that I have not tested this with Carthage, but there are other projects that provide Carthage xcframework.zip files that are structured in this manner and compatible with SPM.

    I already have a PR to fix the issue that I will submit shortly.

    1. Environment
      1. Platform: iOS 16.x
      2. SDK version: 4.15.4
      3. StoreKit 2 (disabled with useStoreKit2IfEnabled(false)) (Y/N): N/A
      4. OS version: MacOS 13.1 (build environment)
      5. Xcode version: 14.2
      6. How widespread is the issue. Percentage of devices affected.
    2. Debug logs that reproduce the issue
    3. Steps to reproduce, with a description of expected vs. actual behavior
    4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)
    bug 
    opened by scogeo 4
  • Possible issue with SSL in some users

    Possible issue with SSL in some users

    Describe the bug Seems like a considerable amount of users have had problems trying to connect with revenuecat. More data about the error at the end of the issue

    1. Environment
      1. Platform: iOS
      2. SDK version: 4.15.0
      3. StoreKit 2 (disabled with useStoreKit2IfEnabled(false)) (Y/N): N
      4. OS version: 15.x, 16.x
      5. Xcode version: 14.1.0
      6. How widespread is the issue. Percentage of devices affected.
    2. Debug logs that reproduce the issue
    3. Steps to reproduce, with a description of expected vs. actual behavior
    4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

    Additional context

    **nserror-code**: 10
    **nserror-domain**: RevenueCat.ErrorCode, 10
    **NSLocalizedDescription** Error performing request.
    **NSUnderlyingError**: Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://api.revenuecat.com/v1/subscribers/USERUUID, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <ID>.<45>, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask <ID>.<45>" ), NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://api.revenuecat.com/v1/subscribers/USERUUID, NSUnderlyingError=0x1009cd1a0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9816, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9816, _NSURLErrorNWPathKey=satisf
    **readable_error_code**: NETWORK_ERROR
    **source_file** RevenueCat/HTTPClient.swift:365
    **source_function**: init(_:dnsChecker:)
    
    bug 
    opened by jesus-mg-ios 6
Releases(4.16.0)
  • 4.16.0(Dec 27, 2022)

    New Features

    • Created ReceiptParser SPM (#2155) via NachoSoto (@NachoSoto)
    • Exposed PurchasesReceiptParser and AppleReceipt (#2153) via NachoSoto (@NachoSoto)

    Bugfixes

    • Restore purchases: post product data when posting receipts (#2178) via NachoSoto (@NachoSoto)

    Other Changes

    • Added Dictionary.merge (#2190) via NachoSoto (@NachoSoto)
    • CircleCI: use Xcode 14.2.0 (#2187) via NachoSoto (@NachoSoto)
    • ReceiptParser: a few documentation improvements (#2189) via NachoSoto (@NachoSoto)
    • Purchase Tester: fixed TestFlight deployment (#2188) via NachoSoto (@NachoSoto)
    • Purchase Tester: display specific IntroEligibilityStatus (#2184) via NachoSoto (@NachoSoto)
    • Purchase Tester: fixed SubscriptionPeriod (#2185) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(28.23 MB)
    RevenueCat.xcframework.zip(171.60 MB)
  • 4.15.5(Dec 21, 2022)

    Bugfixes

    • ErrorUtils.purchasesError(withUntypedError:): handle PublicErrors (#2165) via NachoSoto (@NachoSoto)
    • Fixed race condition finishing SK1 transactions (#2148) via NachoSoto (@NachoSoto)
    • IntroEligibilityStatus: added CustomStringConvertible implementation (#2182) via NachoSoto (@NachoSoto)
    • BundleSandboxEnvironmentDetector: fixed logic for macOS (#2176) via NachoSoto (@NachoSoto)
    • Fixed AttributionFetcher.adServicesToken hanging when called in simulator (#2157) via NachoSoto (@NachoSoto)

    Other Changes

    • Purchase Tester: added ability to purchase products directly with StoreKit (#2172) via NachoSoto (@NachoSoto)
    • DNSChecker: simplified NetworkError initialization (#2166) via NachoSoto (@NachoSoto)
    • Purchases initialization: refactor to avoid multiple concurrent instances in memory (#2180) via NachoSoto (@NachoSoto)
    • Purchase Tester: added button to clear messages on logger view (#2179) via NachoSoto (@NachoSoto)
    • NetworkOperation: added assertion to ensure that subclasses call completion (#2138) via NachoSoto (@NachoSoto)
    • CacheableNetworkOperation: avoid unnecessarily creating operations for cache hits (#2135) via NachoSoto (@NachoSoto)
    • PurchaseTester: fixed macOS support (#2175) via NachoSoto (@NachoSoto)
    • IntroEligibilityCalculator: added log including AppleReceipt (#2181) via NachoSoto (@NachoSoto)
    • Purchase Tester: fixed scene manifest (#2170) via NachoSoto (@NachoSoto)
    • HTTPClientTests: refactored to use waitUntil (#2168) via NachoSoto (@NachoSoto)
    • Integration Tests: split up tests in smaller files (#2158) via NachoSoto (@NachoSoto)
    • StoreKitRequestFetcher: removed unnecessary dispatch (#2152) via NachoSoto (@NachoSoto)
    • Purchase Tester: added companion watchOS app (#2140) via NachoSoto (@NachoSoto)
    • StoreKit1Wrapper: added warning if receiving too many updated transactions (#2117) via NachoSoto (@NachoSoto)
    • StoreKitTestHelpers: cleaned up unnecessary log (#2177) via NachoSoto (@NachoSoto)
    • TrialOrIntroPriceEligibilityCheckerSK1Tests: use waitUntilValue (#2173) via NachoSoto (@NachoSoto)
    • DNSChecker: added log with resolved host (#2167) via NachoSoto (@NachoSoto)
    • MagicWeatherSwiftUI: updated README to point to workspace (#2142) via NachoSoto (@NachoSoto)
    • Purchase Tester: fixed .storekit config file reference (#2171) via NachoSoto (@NachoSoto)
    • Purchase Tester: fixed error alerts (#2169) via NachoSoto (@NachoSoto)
    • CI: don't make releases until release-checks pass (#2162) via NachoSoto (@NachoSoto)
    • Fastfile: changed match to readonly (#2161) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(27.95 MB)
    RevenueCat.xcframework.zip(168.07 MB)
  • 4.15.4(Dec 15, 2022)

    Bugfixes

    • Fix sending presentedOfferingIdentifier in StoreKit2 (#2156) via Toni Rico (@tonidero)
    • ReceiptFetcher: throttle receipt refreshing to avoid StoreKit throttle errors (#2146) via NachoSoto (@NachoSoto)

    Other Changes

    • Added integration and unit tests to verify observer mode behavior (#2069) via NachoSoto (@NachoSoto)
    • Created ClockType and TestClock to be able to mock time (#2145) via NachoSoto (@NachoSoto)
    • Extracted asyncWait to poll async conditions in tests (#2134) via NachoSoto (@NachoSoto)
    • StoreKitRequestFetcher: added log when starting/ending requests (#2151) via NachoSoto (@NachoSoto)
    • CI: fixed PurchaseTester deployment (#2147) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(27.73 MB)
    RevenueCat.xcframework.zip(166.98 MB)
  • 4.15.3(Dec 14, 2022)

    Bugfixes

    • Un-deprecate Purchases.configure(withAPIKey:appUserID:) and Purchases.configure(withAPIKey:appUserID:observerMode:) (#2129) via NachoSoto (@NachoSoto)

    Other Changes

    • ReceiptFetcherTests: refactored tests using waitUntilValue (#2144) via NachoSoto (@NachoSoto)
    • Added a few performance improvements for ReceiptParser (#2124) via NachoSoto (@NachoSoto)
    • CallbackCache: fixed reference (#2143) via NachoSoto (@NachoSoto)
    • PostReceiptDataOperation: clarified receipt debug log (#2128) via NachoSoto (@NachoSoto)
    • CallbackCache: avoid exposing internal mutable cache (#2136) via NachoSoto (@NachoSoto)
    • CallbackCache: added assertion for tests to ensure we don't leak callbacks (#2137) via NachoSoto (@NachoSoto)
    • NetworkOperation: made Atomic references immutable (#2139) via NachoSoto (@NachoSoto)
    • ReceiptParser: ensure parsing never happens in the main thread (#2123) via NachoSoto (@NachoSoto)
    • PostReceiptDataOperation: also print receipt data with verbose logs (#2127) via NachoSoto (@NachoSoto)
    • BasePurchasesTests: detecting and fixing many DeviceCache leaks (#2105) via NachoSoto (@NachoSoto)
    • StoreKitIntegrationTests: added test to check applying a promotional offer during subscription (#1588) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(27.64 MB)
    RevenueCat.xcframework.zip(166.50 MB)
  • 4.15.2(Dec 9, 2022)

    Bugfixes

    • Fixed purchasing with PromotionalOffers using StoreKit 2 (#2020) via NachoSoto (@NachoSoto)

    Other Changes

    • CircleCI: cache Homebrew installation (#2103) via NachoSoto (@NachoSoto)
    • Integration Tests: fixed Purchases leak through PurchasesDiagnostics (#2126) via NachoSoto (@NachoSoto)
    • HTTPClient: replaced X-StoreKit2-Setting with X-StoreKit2-Enabled (#2118) via NachoSoto (@NachoSoto)
    • BasePurchasesTests: added assertion to ensure Purchases does not leak (#2104) via NachoSoto (@NachoSoto)
    • ReceiptParser.parse always throws ReceiptParser.Error (#2099) via NachoSoto (@NachoSoto)
    • Tests: ensure Purchases is not configured multiple times (#2100) via NachoSoto (@NachoSoto)
    • Extracted LoggerType (#2098) via NachoSoto (@NachoSoto)
    • Integration Tests: verify Purchases does not leak across tests (#2106) via NachoSoto (@NachoSoto)
    • StoreKit2 listeners: set Task priority to .utility (#2070) via NachoSoto (@NachoSoto)
    • Installation Tests: remove unused code in Fastfile (#2097) via NachoSoto (@NachoSoto)
    • DeviceCache: added verbose logs for init/deinit (#2101) via NachoSoto (@NachoSoto)
    • StoreKit1Wrapper: process transactions in a background thread (#2115) via NachoSoto (@NachoSoto)
    • update CONTRIBUTING.md link in bug report template (#2119) via Nate Lowry (@natelowry)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(27.61 MB)
    RevenueCat.xcframework.zip(166.37 MB)
  • 4.15.1(Dec 9, 2022)

  • 3.14.3(Dec 1, 2022)

  • 4.15.0(Nov 30, 2022)

    New Features

    • Added LogLevel.verbose (#2080) via NachoSoto (@NachoSoto)

    Other Changes

    • Fixed LogLevel ordering and added tests (#2102) via NachoSoto (@NachoSoto)
    • TimingUtil: fixed Xcode 13.2 compilation (#2088) via NachoSoto (@NachoSoto)
    • Generate documentation for iOS instead of macOS (#2089) via NachoSoto (@NachoSoto)
    • Update fastlane (#2090) via NachoSoto (@NachoSoto)
    • CI: speed up docs-deploy by only installing bundle dependencies (#2092) via NachoSoto (@NachoSoto)
    • Tests: replaced toEventually with new waitUntilValue to simplify tests (#2071) via NachoSoto (@NachoSoto)
    • CircleCI: fixed docs-deploy git credentials (#2087) via NachoSoto (@NachoSoto)
    • Added verbose logs for Purchases and StoreKit1Wrapper lifetime (#2082) via NachoSoto (@NachoSoto)
    • StoreKit: added logs when purchasing and product requests are too slow (#2061) via NachoSoto (@NachoSoto)
    • Created TimingUtil to measure and log methods that are too slow (#2059) via NachoSoto (@NachoSoto)
    • SKTestSession: finish all unfinished transactions before starting each test (#2066) via NachoSoto (@NachoSoto)
    • CircleCI: lowered no_output_timeout to 5 minutes (#2084) via NachoSoto (@NachoSoto)
    • Removed unused APITesters.xcworkspace and created RevenueCat.xcworkspace (#2075) via NachoSoto (@NachoSoto)
    • Atomic: added new test to verify each instance gets its own Lock (#2077) via NachoSoto (@NachoSoto)
    • Logger: exposed generic log method (#2058) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(27.57 MB)
    RevenueCat.xcframework.zip(166.25 MB)
  • 4.14.3(Nov 23, 2022)

    Bugfixes

    • Changed default UserDefaults from .standard to our own Suite (#2046) via NachoSoto (@NachoSoto)

    Other Changes

    • Logging: added log when configuring SDK in observer mode (#2065) via NachoSoto (@NachoSoto)
    • PurchaseTesterSwiftUI: added observer mode setting (#2052) via NachoSoto (@NachoSoto)
    • Exposed SystemInfo.observerMode to simplify code (#2064) via NachoSoto (@NachoSoto)
    • Result.init(catching:) with async method (#2060) via NachoSoto (@NachoSoto)
    • Updated schemes and project for Xcode 14.1 (#2081) via NachoSoto (@NachoSoto)
    • PurchasesSubscriberAttributesTests: simplified tests (#2056) via NachoSoto (@NachoSoto)
    • DeviceCache: removed fatalError for users not overriding UserDefaults (#2079) via NachoSoto (@NachoSoto)
    • DeviceCache: changed NotificationCenter observation to be received on posting thread (#2078) via NachoSoto (@NachoSoto)
    • StoreKit1Wrapper: added instance address when detecting transactions (#2055) via NachoSoto (@NachoSoto)
    • Fixed lint issues with SwiftLint 0.5.0 (#2076) via NachoSoto (@NachoSoto)
    • NSData+RCExtensionsTests: improved errors (#2043) via NachoSoto (@NachoSoto)
    • APITester: fixed warning in SubscriptionPeriodAPI (#2054) via NachoSoto (@NachoSoto)
    • Integration Tests: always run them in random order locally (#2068) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(27.18 MB)
    RevenueCat.xcframework.zip(164.25 MB)
  • 4.14.2(Nov 18, 2022)

    Bugfixes

    • StoreKit 2: don't finish transactions in observer mode (#2053) via NachoSoto (@NachoSoto)

    Other Changes

    • CircleCI: added ability to create a release manually (#2067) via NachoSoto (@NachoSoto)
    • Changelog: Fix links to V4 API Migration guide (#2051) via Kevin Quisquater (@KevinQuisquater)
    • HTTPClient: added log for failed requests (#2048) via NachoSoto (@NachoSoto)
    • ErrorResponse.asBackendError: serialize attribute errors as NSDictionary (#2034) via NachoSoto (@NachoSoto)
    • ErrorCode.unknownBackendError: include original error code (#2032) via NachoSoto (@NachoSoto)
    • CI: fixed push-pods job (#2045) via NachoSoto (@NachoSoto)
    • PostReceiptDataOperation: log Apple error when purchase equals expiration date (#2038) via NachoSoto (@NachoSoto)
    • Update Fastlane plugin (#2041) via Cesar de la Vega (@vegaro)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(27.10 MB)
    RevenueCat.xcframework.zip(163.88 MB)
  • 4.14.1(Nov 9, 2022)

    Bugfixes

    • ISO8601DateFormatter.withMilliseconds: fixed iOS 11 crash (#2037) via NachoSoto (@NachoSoto)
    • Changed StoreKit2Setting.default back to .enabledOnlyForOptimizations (#2022) via NachoSoto (@NachoSoto)

    Other Changes

    • Integration Tests: changed weekly to monthly subscriptions to work around 0-second subscriptions (#2042) via NachoSoto (@NachoSoto)
    • Integration Tests: fixed testPurchaseWithAskToBuyPostsReceipt (#2040) via NachoSoto (@NachoSoto)
    • ReceiptRefreshPolicy.retryUntilProductIsFound: default to returning "invalid" receipt (#2024) via NachoSoto (@NachoSoto)
    • CachingProductsManager: use partial cached products (#2014) via NachoSoto (@NachoSoto)
    • Added BackendErrorCode.purchasedProductMissingInAppleReceipt (#2033) via NachoSoto (@NachoSoto)
    • PurchaseTesterSwiftUI: replaced Purchases dependency with SPM (#2027) via NachoSoto (@NachoSoto)
    • Integration Tests: changed log output to raw (#2031) via NachoSoto (@NachoSoto)
    • Integration Tests: run on iOS 16 (#2035) via NachoSoto (@NachoSoto)
    • CI: fixed iOS 14 tests Xcode version (#2030) via NachoSoto (@NachoSoto)
    • Async.call: added non-throwing overload (#2006) via NachoSoto (@NachoSoto)
    • Documentation: Fixed references in V4_API_Migration_guide.md (#2018) via NachoSoto (@NachoSoto)
    • eligiblePromotionalOffers: don't log error if response is ineligible (#2019) via NachoSoto (@NachoSoto)
    • Runs push-pods after make-release (#2025) via Cesar de la Vega (@vegaro)
    • Some updates on notify-on-non-patch-release-branches: (#2026) via Cesar de la Vega (@vegaro)
    • Deploy PurchaseTesterSwiftUI to TestFlight (#2003) via NachoSoto (@NachoSoto)
    • PurchaseTesterSwiftUI: added "logs" screen (#2012) via NachoSoto (@NachoSoto)
    • PurchaseTesterSwiftUI: allow configuring API key at runtime (#1999) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(27.00 MB)
    RevenueCat.xcframework.zip(163.36 MB)
  • 4.14.0(Nov 4, 2022)

    New Features

    • Introduced PurchasesDiagnostics to help diagnose SDK configuration errors (#1977) via NachoSoto (@NachoSoto)

    Bugfixes

    • Avoid posting empty receipts by makingTransactionsManager always use SK1 implementation (#2015) via NachoSoto (@NachoSoto)
    • NetworkOperation: workaround for iOS 12 crashes (#2008) via NachoSoto (@NachoSoto)

    Other Changes

    • Makes hold job wait for installation tests to pass (#2017) via Cesar de la Vega (@vegaro)
    • Update fastlane-plugin-revenuecat_internal (#2016) via Cesar de la Vega (@vegaro)
    • bug_report.md: changed SK2 wording (#2010) via NachoSoto (@NachoSoto)
    • Added Set + Set and Set += Set operators (#2013) via NachoSoto (@NachoSoto)
    • fix the link to StoreKit Config file from watchOS purchaseTester (#2009) via Andy Boedo (@aboedo)
    • PurchaseTesterSwiftUI: combined targets into one multi-platform and fixed macOS (#1996) via NachoSoto (@NachoSoto)
    • Less Array() (#2005) via SabinaHuseinova (@SabinaHuseinova)
    • Docs: fixed logIn references (#2002) via NachoSoto (@NachoSoto)
    • CI: use Xcode 14.1 (#1992) via NachoSoto (@NachoSoto)
    • PurchaseTesterSwiftUI: fixed warnings and simplified code using async methods (#1985) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(55.19 MB)
    RevenueCat.xcframework.zip(171.68 MB)
  • 4.13.4(Oct 26, 2022)

    Bugfixes

    • Fixed Xcode 13.2.x / Swift 5.5 compatibility (#1994) via NachoSoto (@NachoSoto)

    Other Changes

    • Update fastlane (#1998) via NachoSoto (@NachoSoto)
    • Documentation: fixed missing docs from inherited symbols (#1997) via NachoSoto (@NachoSoto)
    • CI: added job to test compilation with Xcode 13.2.1 / Swift 5.5 (#1990) via NachoSoto (@NachoSoto)
    • Extracted TrialOrIntroPriceEligibilityCheckerType (#1983) via NachoSoto (@NachoSoto)
    • CI: removed redundant swiftlint installation (#1993) via NachoSoto (@NachoSoto)
    • Nimble: use a fixed version (#1991) via NachoSoto (@NachoSoto)
    • Update fastlane-plugin-revenuecat_internal (#1989) via Cesar de la Vega (@vegaro)
    • Purchases.logIn: log warning if attempting to use a static appUserID (#1958) via NachoSoto (@NachoSoto)
    • Created InternalAPI for "health" request (#1971) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(54.76 MB)
    RevenueCat.xcframework.zip(170.30 MB)
  • 4.13.3(Oct 24, 2022)

  • 4.13.2(Oct 15, 2022)

    Bugfixes

    • Purchasing: fixed consumable purchases by fixing transaction-finishing (#1965) via NachoSoto (@NachoSoto)
    • 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)

    Other Changes

    • Updating great support link via Miguel JosĂŠ Carranza Guisado (@MiguelCarranza)
    • 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)
    • Renamed CallbackCache.add(callback:) (#1970) via NachoSoto (@NachoSoto)
    • Fixed iOS 12/13 test snapshots (#1972) via NachoSoto (@NachoSoto)
    • Moved SKPaymentQueue.presentCodeRedemptionSheet to StoreKitWorkarounds (#1967) via NachoSoto (@NachoSoto)
    • Async.call method to convert completion-block call to async (#1969) via NachoSoto (@NachoSoto)
    • Remind about updating docs and parity spreadsheet on minor releases (#1955) via Cesar de la Vega (@vegaro)
    • PostReceiptDataOperation: added initiationSource parameter (#1957) via NachoSoto (@NachoSoto)
    • StoreKit1Wrapper: separated SKPaymentTransactionObserver and SKPaymentQueueDelegate implementations (#1961) via NachoSoto (@NachoSoto)
    • Refactored Error.isCancelledError into Error+Extensions (#1960) via NachoSoto (@NachoSoto)
    • Update fastlane plugin (#1959) via Cesar de la Vega (@vegaro)
    • Integration Tests: simplified testIneligibleForIntroAfterPurchaseExpires to fix flakiness (#1952) via NachoSoto (@NachoSoto)
    • fix typo in comment (#1956) via Andy Boedo (@aboedo)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(54.44 MB)
    RevenueCat.xcframework.zip(169.40 MB)
  • 4.13.1(Sep 28, 2022)

    Note:

    ⚠️ ⚠️ 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.

    Other Changes

    • ProductsFetcherSK2: removed now redundant caching logic (#1908) via NachoSoto (@NachoSoto)
    • Created CachingProductsManager to provide consistent caching logic when fetching products (#1907) via NachoSoto (@NachoSoto)
    • Refactored ReceiptFetcher.receiptData (#1941) via NachoSoto (@NachoSoto)
    • Abstracted conversion from async to completion-block APIs (#1943) via NachoSoto (@NachoSoto)
    • Moved 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)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(53.40 MB)
    RevenueCat.xcframework.zip(166.56 MB)
  • 4.13.0(Sep 27, 2022)

    Note:

    ⚠️ ⚠️ 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.

    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)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(52.89 MB)
    RevenueCat.xcframework.zip(165.19 MB)
  • 4.12.1(Sep 23, 2022)

    Note:

    ⚠️ ⚠️ 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.

    Bugfixes

    • Purchases.beginRefundRequest: ensured errors are PublicError (#1913) via NachoSoto (@NachoSoto)
    • PurchaseTesterSwiftUI: fixed macOS target (#1915) via NachoSoto (@NachoSoto)

    Other Changes

    • Fixed 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)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(51.99 MB)
    RevenueCat.xcframework.zip(161.66 MB)
  • 4.12.0(Sep 8, 2022)

    Note:

    ⚠️ ⚠️ 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.

    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)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(52.00 MB)
    RevenueCat.xcframework.zip(161.66 MB)
  • 4.11.0(Aug 30, 2022)

  • 4.10.3(Aug 26, 2022)

    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)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(51.48 MB)
    RevenueCat.xcframework.zip(160.24 MB)
  • 4.10.2(Aug 19, 2022)

    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)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(51.49 MB)
    RevenueCat.xcframework.zip(160.24 MB)
  • 4.10.1(Aug 15, 2022)

  • 4.10.0(Aug 8, 2022)

    New Features

    • New AdServices Integration (#1727) via Josh Holtz (@joshdholtz)

    Bugfixes

    • OfferingsManager: expose underlying error when ProductsManager returns an error (#1792) via NachoSoto (@NachoSoto)
    • Add missing logs to ProductsFetcherSK2 (#1780) via beylmk (@beylmk)

    Other Changes

    • AdServices: Fix failing tests on main in iOS 12 and 13 - IOSAttributionPosterTests (#1797) via Josh Holtz (@joshdholtz)
    • Invalidates gem caches and separates danger and macOS caches (#1798) via Cesar de la Vega (@vegaro)
    • Pass CircleCI branch to prepare_next_version job (#1796) via Toni Rico (@tonidero)
    • Configure Danger, enforce labels (#1761) via Cesar de la Vega (@vegaro)
    • Support for new fastlane internal plugin for automation (#1779) via Toni Rico (@tonidero)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(51.26 MB)
    RevenueCat.xcframework.zip(159.38 MB)
  • 4.9.1-adservices.beta.2(Aug 4, 2022)

    ⚠️ ⚠️ ⚠️ 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. ⚠️ ⚠️ ⚠️

    AdServices Beta

    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.

    Source code(tar.gz)
    Source code(zip)
  • 4.9.1(Aug 1, 2022)

    Fixes:

    • CustomerInfoResponseHandler: return CustomerInfo instead of error if the response was successful (#1778) via NachoSoto (@NachoSoto)
    • Error logging: logErrorIfNeeded no longer prints message if it's the same as the error description (#1776) via NachoSoto (@NachoSoto)
    • fix another broken link in docC docs (#1777) via aboedo (@aboedo)
    • fix links to restorePurchase (#1775) via aboedo (@aboedo)
    • fix getProducts docs broken link (#1772) via aboedo (@aboedo)

    Improvements:

    • Logger: wrap message in @autoclosure to avoid creating when LogLevel is disabled (#1781) via NachoSoto (@NachoSoto)

    Other changes:

    • Lint: fixed SubscriberAttributesManager (#1774) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(50.46 MB)
    RevenueCat.xcframework.zip(157.31 MB)
  • 4.9.0(Jul 13, 2022)

  • 4.8.0(Jul 12, 2022)

    New API

    • EntitlementInfo: added isActiveInCurrentEnvironment and isActiveInAnyEnvironment (#1755) via NachoSoto (@NachoSoto)

    Other Changes

    • Plumb platformInfo in Configuration for PHC use (#1757) via Joshua Liebowitz (@taquitos)
    • added a log when autoSyncPurchases is disabled (#1749) via aboedo (@aboedo)
    • Re-fetch cached offerings and products after Storefront changes (3/4) (#1743) via Juanpe CatalĂĄn (@Juanpe)
    • bug_report.md: clarify SK2 support (#1752) via NachoSoto (@NachoSoto)
    • logErrorIfNeeded: also log message if present (#1754) via NachoSoto (@NachoSoto)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(49.55 MB)
    RevenueCat.xcframework.zip(154.73 MB)
  • 4.7.0-adservices.beta.1(Jul 7, 2022)

    ⚠️ ⚠️ ⚠️ 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. ⚠️ ⚠️ ⚠️

    AdServices Beta

    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.

    Source code(tar.gz)
    Source code(zip)
  • 4.7.0(Jul 4, 2022)

    This release is compatible with Xcode 14 beta 2

    Changes:

    • Replaced CustomerInfo.nonSubscriptionTransactions with a new non-StoreTransaction type (#1733) via NachoSoto (@NachoSoto)
    • Purchases.configure: added overload taking a Configuration.Builder (#1720) via NachoSoto (@NachoSoto)
    • Extract Attribution logic out of Purchases (#1693) via Joshua Liebowitz (@taquitos)
    • Remove create alias (#1695) via Joshua Liebowitz (@taquitos)

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

    Improvements:

    • Improved purchasing logs, added promotional offer information (#1725) via NachoSoto (@NachoSoto)
    • 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)
    • New SwiftUI Purchase Tester example (#1722) via Josh Holtz (@joshdholtz)
    • update docs for 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)
    • Clear cached offerings and products after Storefront changes (2/4) (#1583) via Juanpe CatalĂĄn (@Juanpe)
    • ROT13: optimized initialization and removed magic numbers (#1702) via NachoSoto (@NachoSoto)

    Fixes:

    • 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)
    Source code(tar.gz)
    Source code(zip)
    RevenueCat.framework.zip(49.25 MB)
    RevenueCat.xcframework.zip(153.83 MB)
Owner
RevenueCat
The best way to build, analyze, and grow in-app subscriptions
RevenueCat
Demonstrates how to integrate Stripe Subscriptions on iOS

Stripe Subscriptions with iOS This example app demonstrates how to integrate Stripe subscriptions with the prebuilt payment UI Requirements Create an

Conjure 0 Nov 26, 2021
Lightweight In App Purchases Swift framework for iOS 8.0+, tvOS 9.0+ and macOS 10.10+ ⛺

SwiftyStoreKit is a lightweight In App Purchases framework for iOS, tvOS, watchOS, macOS, and Mac Catalyst. Features Super easy-to-use block-based API

Andrea Bizzotto 6.1k Jan 7, 2023
A lightweight iOS library for In-App Purchases

#RMStore A lightweight iOS library for In-App Purchases. RMStore adds blocks and notifications to StoreKit, plus receipt verification, content downloa

Robot Media 2.4k Dec 19, 2022
A modern In-App Purchases management framework for iOS.

MerchantKit A modern In-App Purchases management framework for iOS developers. MerchantKit dramatically simplifies the work indie developers have to d

Benjamin Mayo 1.1k Dec 17, 2022
Handle in-app purchases in iOS in a convenient way

InAppPurchases Handle in-app purchases in iOS in a convenient way. Overview InAppPurchases covers all the basic aspects of in-app purchases in swift i

Umar Awais 4 Nov 8, 2022
Easy to use iOS library with components for input of Credit Card data.

AnimatedCardInput This library allows you to drop into your project two easily customisable, animated components that will make input of Credit Card i

Netguru 39 Oct 16, 2022
Easy, drop-in tip jar for iOS apps.

Installation TipJarViewController is available through CocoaPods. To install it, simply add the following line to your Podfile: pod 'TipJarViewControl

Lionheart Software 79 Apr 27, 2022
card.io provides fast, easy credit card scanning in mobile apps

card.io SDK for iOS card.io provides fast, easy credit card scanning in mobile apps. NEW!!! card.io is now an open-source project! As of December 2014

card.io 2.3k Jan 4, 2023
iOS SDK for cross-platform in-app purchase and subscription infrastructure, revenue analytics, engagement automation, and integrations

Qonversion is the data platform to power in-app subscription revenue growth. fast in-app subscriptions implementation back-end infrastructure to valid

Qonversion 253 Dec 18, 2022
Make and accept payments in your iOS app via Venmo

Venmo iOS SDK The Venmo iOS SDK lets you make and accept payments in your app using Venmo. Installation If you're using CocoaPods: If you don't have a

Venmo 170 Dec 26, 2022
Accept credit cards and PayPal in your iOS app

Important: PayPal Mobile SDKs are Deprecated. The APIs powering them will remain operational long enough for merchants to migrate, but the SDKs themse

PayPal 973 Dec 18, 2022
Easily integrate Credit Card payments module in iOS App. Swift 4.0

MFCard Buy me a coffee MFCard is an awesome looking Credit Card input & validation control. Written in Swift 3. YOoo, Now MFCard is on Swift 5. Swift

MobileFirst 362 Nov 29, 2022
In App Purchase Manager framework for iOS

InAppFramework In App Purchase Manager framework for iOS Disclaimer I know it's been too long since the last update, quite a few things happened in my

SĂĄndor Gyulai 40 May 23, 2020
Square In-App Payments iOS SDK SwiftUI

Square In-App Payments iOS SDK SwiftUI Build remarkable payments experiences in

Ashley Bailey 2 Mar 8, 2022
SwiftUI BusinessCard - Created iOS Business card app to practice SwiftUI

SwiftUI_BusinessCard Created iOS Business card app to practice SwiftUI

null 0 Jan 29, 2022
A jailed in-app purchase cracker for iOS 12.2-15.6

Satella Jailed For, um, educational purposes only or something. Definitely don't use this to pirate in-app purchases in apps to which you don't have l

Lilly 314 Dec 31, 2022
OnTime - OnTime App is for Scheduling your day and prioritizing your task and also for saving notes

OnTime OnTime App is for Scheduling your day and prioritizing your task and also

Mohammed Sulaiman 1 Jan 7, 2023
TPInAppReceipt is a lightweight, pure-Swift library for reading and validating Apple In App Purchase Receipt locally.

TPInAppReceipt is a lightweight, pure-Swift library for reading and validating Apple In App Purchase Receipt locally. Features Read all

Pavel T 520 Jan 4, 2023
With SwiftUI payment share app

Splitpayment With SwiftUI payment share app.

Ahmet Onur Şahin 3 Apr 18, 2022