diff --git a/Sources/Purchasing/Purchases/Purchases.swift b/Sources/Purchasing/Purchases/Purchases.swift index 14b7a3b28c..0e4c0f2a1b 100644 --- a/Sources/Purchasing/Purchases/Purchases.swift +++ b/Sources/Purchasing/Purchases/Purchases.swift @@ -1396,6 +1396,19 @@ public extension Purchases { return await checkTrialOrIntroductoryDiscountEligibilityAsync(product) } + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) + func checkTrialOrIntroDiscountEligibility(package: Package, + completion: @escaping (IntroEligibilityStatus) -> Void) { + trialOrIntroPriceEligibilityChecker.checkEligibility( + product: package.storeProduct, + completion: completion + ) + } + + func checkTrialOrIntroDiscountEligibility(package: Package) async -> IntroEligibilityStatus { + return await checkTrialOrIntroductoryDiscountEligibilityAsync(package.storeProduct) + } + #if os(iOS) || targetEnvironment(macCatalyst) || VISION_OS @available(iOS 13.4, macCatalyst 13.4, *) @objc func showPriceConsentIfNeeded() { diff --git a/Sources/Purchasing/Purchases/PurchasesType.swift b/Sources/Purchasing/Purchases/PurchasesType.swift index c8522956d2..0b13a1bfdd 100644 --- a/Sources/Purchasing/Purchases/PurchasesType.swift +++ b/Sources/Purchasing/Purchases/PurchasesType.swift @@ -723,6 +723,58 @@ public protocol PurchasesType: AnyObject { func checkTrialOrIntroDiscountEligibility(product: StoreProduct) async -> IntroEligibilityStatus + /** + * Computes whether or not a user is eligible for the introductory pricing period of a given package. + * You should use this method to determine whether or not you show the user the normal product price or + * the introductory price. This also applies to trials (trials are considered a type of introductory pricing). + * [iOS Introductory Offers](https://docs.revenuecat.com/docs/ios-subscription-offers). + * + * - Note: If you're looking to use Promotional Offers instead, + * use ``Purchases/getPromotionalOffer(forProductDiscount:product:completion:)``. + * + * - Note: Subscription groups are automatically collected for determining eligibility. If RevenueCat can't + * definitively compute the eligibility, most likely because of missing group information, it will return + * ``IntroEligibilityStatus/unknown``. The best course of action on unknown status is to display the non-intro + * pricing, to not create a misleading situation. To avoid this, make sure you are testing with the latest + * version of iOS so that the subscription group can be collected by the SDK. + * + * - Parameter package: The ``Package`` for which you want to compute eligibility. + * - Parameter completion: A block that receives an ``IntroEligibilityStatus``. + * + * ### Related symbols + * - ``Purchases/checkTrialOrIntroDiscountEligibility(productIdentifiers:completion:)`` + * - ``Purchases/checkTrialOrIntroDiscountEligibility(product:completion:)`` + */ + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) + func checkTrialOrIntroDiscountEligibility( + package: Package, + completion: @escaping (IntroEligibilityStatus) -> Void + ) + + /** + * Computes whether or not a user is eligible for the introductory pricing period of a given package. + * You should use this method to determine whether or not you show the user the normal product price or + * the introductory price. This also applies to trials (trials are considered a type of introductory pricing). + * [iOS Introductory Offers](https://docs.revenuecat.com/docs/ios-subscription-offers). + * + * - Note: If you're looking to use Promotional Offers instead, + * use ``Purchases/getPromotionalOffer(forProductDiscount:product:completion:)``. + * + * - Note: Subscription groups are automatically collected for determining eligibility. If RevenueCat can't + * definitively compute the eligibility, most likely because of missing group information, it will return + * ``IntroEligibilityStatus/unknown``. The best course of action on unknown status is to display the non-intro + * pricing, to not create a misleading situation. To avoid this, make sure you are testing with the latest + * version of iOS so that the subscription group can be collected by the SDK. + * + * - Parameter package: The ``Package`` for which you want to compute eligibility. + * + * ### Related symbols + * - ``Purchases/checkTrialOrIntroDiscountEligibility(productIdentifiers:)`` + * - ``Purchases/checkTrialOrIntroDiscountEligibility(product:)`` + */ + func checkTrialOrIntroDiscountEligibility(package: Package) async + -> IntroEligibilityStatus + /** * Use this method to fetch ``PromotionalOffer`` * to use in ``Purchases/purchase(package:promotionalOffer:)`` diff --git a/Tests/APITesters/AllAPITests/CustomEntitlementComputationSwiftAPITester/PurchasesAPI.swift b/Tests/APITesters/AllAPITests/CustomEntitlementComputationSwiftAPITester/PurchasesAPI.swift index 93b135663b..94cdb38f5a 100644 --- a/Tests/APITesters/AllAPITests/CustomEntitlementComputationSwiftAPITester/PurchasesAPI.swift +++ b/Tests/APITesters/AllAPITests/CustomEntitlementComputationSwiftAPITester/PurchasesAPI.swift @@ -256,11 +256,13 @@ private func checkAsyncMethods(purchases: Purchases) async { let _: [String: IntroEligibility] = await purchases.checkTrialOrIntroDiscountEligibility(productIdentifiers: [""]) let _: [Package: IntroEligibility] = await purchases.checkTrialOrIntroDiscountEligibility(packages: [pack]) let _: IntroEligibilityStatus = await purchases.checkTrialOrIntroDiscountEligibility(product: stp) + let _: IntroEligibilityStatus = await purchases.checkTrialOrIntroDiscountEligibility(package: pack) } catch {} } func checkNonAsyncMethods(_ purchases: Purchases) { let storeProduct: StoreProduct! = nil + let package: Package! = nil if #available(iOS 15.0, *) { #if os(iOS) @@ -283,6 +285,9 @@ func checkNonAsyncMethods(_ purchases: Purchases) { purchases.checkTrialOrIntroDiscountEligibility(product: storeProduct) { introEligibilityStatus in let _: IntroEligibilityStatus = introEligibilityStatus } + purchases.checkTrialOrIntroDiscountEligibility(package: package) { introEligibilityStatus in + let _: IntroEligibilityStatus = introEligibilityStatus + } } private func checkConfigure() -> Purchases! { diff --git a/Tests/APITesters/AllAPITests/ObjcAPITester/RCPurchasesAPI.m b/Tests/APITesters/AllAPITests/ObjcAPITester/RCPurchasesAPI.m index c929351390..97c93d31dd 100644 --- a/Tests/APITesters/AllAPITests/ObjcAPITester/RCPurchasesAPI.m +++ b/Tests/APITesters/AllAPITests/ObjcAPITester/RCPurchasesAPI.m @@ -194,6 +194,7 @@ + (void)checkAPI { [p syncPurchasesWithCompletion:^(RCCustomerInfo *i, NSError *e) {}]; [p checkTrialOrIntroDiscountEligibilityForProduct:storeProduct completion:^(RCIntroEligibilityStatus status) { }]; + [p checkTrialOrIntroDiscountEligibilityForPackage:pack completion:^(RCIntroEligibilityStatus status) { }]; [p checkTrialOrIntroDiscountEligibility:@[@""] completion:^(NSDictionary *d) { }]; [p getPromotionalOfferForProductDiscount:stpd withProduct:storeProduct diff --git a/Tests/APITesters/AllAPITests/SwiftAPITester/PurchasesAPI.swift b/Tests/APITesters/AllAPITests/SwiftAPITester/PurchasesAPI.swift index 7fa8c603c4..9afd300394 100644 --- a/Tests/APITesters/AllAPITests/SwiftAPITester/PurchasesAPI.swift +++ b/Tests/APITesters/AllAPITests/SwiftAPITester/PurchasesAPI.swift @@ -163,6 +163,8 @@ private func checkPurchasesPurchasingAPI(purchases: Purchases) { purchases.checkTrialOrIntroDiscountEligibility(productIdentifiers: [String]()) { (_: [String: IntroEligibility]) in } + purchases.checkTrialOrIntroDiscountEligibility(package: pack) { (_: IntroEligibilityStatus) in } + purchases.getPromotionalOffer( forProductDiscount: discount, product: storeProduct @@ -314,6 +316,7 @@ private func checkAsyncMethods(purchases: Purchases) async { do { let _: IntroEligibilityStatus = await purchases.checkTrialOrIntroDiscountEligibility(product: stp) + let _: IntroEligibilityStatus = await purchases.checkTrialOrIntroDiscountEligibility(package: pack) let _: [String: IntroEligibility] = await purchases.checkTrialOrIntroDiscountEligibility( productIdentifiers: [String]() ) diff --git a/Tests/BackendIntegrationTests/StoreKitIntegrationTests.swift b/Tests/BackendIntegrationTests/StoreKitIntegrationTests.swift index 3da5bacd30..c00084b240 100644 --- a/Tests/BackendIntegrationTests/StoreKitIntegrationTests.swift +++ b/Tests/BackendIntegrationTests/StoreKitIntegrationTests.swift @@ -628,6 +628,15 @@ class StoreKit1IntegrationTests: BaseStoreKitIntegrationTests { expect(eligibility) == .eligible } + func testEligibleForIntroBeforePurchaseForPackage() async throws { + try await self.verifyReceiptIsPresentBeforeEligibilityChecking() + + let package = try await self.monthlyPackage + + let eligibility = try await self.purchases.checkTrialOrIntroDiscountEligibility(package: package) + expect(eligibility) == .eligible + } + func testNoIntroOfferIfProductHasNoIntro() async throws { let product = try await XCTAsyncUnwrap(await self.monthlyNoIntroProduct) diff --git a/Tests/UnitTests/Mocks/MockPurchases.swift b/Tests/UnitTests/Mocks/MockPurchases.swift index 990000a771..f3c1f1752c 100644 --- a/Tests/UnitTests/Mocks/MockPurchases.swift +++ b/Tests/UnitTests/Mocks/MockPurchases.swift @@ -306,6 +306,17 @@ extension MockPurchases: PurchasesType { self.unimplemented() } + func checkTrialOrIntroDiscountEligibility( + package: Package, + completion: @escaping (IntroEligibilityStatus) -> Void + ) { + self.unimplemented() + } + + func checkTrialOrIntroDiscountEligibility(package: Package) async -> IntroEligibilityStatus { + self.unimplemented() + } + func getPromotionalOffer( forProductDiscount discount: StoreProductDiscount, product: StoreProduct, diff --git a/Tests/UnitTests/Purchasing/Purchases/PurchasesGetProductsTests.swift b/Tests/UnitTests/Purchasing/Purchases/PurchasesGetProductsTests.swift index daf3c957dd..6754331865 100644 --- a/Tests/UnitTests/Purchasing/Purchases/PurchasesGetProductsTests.swift +++ b/Tests/UnitTests/Purchasing/Purchases/PurchasesGetProductsTests.swift @@ -147,6 +147,46 @@ class PurchasesGetProductsTests: BasePurchasesTests { ) == true } + func testGetEligibilityForPackage() throws { + let package = Package(identifier: "package", + packageType: .monthly, + storeProduct: .init(sk1Product: MockSK1Product(mockProductIdentifier: "product1")), + offeringIdentifier: "offering", + webCheckoutUrl: nil) + + self.trialOrIntroPriceEligibilityChecker + .stubbedCheckTrialOrIntroPriceEligibilityFromOptimalStoreReceiveEligibilityResult = [ + "product1": .init(eligibilityStatus: .eligible) + ] + + let status = try XCTUnwrap(waitUntilValue { completed in + self.purchases.checkTrialOrIntroDiscountEligibility(package: package, completion: completed) + }) + + expect(status) == .eligible + expect(self.trialOrIntroPriceEligibilityChecker + .invokedCheckTrialOrIntroPriceEligibilityFromOptimalStoreParameters) == ["product1"] + } + + func testGetEligibilityForPackageAsync() async { + let package = Package(identifier: "package", + packageType: .monthly, + storeProduct: .init(sk1Product: MockSK1Product(mockProductIdentifier: "product1")), + offeringIdentifier: "offering", + webCheckoutUrl: nil) + + self.trialOrIntroPriceEligibilityChecker + .stubbedCheckTrialOrIntroPriceEligibilityFromOptimalStoreReceiveEligibilityResult = [ + "product1": .init(eligibilityStatus: .ineligible) + ] + + let status = await self.purchases.checkTrialOrIntroDiscountEligibility(package: package) + + expect(status) == .ineligible + expect(self.trialOrIntroPriceEligibilityChecker + .invokedCheckTrialOrIntroPriceEligibilityFromOptimalStoreParameters) == ["product1"] + } + func testGetEligibilityForPackages() async throws { let packages: [Package] = [ .init(identifier: "package1", diff --git a/api/revenuecat-api-ios-simulator.swiftinterface b/api/revenuecat-api-ios-simulator.swiftinterface index 4509ba6f65..4604be1395 100644 --- a/api/revenuecat-api-ios-simulator.swiftinterface +++ b/api/revenuecat-api-ios-simulator.swiftinterface @@ -2191,6 +2191,8 @@ extension RevenueCat.Purchases { final public func checkTrialOrIntroDiscountEligibility(packages: [RevenueCat.Package]) async -> [RevenueCat.Package : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @available(iOS 13.4, macCatalyst 13.4, *) @objc final public func showPriceConsentIfNeeded() @available(iOS 14.0, *) @@ -2384,6 +2386,8 @@ extension RevenueCat.PurchasesAreCompletedBy : Swift.Codable { @objc func checkTrialOrIntroDiscountEligibility(productIdentifiers: [Swift.String]) async -> [Swift.String : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] diff --git a/api/revenuecat-api-ios.swiftinterface b/api/revenuecat-api-ios.swiftinterface index 6fe957d40b..dab7c48db0 100644 --- a/api/revenuecat-api-ios.swiftinterface +++ b/api/revenuecat-api-ios.swiftinterface @@ -2191,6 +2191,8 @@ extension RevenueCat.Purchases { final public func checkTrialOrIntroDiscountEligibility(packages: [RevenueCat.Package]) async -> [RevenueCat.Package : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @available(iOS 13.4, macCatalyst 13.4, *) @objc final public func showPriceConsentIfNeeded() @available(iOS 14.0, *) @@ -2384,6 +2386,8 @@ extension RevenueCat.PurchasesAreCompletedBy : Swift.Codable { @objc func checkTrialOrIntroDiscountEligibility(productIdentifiers: [Swift.String]) async -> [Swift.String : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] diff --git a/api/revenuecat-api-macos.swiftinterface b/api/revenuecat-api-macos.swiftinterface index 29395a7a7f..a9e59d3229 100644 --- a/api/revenuecat-api-macos.swiftinterface +++ b/api/revenuecat-api-macos.swiftinterface @@ -2158,6 +2158,8 @@ extension RevenueCat.Purchases { final public func checkTrialOrIntroDiscountEligibility(packages: [RevenueCat.Package]) async -> [RevenueCat.Package : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) final public func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc final public func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc final public func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] @@ -2323,6 +2325,8 @@ extension RevenueCat.PurchasesAreCompletedBy : Swift.Codable { @objc func checkTrialOrIntroDiscountEligibility(productIdentifiers: [Swift.String]) async -> [Swift.String : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] diff --git a/api/revenuecat-api-tvos-simulator.swiftinterface b/api/revenuecat-api-tvos-simulator.swiftinterface index 5a96cefe51..ccced1f1f1 100644 --- a/api/revenuecat-api-tvos-simulator.swiftinterface +++ b/api/revenuecat-api-tvos-simulator.swiftinterface @@ -2158,6 +2158,8 @@ extension RevenueCat.Purchases { final public func checkTrialOrIntroDiscountEligibility(packages: [RevenueCat.Package]) async -> [RevenueCat.Package : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) final public func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc final public func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc final public func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] @@ -2315,6 +2317,8 @@ extension RevenueCat.PurchasesAreCompletedBy : Swift.Codable { @objc func checkTrialOrIntroDiscountEligibility(productIdentifiers: [Swift.String]) async -> [Swift.String : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] diff --git a/api/revenuecat-api-tvos.swiftinterface b/api/revenuecat-api-tvos.swiftinterface index 0822ef214b..801a7e8566 100644 --- a/api/revenuecat-api-tvos.swiftinterface +++ b/api/revenuecat-api-tvos.swiftinterface @@ -2158,6 +2158,8 @@ extension RevenueCat.Purchases { final public func checkTrialOrIntroDiscountEligibility(packages: [RevenueCat.Package]) async -> [RevenueCat.Package : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) final public func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc final public func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc final public func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] @@ -2315,6 +2317,8 @@ extension RevenueCat.PurchasesAreCompletedBy : Swift.Codable { @objc func checkTrialOrIntroDiscountEligibility(productIdentifiers: [Swift.String]) async -> [Swift.String : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] diff --git a/api/revenuecat-api-visionos-simulator.swiftinterface b/api/revenuecat-api-visionos-simulator.swiftinterface index de1e49bbca..294debd93c 100644 --- a/api/revenuecat-api-visionos-simulator.swiftinterface +++ b/api/revenuecat-api-visionos-simulator.swiftinterface @@ -2191,6 +2191,8 @@ extension RevenueCat.Purchases { final public func checkTrialOrIntroDiscountEligibility(packages: [RevenueCat.Package]) async -> [RevenueCat.Package : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @available(iOS 13.4, macCatalyst 13.4, *) @objc final public func showPriceConsentIfNeeded() @available(iOS 14.0, *) @@ -2384,6 +2386,8 @@ extension RevenueCat.PurchasesAreCompletedBy : Swift.Codable { @objc func checkTrialOrIntroDiscountEligibility(productIdentifiers: [Swift.String]) async -> [Swift.String : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] diff --git a/api/revenuecat-api-visionos.swiftinterface b/api/revenuecat-api-visionos.swiftinterface index 556032b4d4..4c5061fb12 100644 --- a/api/revenuecat-api-visionos.swiftinterface +++ b/api/revenuecat-api-visionos.swiftinterface @@ -2191,6 +2191,8 @@ extension RevenueCat.Purchases { final public func checkTrialOrIntroDiscountEligibility(packages: [RevenueCat.Package]) async -> [RevenueCat.Package : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @available(iOS 13.4, macCatalyst 13.4, *) @objc final public func showPriceConsentIfNeeded() @available(iOS 14.0, *) @@ -2384,6 +2386,8 @@ extension RevenueCat.PurchasesAreCompletedBy : Swift.Codable { @objc func checkTrialOrIntroDiscountEligibility(productIdentifiers: [Swift.String]) async -> [Swift.String : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] diff --git a/api/revenuecat-api-watchos-simulator.swiftinterface b/api/revenuecat-api-watchos-simulator.swiftinterface index cdc966dc35..feb4533265 100644 --- a/api/revenuecat-api-watchos-simulator.swiftinterface +++ b/api/revenuecat-api-watchos-simulator.swiftinterface @@ -2159,6 +2159,8 @@ extension RevenueCat.Purchases { final public func checkTrialOrIntroDiscountEligibility(packages: [RevenueCat.Package]) async -> [RevenueCat.Package : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) final public func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc final public func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc final public func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] @@ -2316,6 +2318,8 @@ extension RevenueCat.PurchasesAreCompletedBy : Swift.Codable { @objc func checkTrialOrIntroDiscountEligibility(productIdentifiers: [Swift.String]) async -> [Swift.String : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] diff --git a/api/revenuecat-api-watchos.swiftinterface b/api/revenuecat-api-watchos.swiftinterface index efb31c23e9..d6930a552d 100644 --- a/api/revenuecat-api-watchos.swiftinterface +++ b/api/revenuecat-api-watchos.swiftinterface @@ -2159,6 +2159,8 @@ extension RevenueCat.Purchases { final public func checkTrialOrIntroDiscountEligibility(packages: [RevenueCat.Package]) async -> [RevenueCat.Package : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc final public func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc final public func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) final public func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc final public func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc final public func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer] @@ -2316,6 +2318,8 @@ extension RevenueCat.PurchasesAreCompletedBy : Swift.Codable { @objc func checkTrialOrIntroDiscountEligibility(productIdentifiers: [Swift.String]) async -> [Swift.String : RevenueCat.IntroEligibility] @objc(checkTrialOrIntroDiscountEligibilityForProduct:completion:) func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) @objc func checkTrialOrIntroDiscountEligibility(product: RevenueCat.StoreProduct) async -> RevenueCat.IntroEligibilityStatus + @objc(checkTrialOrIntroDiscountEligibilityForPackage:completion:) func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package, completion: @escaping (RevenueCat.IntroEligibilityStatus) -> Swift.Void) + @objc func checkTrialOrIntroDiscountEligibility(package: RevenueCat.Package) async -> RevenueCat.IntroEligibilityStatus @objc(getPromotionalOfferForProductDiscount:withProduct:withCompletion:) func getPromotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct, completion: @escaping (RevenueCat.PromotionalOffer?, RevenueCat.PublicError?) -> Swift.Void) @objc func promotionalOffer(forProductDiscount discount: RevenueCat.StoreProductDiscount, product: RevenueCat.StoreProduct) async throws -> RevenueCat.PromotionalOffer @objc func eligiblePromotionalOffers(forProduct product: RevenueCat.StoreProduct) async -> [RevenueCat.PromotionalOffer]