diff --git a/AmplitudeInjections/AmplitudeInjections/_Tracking/AmplitudeTracking.swift b/AmplitudeInjections/AmplitudeInjections/_Tracking/AmplitudeTracking.swift index 57b2ab7c..baa3b699 100644 --- a/AmplitudeInjections/AmplitudeInjections/_Tracking/AmplitudeTracking.swift +++ b/AmplitudeInjections/AmplitudeInjections/_Tracking/AmplitudeTracking.swift @@ -15,6 +15,7 @@ open class AmplitudeTracking: TransformerTracker { public init(_ apiKey: String) { self.amplitude = Amplitude.init(configuration: .init(apiKey: apiKey)) + Console.shared.log("analytics log | Amplitude initialized") super.init() } diff --git a/Shared/CommonAppDelegate.swift b/Shared/CommonAppDelegate.swift index a8770617..44110a8d 100644 --- a/Shared/CommonAppDelegate.swift +++ b/Shared/CommonAppDelegate.swift @@ -46,11 +46,11 @@ open class CommonAppDelegate: ParticlesAppDelegate { override open func injectFeatures(completion: @escaping () -> Void) { Console.shared.log("injectFeatures") - // these three injections need to happen before app start - injectStatsigApiKey() - injectFirebase() - injectRating() - injectAmplitude() + + // statsig needs to be initialized before FeatureService is initialized + // because FeatureService sets remote to be StatsigFeatureFlagsProvider.shared + // TODO: remove the ordering dependency + injectStatsig() let compositeFeatureFlags = CompositeFeatureFlagsProvider() switch Installation.source { case .debug, .testFlight: @@ -60,6 +60,12 @@ open class CommonAppDelegate: ParticlesAppDelegate { } compositeFeatureFlags.remote = StatsigFeatureFlagsProvider.shared FeatureService.shared = compositeFeatureFlags + // at least the amplitude injection needs to happen before app start and after FeatureService is initialized because + // injectAmplitude triggers abacus initialization which looks at dydxBoolFeatureFlags.force_mainnet + // TODO: remove the ordering dependency + injectFirebase() + injectRating() + injectAmplitude() FeatureService.shared?.activate { /* [weak self] in */ Injection.shared?.injectFeatured(completion: completion) } @@ -118,7 +124,7 @@ open class CommonAppDelegate: ParticlesAppDelegate { } } - open func injectStatsigApiKey() { + open func injectStatsig() { Console.shared.log("injectStatsig") let environment: StatsigFeatureFlagsProvider.Environment switch Installation.source { diff --git a/StatsigInjections/StatsigInjections/StatsigInjections.swift b/StatsigInjections/StatsigInjections/StatsigInjections.swift index 2c9c1b66..6c54e234 100644 --- a/StatsigInjections/StatsigInjections/StatsigInjections.swift +++ b/StatsigInjections/StatsigInjections/StatsigInjections.swift @@ -18,7 +18,7 @@ public final class StatsigFeatureFlagsProvider: NSObject, FeatureFlagsProtocol { private let apiKey: String private let userId: String - private let environment: StatsigEnvironment + private let environment: Environment // ensures feature flag values stay constant throughout the app session after they are used the first time, even if they are initialized to null private var sessionValues = [String: Availabilty]() @@ -28,7 +28,7 @@ public final class StatsigFeatureFlagsProvider: NSObject, FeatureFlagsProtocol { case unavailable } - public enum Environment { + public enum Environment: CustomDebugStringConvertible { case production case development @@ -40,12 +40,21 @@ public final class StatsigFeatureFlagsProvider: NSObject, FeatureFlagsProtocol { return StatsigEnvironment(tier: .Development) } } + + public var debugDescription: String { + switch self { + case .production: + return "production" + case .development: + return "development" + } + } } public init(apiKey: String, userId: String, environment: Environment) { self.apiKey = apiKey self.userId = userId - self.environment = environment.statsigEnvironemnt + self.environment = environment } static public var shared: StatsigFeatureFlagsProvider? @@ -64,7 +73,7 @@ public final class StatsigFeatureFlagsProvider: NSObject, FeatureFlagsProtocol { Statsig.start(sdkKey: apiKey, user: StatsigUser(userID: userId), options: StatsigOptions( initTimeout: nil, disableCurrentVCLogging: true, - environment: environment, + environment: environment.statsigEnvironemnt, enableAutoValueUpdate: true, autoValueUpdateIntervalSec: nil, overrideStableID: nil, @@ -79,9 +88,9 @@ public final class StatsigFeatureFlagsProvider: NSObject, FeatureFlagsProtocol { userValidationCallback: nil, customCacheKey: nil, urlSession: nil)) {[weak self] error in - Console.shared.log("Statsig feature flags initialized") + Console.shared.log("analytics log | Statsig feature flags finished initial fetch") if let error { - Console.shared.log("Statsig feature flags failed to initialize: \(error)") + Console.shared.log("analytics log | Statsig feature flags finished initial fetch with error: \(error)") return } self?.initializationState = .initializedRemoteLoaded @@ -89,6 +98,7 @@ public final class StatsigFeatureFlagsProvider: NSObject, FeatureFlagsProtocol { // this may change if we need FF pre-launch // completion() } + Console.shared.log("analytics log | Statsig initialized (local only, async feature flags fetch ongoing) | env: \(environment.debugDescription) | userId: \(userId)") initializationState = .initializedRemoteLoading } completion()