From 4fd073cca945a7eda22b1063ef44d341c8da50ad Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Thu, 14 Sep 2023 12:16:45 -0700 Subject: [PATCH] Changed approach to discourage with a warning log --- .../Logging/Strings/ConfigureStrings.swift | 4 ++ Sources/Misc/StoreKit2Setting.swift | 9 ----- Sources/Purchasing/Configuration.swift | 37 +++++-------------- Sources/Purchasing/Purchases/Purchases.swift | 4 +- .../SwiftAPITester/ConfigurationAPI.swift | 2 - .../ObjCAPITester/RCConfigurationAPI.m | 13 +------ .../SwiftAPITester/ConfigurationAPI.swift | 10 ----- .../Misc/StoreKit2SettingTests.swift | 8 ---- .../Purchasing/ConfigurationTests.swift | 32 ++++++++++++---- .../Purchases/PurchasesConfiguringTests.swift | 2 +- 10 files changed, 42 insertions(+), 79 deletions(-) diff --git a/Sources/Logging/Strings/ConfigureStrings.swift b/Sources/Logging/Strings/ConfigureStrings.swift index c3ec5b426a..7a0e25167c 100644 --- a/Sources/Logging/Strings/ConfigureStrings.swift +++ b/Sources/Logging/Strings/ConfigureStrings.swift @@ -33,6 +33,8 @@ enum ConfigureStrings { case observer_mode_enabled + case observer_mode_with_storekit2 + case response_verification_mode(Signing.ResponseVerificationMode) case delegate_set @@ -98,6 +100,8 @@ extension ConfigureStrings: LogMessage { return "StoreKit 2 support enabled" case .observer_mode_enabled: return "Purchases is configured in observer mode" + case .observer_mode_with_storekit2: + return "Observer mode is not currently compatible with StoreKit 2" case let .response_verification_mode(mode): switch mode { case .disabled: diff --git a/Sources/Misc/StoreKit2Setting.swift b/Sources/Misc/StoreKit2Setting.swift index dbfe111673..8025adbded 100644 --- a/Sources/Misc/StoreKit2Setting.swift +++ b/Sources/Misc/StoreKit2Setting.swift @@ -34,15 +34,6 @@ extension StoreKit2Setting { : .enabledOnlyForOptimizations } - init(version: Configuration.StoreKitVersion) { - switch version { - case .storeKit1: - self = .enabledOnlyForOptimizations - case .storeKit2: - self = .enabledForCompatibleDevices - } - } - static let `default`: Self = .enabledOnlyForOptimizations } diff --git a/Sources/Purchasing/Configuration.swift b/Sources/Purchasing/Configuration.swift index 93e5e62589..6bc9414b81 100644 --- a/Sources/Purchasing/Configuration.swift +++ b/Sources/Purchasing/Configuration.swift @@ -37,17 +37,6 @@ import Foundation */ @objc(RCConfiguration) public final class Configuration: NSObject { - /// The StoreKit version that the SDK is setup with. - @objc(RCConfigurationStoreKitVersion) - public enum StoreKitVersion: Int { - - // swiftlint:disable missing_docs - case storeKit1 = 1 - case storeKit2 = 2 - // swiftlint:enable missing_docs - - } - static let storeKitRequestTimeoutDefault: TimeInterval = 30 static let networkTimeoutDefault: TimeInterval = 60 @@ -64,6 +53,8 @@ import Foundation private init(with builder: Builder) { Self.verify(apiKey: builder.apiKey) + Self.verify(observerMode: builder.observerMode, + storeKit2Setting: builder.storeKit2Setting) self.apiKey = builder.apiKey self.appUserID = builder.appUserID @@ -142,28 +133,12 @@ import Foundation * RevenueCat's backend. Default is `false`. * * - Warning: This assumes your IAP implementation uses StoreKit 1. - * If you use StoreKit 2, use ``with(observerMode:storeKitVersion:)`` instead. + * Observer mode is not compatible with StoreKit 2. */ @objc public func with(observerMode: Bool) -> Configuration.Builder { - return self.with(observerMode: observerMode, storeKitVersion: .storeKit1) - } - - /** - * Set `observerMode` with a corresponding `StoreKit` implementation. - * - 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 storeKitVersion: Set this to the StoreKit implementation your app uses for purchases. - * I.e.: if your app uses `StoreKit 1`, set it to ``Configuration/StoreKitVersion/storeKit1`` - * and if your app uses `StoreKit 2`, set it to ``Configuration/StoreKitVersion/storeKit2``. - * Apps using `StoreKit 1` use `SKPaymentQueue` for transactions, - * whereas `StoreKit 2` uses `StoreKit.Product.Purchase`. - */ - @objc public func with(observerMode: Bool, storeKitVersion: StoreKitVersion) -> Builder { self.observerMode = observerMode - self.storeKit2Setting = .init(version: storeKitVersion) return self } - /** * Set `userDefaults`. * - Parameter userDefaults: Custom `UserDefaults` to use @@ -318,6 +293,12 @@ extension Configuration { } } + fileprivate static func verify(observerMode: Bool, storeKit2Setting: StoreKit2Setting) { + if observerMode, storeKit2Setting.usesStoreKit2IfAvailable { + Logger.warn(Strings.configure.observer_mode_with_storekit2) + } + } + private static let applePlatformKeyPrefix: String = "appl_" } diff --git a/Sources/Purchasing/Purchases/Purchases.swift b/Sources/Purchasing/Purchases/Purchases.swift index af58b09d8f..1859d4191f 100644 --- a/Sources/Purchasing/Purchases/Purchases.swift +++ b/Sources/Purchasing/Purchases/Purchases.swift @@ -1139,8 +1139,8 @@ public extension Purchases { * * - Returns: An instantiated ``Purchases`` object that has been set as a singleton. * - * - Note: This assumes your IAP implementation uses StoreKit 1. - * If you use StoreKit 2, use ``Configuration/Builder/with(observerMode:storeKitVersion:)`` instead. + * - Warning: This assumes your IAP implementation uses StoreKit 1. + * Observer mode is not compatible with StoreKit 2. */ @objc(configureWithAPIKey:appUserID:observerMode:) @discardableResult static func configure(withAPIKey apiKey: String, diff --git a/Tests/APITesters/CustomEntitlementComputationSwiftAPITester/SwiftAPITester/ConfigurationAPI.swift b/Tests/APITesters/CustomEntitlementComputationSwiftAPITester/SwiftAPITester/ConfigurationAPI.swift index fc4fca3544..6ec40d9ea0 100644 --- a/Tests/APITesters/CustomEntitlementComputationSwiftAPITester/SwiftAPITester/ConfigurationAPI.swift +++ b/Tests/APITesters/CustomEntitlementComputationSwiftAPITester/SwiftAPITester/ConfigurationAPI.swift @@ -15,14 +15,12 @@ func checkConfigurationAPI() { .with(appUserID: "") .with(appUserID: nil) .with(observerMode: false) - .with(observerMode: false, storeKitVersion: .storeKit1) .with(userDefaults: UserDefaults.standard) .with(dangerousSettings: DangerousSettings()) .with(dangerousSettings: DangerousSettings(autoSyncPurchases: true)) .with(networkTimeout: 1) .with(storeKit1Timeout: 1) .with(platformInfo: Purchases.PlatformInfo(flavor: "", version: "")) - // Trusted Entitlements: internal until ready to be made public. // .with(entitlementVerificationMode: .informational) .build() diff --git a/Tests/APITesters/ObjCAPITester/ObjCAPITester/RCConfigurationAPI.m b/Tests/APITesters/ObjCAPITester/ObjCAPITester/RCConfigurationAPI.m index 793050a496..d2710181c3 100644 --- a/Tests/APITesters/ObjCAPITester/ObjCAPITester/RCConfigurationAPI.m +++ b/Tests/APITesters/ObjCAPITester/ObjCAPITester/RCConfigurationAPI.m @@ -13,9 +13,8 @@ @implementation RCConfigurationAPI + (void)checkAPI { RCConfigurationBuilder *builder = [RCConfiguration builderWithAPIKey:@""]; - RCConfiguration *config __unused = [[[[[[[[[[[[builder withApiKey:@""] - withObserverMode:false] - withObserverMode:true storeKitVersion:RCConfigurationStoreKitVersionStoreKit1] + RCConfiguration *config __unused = [[[[[[[[[[[builder withApiKey:@""] + withObserverMode:false] withUserDefaults:NSUserDefaults.standardUserDefaults] withAppUserID:@""] withAppUserID:nil] @@ -32,12 +31,4 @@ + (void)checkAPI { } } -+ (void)checkStoreKitVersion:(RCConfigurationStoreKitVersion)version { - switch (version) { - case RCConfigurationStoreKitVersionStoreKit1: - case RCConfigurationStoreKitVersionStoreKit2: - break; - } -} - @end diff --git a/Tests/APITesters/SwiftAPITester/SwiftAPITester/ConfigurationAPI.swift b/Tests/APITesters/SwiftAPITester/SwiftAPITester/ConfigurationAPI.swift index 3b1711e755..95b52f4457 100644 --- a/Tests/APITesters/SwiftAPITester/SwiftAPITester/ConfigurationAPI.swift +++ b/Tests/APITesters/SwiftAPITester/SwiftAPITester/ConfigurationAPI.swift @@ -15,8 +15,6 @@ func checkConfigurationAPI() { .with(appUserID: "") .with(appUserID: nil) .with(observerMode: true) - .with(observerMode: false, storeKitVersion: .storeKit1) - .with(observerMode: true, storeKitVersion: .storeKit2) .with(userDefaults: UserDefaults.standard) .with(dangerousSettings: DangerousSettings()) .with(dangerousSettings: DangerousSettings(autoSyncPurchases: true)) @@ -33,14 +31,6 @@ func checkConfigurationAPI() { } } -func checkStoreKitVersion(_ version: Configuration.StoreKitVersion) { - switch version { - case .storeKit1: break - case .storeKit2: break - @unknown default: break - } -} - @available(*, deprecated) func checkDeprecatedConfiguration(_ builder: Configuration.Builder) { _ = builder diff --git a/Tests/UnitTests/Misc/StoreKit2SettingTests.swift b/Tests/UnitTests/Misc/StoreKit2SettingTests.swift index d43bdd6b39..7382d3b179 100644 --- a/Tests/UnitTests/Misc/StoreKit2SettingTests.swift +++ b/Tests/UnitTests/Misc/StoreKit2SettingTests.swift @@ -28,14 +28,6 @@ class StoreKit2SettingTests: TestCase { expect(StoreKit2Setting(useStoreKit2IfAvailable: false).usesStoreKit2IfAvailable) == false } - func testInitWithStoreKit1() { - expect(StoreKit2Setting(version: .storeKit1)) == .enabledOnlyForOptimizations - } - - func testInitWithStoreKit2() { - expect(StoreKit2Setting(version: .storeKit2)) == .enabledForCompatibleDevices - } - func testStoreKit2NotAvailableWhenDisabled() { expect(StoreKit2Setting.disabled.shouldOnlyUseStoreKit2) == false } diff --git a/Tests/UnitTests/Purchasing/ConfigurationTests.swift b/Tests/UnitTests/Purchasing/ConfigurationTests.swift index 4ae9b4d642..ba51cf70ad 100644 --- a/Tests/UnitTests/Purchasing/ConfigurationTests.swift +++ b/Tests/UnitTests/Purchasing/ConfigurationTests.swift @@ -31,34 +31,50 @@ class ConfigurationTests: TestCase { expect(Configuration.validate(apiKey: "swRTCezdEzjnJSxdexDNJfcfiFrMXwqZ")) == .legacy } - @available(*, deprecated) - func testObserverModeDefaultsToStoreKit1() { - let observerMode = Bool.random() + func testNoObserverModeWithStoreKit1() { + let configuration = Configuration.Builder(withAPIKey: "test").build() + + expect(configuration.observerMode) == false + expect(configuration.storeKit2Setting) == .enabledOnlyForOptimizations + self.logger.verifyMessageWasNotLogged(Strings.configure.observer_mode_with_storekit2) + } + + @available(*, deprecated) + func testNoObserverModeWithStoreKit2() { let configuration = Configuration.Builder(withAPIKey: "test") - .with(observerMode: observerMode) + .with(usesStoreKit2IfAvailable: true) .build() - expect(configuration.observerMode) == observerMode - expect(configuration.storeKit2Setting) == .enabledOnlyForOptimizations + expect(configuration.observerMode) == false + expect(configuration.storeKit2Setting) == .enabledForCompatibleDevices + + self.logger.verifyMessageWasNotLogged(Strings.configure.observer_mode_with_storekit2) } func testObserverModeWithStoreKit1() { let configuration = Configuration.Builder(withAPIKey: "test") - .with(observerMode: true, storeKitVersion: .storeKit1) + .with(observerMode: true) .build() expect(configuration.observerMode) == true expect(configuration.storeKit2Setting) == .enabledOnlyForOptimizations + + self.logger.verifyMessageWasNotLogged(Strings.configure.observer_mode_with_storekit2) } + @available(*, deprecated) func testObserverModeWithStoreKit2() { let configuration = Configuration.Builder(withAPIKey: "test") - .with(observerMode: true, storeKitVersion: .storeKit2) + .with(observerMode: true) + .with(usesStoreKit2IfAvailable: true) .build() expect(configuration.observerMode) == true expect(configuration.storeKit2Setting) == .enabledForCompatibleDevices + + self.logger.verifyMessageWasLogged(Strings.configure.observer_mode_with_storekit2, + level: .warn) } } diff --git a/Tests/UnitTests/Purchasing/Purchases/PurchasesConfiguringTests.swift b/Tests/UnitTests/Purchasing/Purchases/PurchasesConfiguringTests.swift index 6b64644a1a..e0ac94301d 100644 --- a/Tests/UnitTests/Purchasing/Purchases/PurchasesConfiguringTests.swift +++ b/Tests/UnitTests/Purchasing/Purchases/PurchasesConfiguringTests.swift @@ -519,7 +519,7 @@ class PurchasesConfiguringTests: BasePurchasesTests { private static func create(observerMode: Bool) -> Purchases { return Purchases.configure( with: .init(withAPIKey: "") - .with(observerMode: observerMode, storeKitVersion: .storeKit1) + .with(observerMode: observerMode) ) }