-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
tests #12133
tests #12133
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,14 @@ | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
// File.swift | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
// Created by Themis Wang on 2023-11-16. | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
+1
to
+6
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
import Foundation | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
@objc(FIRRemoteConfigInterop) | ||||||||||||||||||||||||||||||||||||||||
public protocol RemoteConfigInterop { | ||||||||||||||||||||||||||||||||||||||||
func registerRolloutsStateSubscriber(_ namespace: String, | ||||||||||||||||||||||||||||||||||||||||
subscriber: RolloutsStateSubscriber?) | ||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,39 @@ | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
// File.swift | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
// Created by Themis Wang on 2023-11-16. | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
+1
to
+6
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
import Foundation | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
@objc(FIRRolloutAssignment) | ||||||||||||||||||||||||||||||||||||||||
public class RolloutAssignment: NSObject { | ||||||||||||||||||||||||||||||||||||||||
@objc public var rolloutId: String | ||||||||||||||||||||||||||||||||||||||||
@objc public var variantId: String | ||||||||||||||||||||||||||||||||||||||||
@objc public var templateVersion: String | ||||||||||||||||||||||||||||||||||||||||
@objc public var parameterKey: String | ||||||||||||||||||||||||||||||||||||||||
@objc public var parameterValue: String | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
public init(rolloutId: String, variantId: String, templateVersion: String, parameterKey: String, | ||||||||||||||||||||||||||||||||||||||||
parameterValue: String) { | ||||||||||||||||||||||||||||||||||||||||
self.rolloutId = rolloutId | ||||||||||||||||||||||||||||||||||||||||
self.variantId = variantId | ||||||||||||||||||||||||||||||||||||||||
self.templateVersion = templateVersion | ||||||||||||||||||||||||||||||||||||||||
self.parameterKey = parameterKey | ||||||||||||||||||||||||||||||||||||||||
self.parameterValue = parameterValue | ||||||||||||||||||||||||||||||||||||||||
super.init() | ||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
@objc(FIRRolloutsState) | ||||||||||||||||||||||||||||||||||||||||
public class RolloutsState: NSObject { | ||||||||||||||||||||||||||||||||||||||||
@objc public var assignments: Set<RolloutAssignment> = Set() | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
public init(assignmentList: [RolloutAssignment]) { | ||||||||||||||||||||||||||||||||||||||||
for assignment in assignmentList { | ||||||||||||||||||||||||||||||||||||||||
assignments.insert(assignment) | ||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||
super.init() | ||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,13 @@ | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
// File.swift | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
// Created by Themis Wang on 2023-11-16. | ||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
+1
to
+6
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
import Foundation | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
@objc(FIRRolloutsStateSubscriber) | ||||||||||||||||||||||||||||||||||||||||
public protocol RolloutsStateSubscriber { | ||||||||||||||||||||||||||||||||||||||||
func onRolloutsStateChanged(_ rolloutsState: RolloutsState) | ||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,6 +23,17 @@ | |
#import "Interop/Analytics/Public/FIRAnalyticsInterop.h" | ||
|
||
@implementation FIRRemoteConfigComponent | ||
static FIRRemoteConfigComponent *_sharedDefaultAppRemoteConfigSingleton = nil; | ||
|
||
+ (FIRRemoteConfigComponent *)sharedDefaultAppRemoteConfigSingletonWithDefaultApp:(FIRApp *)app { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We probably need some strategy to create a singleton for the default app Provider and Interop. They will return the same object. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Checked RC Component from Crashlytics and FirePerf, confirm they have the same RC Component: https://screenshot.googleplex.com/9NXgjPbmtxoSrSe |
||
@synchronized([FIRRemoteConfigComponent class]) { | ||
if (!_sharedDefaultAppRemoteConfigSingleton) { | ||
_sharedDefaultAppRemoteConfigSingleton = [[self alloc] initWithApp:app]; | ||
} | ||
return _sharedDefaultAppRemoteConfigSingleton; | ||
} | ||
return nil; | ||
} | ||
|
||
/// Default method for retrieving a Remote Config instance, or creating one if it doesn't exist. | ||
- (FIRRemoteConfig *)remoteConfigForNamespace:(NSString *)remoteConfigNamespace { | ||
|
@@ -60,6 +71,7 @@ - (FIRRemoteConfig *)remoteConfigForNamespace:(NSString *)remoteConfigNamespace | |
FIRApp *app = self.app; | ||
id<FIRAnalyticsInterop> analytics = | ||
app.isDefaultApp ? FIR_COMPONENT(FIRAnalyticsInterop, app.container) : nil; | ||
|
||
instance = [[FIRRemoteConfig alloc] initWithAppName:app.name | ||
FIROptions:app.options | ||
namespace:remoteConfigNamespace | ||
|
@@ -95,16 +107,43 @@ + (void)load { | |
+ (NSArray<FIRComponent *> *)componentsToRegister { | ||
FIRDependency *analyticsDep = [FIRDependency dependencyWithProtocol:@protocol(FIRAnalyticsInterop) | ||
isRequired:NO]; | ||
|
||
FIRComponent *rcProvider = [FIRComponent | ||
componentWithProtocol:@protocol(FIRRemoteConfigProvider) | ||
instantiationTiming:FIRInstantiationTimingAlwaysEager | ||
dependencies:@[ analyticsDep ] | ||
creationBlock:^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { | ||
// Cache the component so instances of Remote Config are cached. | ||
*isCacheable = YES; | ||
if (container.app.isDefaultApp) { | ||
return [FIRRemoteConfigComponent | ||
sharedDefaultAppRemoteConfigSingletonWithDefaultApp:container.app]; | ||
} | ||
return [[FIRRemoteConfigComponent alloc] initWithApp:container.app]; | ||
}]; | ||
return @[ rcProvider ]; | ||
|
||
// Crashlytics only works on default app, the only shared component between Provider and Interop | ||
// is the component for default app | ||
FIRComponent *rcInterop = [FIRComponent | ||
componentWithProtocol:@protocol(FIRRemoteConfigInterop) | ||
instantiationTiming:FIRInstantiationTimingAlwaysEager | ||
dependencies:@[] | ||
creationBlock:^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { | ||
// Cache the component so instances of Remote Config are cached. | ||
*isCacheable = YES; | ||
if (container.app.isDefaultApp) { | ||
return [FIRRemoteConfigComponent | ||
sharedDefaultAppRemoteConfigSingletonWithDefaultApp:container.app]; | ||
} | ||
return nil; | ||
}]; | ||
return @[ rcProvider, rcInterop ]; | ||
} | ||
|
||
- (void)registerRolloutsStateSubscriber:(nonnull NSString *)nameSpace | ||
subscriber:(nullable id<FIRRolloutsStateSubscriber>)subscriber { | ||
// adding the registered subscriber reference to the namespace instance | ||
[self.instances[nameSpace] addRemoteConfigInteropSubscriber:subscriber]; | ||
} | ||
|
||
themiswang marked this conversation as resolved.
Show resolved
Hide resolved
|
||
@end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we import this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, this can be imported.
Here's an example where AppCheck imports the AppCheckInterop header in order to declare conformance with the
FIRAppCheckProtocol
protocol from the interop SDK.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it needs to be imported per https://stackoverflow.com/a/11533804/9331576. Were you able to get things building in its current state?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Interesting, I see in codebase that we have some pattern for forward declaring a protocol, for example FireAuth: https://github.com/firebase/firebase-ios-sdk/blob/master/FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h#L24. I am able to get things build for now. But I'll change to import if it's safer.