From 3174a44599b60557257808d6a26dab618e233397 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Wed, 23 Aug 2023 12:13:08 -0700 Subject: [PATCH] `Configuration`: added `observerMode` overload that allows configuring SK2 setting See also https://github.com/RevenueCat/revenuecat-docs/pull/299. Since #3032 developers using observer mode need to configure the SDK with the correct StoreKit 2 setting. This new API makes that explicit, while leaving `with(usesStoreKit2IfAvailable:)` still deprecated. --- Sources/Purchasing/Configuration.swift | 14 +++++++++ .../ObjCAPITester/RCConfigurationAPI.m | 21 +++++++------- .../SwiftAPITester/ConfigurationAPI.swift | 1 + .../Purchasing/ConfigurationTests.swift | 29 +++++++++++++++++++ 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/Sources/Purchasing/Configuration.swift b/Sources/Purchasing/Configuration.swift index c84326c29e..1db7a367c8 100644 --- a/Sources/Purchasing/Configuration.swift +++ b/Sources/Purchasing/Configuration.swift @@ -129,9 +129,23 @@ import Foundation * Set `observerMode`. * - Parameter observerMode: Set this to `true` if you have your own IAP implementation and want to use only * RevenueCat's backend. Default is `false`. + * + * - Note: This assumes your IAP implementation uses StoreKit 1. + * If you use StoreKit 2, use ``with(observerMode:storeKit2:)`` instead. */ @objc public func with(observerMode: Bool) -> Builder { + return self.with(observerMode: observerMode, storeKit2: false) + } + + /** + * Set `observerMode` with a corresponding `StoreKit 2` setting. + * - Parameter observerMode: Set this to `true` if you have your own IAP implementation and want to use only + * RevenueCat's backend. Default is `false`. + * - Parameter storeKit2: Set this to `true` if your own IAP implementation uses StoreKit 2. Default is `false`. + */ + @objc public func with(observerMode: Bool, storeKit2: Bool) -> Builder { self.observerMode = observerMode + self.storeKit2Setting = .init(useStoreKit2IfAvailable: storeKit2) return self } diff --git a/Tests/APITesters/ObjCAPITester/ObjCAPITester/RCConfigurationAPI.m b/Tests/APITesters/ObjCAPITester/ObjCAPITester/RCConfigurationAPI.m index 266b44212a..4e787350f8 100644 --- a/Tests/APITesters/ObjCAPITester/ObjCAPITester/RCConfigurationAPI.m +++ b/Tests/APITesters/ObjCAPITester/ObjCAPITester/RCConfigurationAPI.m @@ -13,16 +13,17 @@ @implementation RCConfigurationAPI + (void)checkAPI { RCConfigurationBuilder *builder = [RCConfiguration builderWithAPIKey:@""]; - RCConfiguration *config __unused = [[[[[[[[[[[builder withApiKey:@""] - withObserverMode:false] - withUserDefaults:NSUserDefaults.standardUserDefaults] - withAppUserID:@""] - withAppUserID:nil] - withDangerousSettings:[[RCDangerousSettings alloc] init]] - withNetworkTimeout:1] - withStoreKit1Timeout: 1] - withPlatformInfo:[[RCPlatformInfo alloc] initWithFlavor:@"" version:@""]] - withUsesStoreKit2IfAvailable:false] build]; + RCConfiguration *config __unused = [[[[[[[[[[[[builder withApiKey:@""] + withObserverMode:false] + withObserverMode:true storeKit2:true] + withUserDefaults:NSUserDefaults.standardUserDefaults] + withAppUserID:@""] + withAppUserID:nil] + withDangerousSettings:[[RCDangerousSettings alloc] init]] + withNetworkTimeout:1] + withStoreKit1Timeout: 1] + withPlatformInfo:[[RCPlatformInfo alloc] initWithFlavor:@"" version:@""]] + withUsesStoreKit2IfAvailable:false] build]; if (@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.2, *)) { RCConfiguration *config __unused = [[builder diff --git a/Tests/APITesters/SwiftAPITester/SwiftAPITester/ConfigurationAPI.swift b/Tests/APITesters/SwiftAPITester/SwiftAPITester/ConfigurationAPI.swift index ff9e6c6073..93b01919a6 100644 --- a/Tests/APITesters/SwiftAPITester/SwiftAPITester/ConfigurationAPI.swift +++ b/Tests/APITesters/SwiftAPITester/SwiftAPITester/ConfigurationAPI.swift @@ -15,6 +15,7 @@ func checkConfigurationAPI() { .with(appUserID: "") .with(appUserID: nil) .with(observerMode: false) + .with(observerMode: false, storeKit2: true) .with(userDefaults: UserDefaults.standard) .with(dangerousSettings: DangerousSettings()) .with(dangerousSettings: DangerousSettings(autoSyncPurchases: true)) diff --git a/Tests/UnitTests/Purchasing/ConfigurationTests.swift b/Tests/UnitTests/Purchasing/ConfigurationTests.swift index da006c2e20..6d57fff781 100644 --- a/Tests/UnitTests/Purchasing/ConfigurationTests.swift +++ b/Tests/UnitTests/Purchasing/ConfigurationTests.swift @@ -31,4 +31,33 @@ class ConfigurationTests: TestCase { expect(Configuration.validate(apiKey: "swRTCezdEzjnJSxdexDNJfcfiFrMXwqZ")) == .legacy } + func testObserverModeDefaultsToStoreKit1() { + let observerMode = Bool.random() + + let configuration = Configuration.Builder(withAPIKey: "test") + .with(observerMode: observerMode) + .build() + + expect(configuration.observerMode) == observerMode + expect(configuration.storeKit2Setting) == .enabledOnlyForOptimizations + } + + func testObserverModeWithStoreKit2Disabled() { + let configuration = Configuration.Builder(withAPIKey: "test") + .with(observerMode: true, storeKit2: false) + .build() + + expect(configuration.observerMode) == true + expect(configuration.storeKit2Setting) == .enabledOnlyForOptimizations + } + + func testObserverModeWithStoreKit2Enabled() { + let configuration = Configuration.Builder(withAPIKey: "test") + .with(observerMode: true, storeKit2: true) + .build() + + expect(configuration.observerMode) == true + expect(configuration.storeKit2Setting) == .enabledForCompatibleDevices + } + }