diff --git a/Kickstarter-iOS/AppDelegate.swift b/Kickstarter-iOS/AppDelegate.swift index 38a5eefe3d..5c354f52e4 100644 --- a/Kickstarter-iOS/AppDelegate.swift +++ b/Kickstarter-iOS/AppDelegate.swift @@ -433,14 +433,22 @@ internal final class AppDelegate: UIResponder, UIApplicationDelegate { AppEnvironment.updateRemoteConfigClient(remoteConfigClient) - let appDefaults: [String: Any?] = [ - RemoteConfigFeature.consentManagementDialogEnabled.rawValue: false, - RemoteConfigFeature.facebookLoginInterstitialEnabled.rawValue: false - ] + self.fetchAndActivateRemoteConfig() - AppEnvironment.current.remoteConfigClient?.setDefaults(appDefaults as? [String: NSObject]) + _ = AppEnvironment.current.remoteConfigClient? + .addOnConfigUpdateListener { configUpdate, error in + guard let realtimeUpdateError = error else { + print("🔮 Remote Config Keys Update: \(configUpdate?.updatedKeys)") - AppEnvironment.current.remoteConfigClient?.activate { _, error in + return + } + + print("🔴 Remote Config SDK Config Update Listener Failure: \(realtimeUpdateError.localizedDescription)") + } + } + + private func fetchAndActivateRemoteConfig() { + AppEnvironment.current.remoteConfigClient?.fetchAndActivate { _, error in guard let remoteConfigActivationError = error else { print("🔮 Remote Config SDK Successfully Activated") @@ -454,18 +462,6 @@ internal final class AppDelegate: UIResponder, UIApplicationDelegate { self.viewModel.inputs.remoteConfigClientConfigurationFailed() } - - AppEnvironment.current.remoteConfigClient?.fetch { _, _ in } - - _ = AppEnvironment.current.remoteConfigClient?.addOnConfigUpdateListener { _, error in - guard let realtimeUpdateError = error else { - print("🔮 Remote Config Key/Value Pair Updated") - - return - } - - print("🔴 Remote Config SDK Config Update Listener Failure: \(realtimeUpdateError.localizedDescription)") - } } } diff --git a/Kickstarter.xcodeproj/project.pbxproj b/Kickstarter.xcodeproj/project.pbxproj index b89f1018da..70c56048cb 100644 --- a/Kickstarter.xcodeproj/project.pbxproj +++ b/Kickstarter.xcodeproj/project.pbxproj @@ -249,6 +249,7 @@ 194520C5288859A600CA9B88 /* PaymentCardTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194520C4288859A600CA9B88 /* PaymentCardTextField.swift */; }; 19462F6A29D4892300868694 /* ChangeEmailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191A2C702907350A0093B6E1 /* ChangeEmailView.swift */; }; 19462F6B29D4893500868694 /* ChangeEmailViewModelSwiftUIIntegrationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 706656D629C7E72B00BAE7D4 /* ChangeEmailViewModelSwiftUIIntegrationTest.swift */; }; + 194A8E4E2A13FB010099583B /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 194A8E4D2A13FB010099583B /* GoogleService-Info.plist */; }; 194A9C3D29E3505A00D7C4BF /* MockOptimizelyClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 774D98DB23B1520D00FC81C2 /* MockOptimizelyClient.swift */; }; 1965436D28C807FB00457EC6 /* PledgePaymentMethodsViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192016C728B6731A0046919B /* PledgePaymentMethodsViewControllerTests.swift */; }; 1965437428C811B000457EC6 /* ProjectNotificationsViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77F6E764212355C3005A5C55 /* ProjectNotificationsViewControllerTests.swift */; }; @@ -378,7 +379,6 @@ 473DE01A273C757D0033331D /* ProjectRisksDisclaimerCellViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 473DE019273C757D0033331D /* ProjectRisksDisclaimerCellViewModelTests.swift */; }; 4746FFF3272C564C00EC3429 /* ProjectEnvironmentalCommitmentCellViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4746FFF2272C564C00EC3429 /* ProjectEnvironmentalCommitmentCellViewModelTests.swift */; }; 4746FFF5272C588900EC3429 /* ProjectEnvironmentalCommitmentDisclaimerCellViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4746FFF4272C588900EC3429 /* ProjectEnvironmentalCommitmentDisclaimerCellViewModelTests.swift */; }; - 4748C17C25B79DA20098E89E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4748C17B25B79DA20098E89E /* GoogleService-Info.plist */; }; 474D732026B46412000F63DC /* ErroredBackingsEnvelopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474D731F26B46412000F63DC /* ErroredBackingsEnvelopeTests.swift */; }; 4751A675272B317500F81DD5 /* ProjectEnvironmentalCommitmentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751A674272B317500F81DD5 /* ProjectEnvironmentalCommitmentCell.swift */; }; 4751A677272B31D000F81DD5 /* ProjectEnvironmentalCommitmentCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751A676272B31D000F81DD5 /* ProjectEnvironmentalCommitmentCellViewModel.swift */; }; @@ -1844,6 +1844,7 @@ 194154D228D928C9004648C8 /* CreatePaymentSourceSetupIntentInputTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatePaymentSourceSetupIntentInputTests.swift; sourceTree = ""; }; 194154D428D92A26004648C8 /* CreatePaymentSourceSetupIntentClientSecret+ConstructorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CreatePaymentSourceSetupIntentClientSecret+ConstructorTests.swift"; sourceTree = ""; }; 194520C4288859A600CA9B88 /* PaymentCardTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentCardTextField.swift; sourceTree = ""; }; + 194A8E4D2A13FB010099583B /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Frameworks/native-secrets/ios/Firebase-Alpha/GoogleService-Info.plist"; sourceTree = ""; }; 19A666602A0472A500708F8B /* RemoteConfligClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteConfligClient.swift; sourceTree = ""; }; 19A97CF128C7E2D30031B857 /* CategoryPillCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CategoryPillCell.swift; sourceTree = ""; }; 19C8E56829A9249D007C3504 /* TextInputFieldModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextInputFieldModifiers.swift; sourceTree = ""; }; @@ -1959,7 +1960,6 @@ 473DE019273C757D0033331D /* ProjectRisksDisclaimerCellViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectRisksDisclaimerCellViewModelTests.swift; sourceTree = ""; }; 4746FFF2272C564C00EC3429 /* ProjectEnvironmentalCommitmentCellViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectEnvironmentalCommitmentCellViewModelTests.swift; sourceTree = ""; }; 4746FFF4272C588900EC3429 /* ProjectEnvironmentalCommitmentDisclaimerCellViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectEnvironmentalCommitmentDisclaimerCellViewModelTests.swift; sourceTree = ""; }; - 4748C17B25B79DA20098E89E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Frameworks/native-secrets/ios/Firebase-Alpha/GoogleService-Info.plist"; sourceTree = ""; }; 474D731F26B46412000F63DC /* ErroredBackingsEnvelopeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErroredBackingsEnvelopeTests.swift; sourceTree = ""; }; 4751A674272B317500F81DD5 /* ProjectEnvironmentalCommitmentCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectEnvironmentalCommitmentCell.swift; sourceTree = ""; }; 4751A676272B31D000F81DD5 /* ProjectEnvironmentalCommitmentCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectEnvironmentalCommitmentCellViewModel.swift; sourceTree = ""; }; @@ -5901,7 +5901,7 @@ 8A86D7F224FED01C00037A7B /* GoogleService-Info.plist */, 8A86D7F424FED02A00037A7B /* GoogleService-Info.plist */, 8A65E79D2501AE89006F81CC /* GoogleService-Info.plist */, - 4748C17B25B79DA20098E89E /* GoogleService-Info.plist */, + 194A8E4D2A13FB010099583B /* GoogleService-Info.plist */, D0158A511EEB3730006E7684 /* Secrets.swift */, 802800571C88F64D00141235 /* Base.xcconfig */, ); @@ -7530,12 +7530,12 @@ buildActionMask = 2147483647; files = ( 9D50E9471D2EDBE50096DAEC /* Assets.xcassets in Resources */, - 4748C17C25B79DA20098E89E /* GoogleService-Info.plist in Resources */, 8A65E79E2501AE89006F81CC /* GoogleService-Info.plist in Resources */, 01F219561DC12BF7005DD2E4 /* LaunchScreen.storyboard in Resources */, A73924051D27247E004524C3 /* Main.storyboard in Resources */, 8A86D7F324FED01D00037A7B /* GoogleService-Info.plist in Resources */, 8A86D7F524FED02A00037A7B /* GoogleService-Info.plist in Resources */, + 194A8E4E2A13FB010099583B /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Library/MockRemoteConfigClient.swift b/Library/MockRemoteConfigClient.swift index 6392259b0a..1226dc2f9a 100644 --- a/Library/MockRemoteConfigClient.swift +++ b/Library/MockRemoteConfigClient.swift @@ -6,6 +6,9 @@ private class MockRemoteConfigValue: RemoteConfigValue { } public class MockRemoteConfigClient: RemoteConfigClientType { + public func fetchAndActivate(completionHandler _: ((RemoteConfigFetchAndActivateStatus, Error?) + -> Void)?) {} + public var features: [String: Bool] public init() { diff --git a/Library/RemoteConfig/RemoteConfigClientType.swift b/Library/RemoteConfig/RemoteConfigClientType.swift index fc38478b11..637d420378 100644 --- a/Library/RemoteConfig/RemoteConfigClientType.swift +++ b/Library/RemoteConfig/RemoteConfigClientType.swift @@ -4,6 +4,7 @@ import Foundation public protocol RemoteConfigClientType: AnyObject { func activate(completion: ((Bool, Error?) -> Void)?) func fetch(completionHandler: ((RemoteConfigFetchStatus, Error?) -> Void)?) + func fetchAndActivate(completionHandler: ((RemoteConfigFetchAndActivateStatus, Error?) -> Void)?) func setDefaults(_ defaults: [String: NSObject]?) func addOnConfigUpdateListener(remoteConfigUpdateCompletion listener: @escaping ( RemoteConfigUpdate?, diff --git a/Library/RemoteConfig/RemoteConfligClient.swift b/Library/RemoteConfig/RemoteConfligClient.swift index 09f8970e3e..9b21a38117 100644 --- a/Library/RemoteConfig/RemoteConfligClient.swift +++ b/Library/RemoteConfig/RemoteConfligClient.swift @@ -1,6 +1,10 @@ import FirebaseRemoteConfig public class RemoteConfigClient: RemoteConfigClientType { + public func fetchAndActivate(completionHandler: ((RemoteConfigFetchAndActivateStatus, Error?) -> Void)?) { + self.sharedClient.fetchAndActivate(completionHandler: completionHandler) + } + private var sharedClient: RemoteConfig public init(with client: RemoteConfig) { diff --git a/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModel.swift b/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModel.swift index eaf961e726..00e6d5e694 100644 --- a/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModel.swift +++ b/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModel.swift @@ -38,7 +38,7 @@ public final class RemoteConfigFeatureFlagToolsViewModel: RemoteConfigFeatureFla let remoteConfigFeatures = features .map { features in features.map { feature -> (RemoteConfigFeature, Bool) in - (feature, AppEnvironment.current.remoteConfigClient?.isFeatureEnabled(featureKey: feature) ?? false) + (feature, isFeatureEnabled(feature)) } } @@ -83,6 +83,15 @@ public final class RemoteConfigFeatureFlagToolsViewModel: RemoteConfigFeatureFla // MARK: - Private Helpers +private func isFeatureEnabled(_ feature: RemoteConfigFeature) -> Bool { + switch feature { + case .consentManagementDialogEnabled: + return featureConsentManagementDialogEnabled() + case .facebookLoginInterstitialEnabled: + return featureFacebookLoginInterstitialEnabled() + } +} + /** Returns the value of the User Defaults key in the AppEnvironment. */ private func getValueFromUserDefaults(for feature: RemoteConfigFeature) -> Bool? {