Skip to content

Commit e2ef6a3

Browse files
authored
feat: add OptimizelyConfig API (#274)
* add OptimizelyConfig
1 parent 4b0d169 commit e2ef6a3

25 files changed

+1795
-42
lines changed

DemoObjCApp/AppDelegate.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
4848
// - initialize immediately with the given JSON datafile or its cached copy
4949
// - no network delay, but the local copy is not guaranteed to be in sync with the server experiment settings
5050

51-
[self initializeOptimizelySDKAsynchronous];
51+
[self initializeOptimizelySDKWithCustomization];
5252
return YES;
5353
}
5454

@@ -144,6 +144,9 @@ -(void)initializeOptimizelySDKWithCustomization {
144144
}
145145

146146
[self startWithRootViewController];
147+
148+
// For sample codes for APIs, see "Samples/SamplesForAPI.swift"
149+
//[SamplesForAPI checkOptimizelyConfig:self.optimizely];
147150
}];
148151
}
149152

DemoObjCApp/Samples/SamplesForAPI.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ NS_ASSUME_NONNULL_BEGIN
2323
@class OptimizelyClient;
2424

2525
@interface SamplesForAPI: NSObject
26-
+(void)run:(OptimizelyClient*)optimizely;
26+
+(void)checkAPIs:(OptimizelyClient*)optimizely;
27+
+(void)checkOptimizelyConfig:(OptimizelyClient*)optimizely;
2728
@end
2829

2930
NS_ASSUME_NONNULL_END

DemoObjCApp/Samples/SamplesForAPI.m

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
@implementation SamplesForAPI
2323

24-
+(void)run:(OptimizelyClient*)optimizely {
24+
+(void)checkAPIs:(OptimizelyClient*)optimizely {
2525
NSDictionary *attributes = @{
2626
@"device": @"iPhone",
2727
@"lifetime": @24738388,
@@ -129,6 +129,91 @@ +(void)run:(OptimizelyClient*)optimizely {
129129
NSLog(@"[track]");
130130
}
131131
}
132+
}
133+
134+
// MARK: - OptimizelyConfig
135+
136+
+(void)checkOptimizelyConfig:(OptimizelyClient*)optimizely {
137+
NSError *error = nil;
138+
id<OptimizelyConfig> optConfig = [optimizely getOptimizelyConfigWithError:&error];
139+
if (optConfig == nil) {
140+
NSLog(@"Error: %@", error);
141+
return;
142+
}
143+
144+
// enumerate all experiments (variations, and associated variables)
145+
146+
NSDictionary<NSString*, id<OptimizelyExperiment>> *experimentsMap = optConfig.experimentsMap;
147+
//NSArray* experiments = experimentsMap.allValues;
148+
NSArray* experimentKeys = experimentsMap.allKeys;
149+
NSLog(@"[OptimizelyConfig] all experiment keys = %@)", experimentKeys);
150+
151+
for(NSString *expKey in experimentKeys) {
152+
NSLog(@"[OptimizelyConfig] experimentKey = %@", expKey);
153+
154+
NSDictionary<NSString*, id<OptimizelyVariation>> *variationsMap = experimentsMap[expKey].variationsMap;
155+
NSArray *variationKeys = variationsMap.allKeys;
156+
157+
for(NSString *varKey in variationKeys) {
158+
NSLog(@"[OptimizelyConfig] - variationKey = %@", varKey);
159+
160+
NSDictionary<NSString*, id<OptimizelyVariable>> *variablesMap = variationsMap[varKey].variablesMap;
161+
NSArray *variableKeys = variablesMap.allKeys;
162+
163+
for(NSString *variableKey in variableKeys) {
164+
id<OptimizelyVariable> variable = variablesMap[variableKey];
165+
166+
NSLog(@"[OptimizelyConfig] -- variable: \%@, %@", variableKey, variable);
167+
}
168+
}
169+
}
170+
171+
// enumerate all features (experiments, variations, and assocated variables)
172+
173+
NSDictionary<NSString*, id<OptimizelyFeature>> *featuresMap = optConfig.featuresMap;
174+
//NSArray* features = featuresMap.allValues;
175+
NSArray* featureKeys = featuresMap.allKeys;
176+
NSLog(@"[OptimizelyConfig] all experiment keys = %@)", featureKeys);
177+
178+
for(NSString *featKey in featureKeys) {
179+
NSLog(@"[OptimizelyConfig] featureKey = %@", featKey);
180+
181+
// enumerate feature experiments
182+
183+
NSDictionary<NSString*, id<OptimizelyExperiment>> *experimentsMap = featuresMap[featKey].experimentsMap;
184+
NSArray *experimentKeys = experimentsMap.allKeys;
185+
186+
for(NSString *expKey in experimentKeys) {
187+
NSLog(@"[OptimizelyConfig] - experimentKey = %@", expKey);
188+
189+
NSDictionary<NSString*, id<OptimizelyVariation>> *variationsMap = experimentsMap[expKey].variationsMap;
190+
NSArray *variationKeys = variationsMap.allKeys;
191+
192+
for(NSString *varKey in variationKeys) {
193+
NSLog(@"[OptimizelyConfig] -- variationKey = %@", varKey);
194+
195+
NSDictionary<NSString*, id<OptimizelyVariable>> *variablesMap = variationsMap[varKey].variablesMap;
196+
NSArray *variableKeys = variablesMap.allKeys;
197+
198+
for(NSString *variableKey in variableKeys) {
199+
id<OptimizelyVariable> variable = variablesMap[variableKey];
200+
201+
NSLog(@"[OptimizelyConfig] --- variable: %@, %@", variableKey, variable);
202+
}
203+
}
204+
}
205+
206+
// enumerate all feature-variables
207+
208+
NSDictionary<NSString*, id<OptimizelyVariable>> *variablesMap = featuresMap[featKey].variablesMap;
209+
NSArray *variableKeys = variablesMap.allKeys;
210+
211+
for(NSString *variableKey in variableKeys) {
212+
id<OptimizelyVariable> variable = variablesMap[variableKey];
213+
214+
NSLog(@"[OptimizelyConfig] -- variable: \%@, %@", variableKey, variable);
215+
}
216+
}
132217

133218
}
134219

DemoSwiftApp/AppDelegate.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
9696
// customization example (optional)
9797

9898
let customLogger = CustomLogger()
99-
// 30 sec interval may be too frequent. This is for demo purpose.
99+
// 60 sec interval may be too frequent. This is for demo purpose.
100100
// This should be should be much larger (default = 10 mins).
101-
let customDownloadIntervalInSecs = 30
101+
let customDownloadIntervalInSecs = 60
102102

103103
optimizely = OptimizelyClient(sdkKey: sdkKey,
104104
logger: customLogger,
@@ -108,20 +108,22 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
108108
addListeners()
109109

110110
// initialize SDK
111-
optimizely.start { result in
111+
optimizely!.start { result in
112112
switch result {
113113
case .failure(let error):
114114
print("Optimizely SDK initiliazation failed: \(error)")
115115
case .success:
116116
print("Optimizely SDK initialized successfully!")
117117
}
118118
self.startWithRootViewController()
119+
120+
// For sample codes for APIs, see "Samples/SamplesForAPI.swift"
121+
//SamplesForAPI.checkOptimizelyConfig(optimizely: self.optimizely)
119122
}
120123
}
121124

122125
func addListeners() {
123126
// notification listeners
124-
125127
let notificationCenter = optimizely.notificationCenter!
126128

127129
_ = notificationCenter.addDecisionNotificationListener(decisionListener: { (type, userId, attributes, decisionInfo) in
@@ -150,6 +152,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
150152
userId: self.userId)
151153
}
152154
}
155+
156+
if let optConfig = try? self.optimizely.getOptimizelyConfig() {
157+
print("[OptimizelyConfig] revision = \(optConfig.revision)")
158+
}
153159
})
154160

155161
_ = notificationCenter.addLogEventNotificationListener(logEventListener: { (url, event) in
@@ -162,8 +168,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
162168
func startWithRootViewController() {
163169
DispatchQueue.main.async {
164170
do {
165-
// For sample codes for other APIs, see "Samples/SamplesForAPI.swift"
166-
167171
let variationKey = try self.optimizely.activate(experimentKey: self.experimentKey,
168172
userId: self.userId,
169173
attributes: self.attributes)

DemoSwiftApp/Samples/SamplesForAPI.swift

Lines changed: 99 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ import Foundation
1919
import Optimizely
2020

2121
class SamplesForAPI {
22-
23-
static func run(optimizely: OptimizelyClient) {
22+
23+
static func checkAPIs(optimizely: OptimizelyClient) {
2424

2525
let attributes: [String: Any] = [
2626
"device": "iPhone",
@@ -100,6 +100,103 @@ class SamplesForAPI {
100100
} catch {
101101
print(error)
102102
}
103+
104+
}
105+
106+
// MARK: - OptimizelyConfig
107+
108+
static func checkOptimizelyConfig(optimizely: OptimizelyClient) {
109+
let optConfig = try! optimizely.getOptimizelyConfig()
110+
111+
print("[OptimizelyConfig] revision = \(optConfig.revision)")
112+
113+
//let experiments = optConfig.experimentsMap.values
114+
let experimentKeys = optConfig.experimentsMap.keys
115+
print("[OptimizelyConfig] all experiment keys = \(experimentKeys)")
116+
117+
//let features = optConfig.featureFlagsMap.values
118+
let featureKeys = optConfig.featuresMap.keys
119+
print("[OptimizelyConfig] all feature keys = \(featureKeys)")
120+
121+
// enumerate all experiments (variations, and associated variables)
122+
123+
experimentKeys.forEach { expKey in
124+
print("[OptimizelyConfig] experimentKey = \(expKey)")
125+
126+
let experiment = optConfig.experimentsMap[expKey]!
127+
128+
let variationsMap = experiment.variationsMap
129+
let variationKeys = variationsMap.keys
130+
131+
variationKeys.forEach { varKey in
132+
print("[OptimizelyConfig] - variationKey = \(varKey)")
133+
134+
let variation = variationsMap[varKey]!
135+
136+
let variablesMap = variation.variablesMap
137+
let variableKeys = variablesMap.keys
138+
139+
variableKeys.forEach { variableKey in
140+
let variable = variablesMap[variableKey]!
141+
142+
print("[OptimizelyConfig] -- variable: \(variableKey), \(variable)")
143+
}
144+
}
145+
}
146+
147+
// enumerate all features (experiments, variations, and assocated variables)
148+
149+
featureKeys.forEach { featKey in
150+
print("[OptimizelyConfig] featureKey = \(featKey)")
151+
152+
// enumerate feature experiments
153+
154+
let feature = optConfig.featuresMap[featKey]!
155+
156+
let experimentsMap = feature.experimentsMap
157+
let experimentKeys = experimentsMap.keys
158+
159+
experimentKeys.forEach { expKey in
160+
print("[OptimizelyConfig] - experimentKey = \(expKey)")
161+
162+
let variationsMap = experimentsMap[expKey]!.variationsMap
163+
let variationKeys = variationsMap.keys
164+
165+
variationKeys.forEach { varKey in
166+
let variation = variationsMap[varKey]!
167+
print("[OptimizelyConfig] -- variation = { key: \(varKey), id: \(variation.id), featureEnabled: \(variation.featureEnabled)")
168+
169+
let variablesMap = variationsMap[varKey]!.variablesMap
170+
let variableKeys = variablesMap.keys
171+
172+
variableKeys.forEach { variableKey in
173+
let variable = variablesMap[variableKey]!
174+
175+
print("[OptimizelyConfig] --- variable: \(variableKey), \(variable)")
176+
}
177+
}
178+
}
179+
180+
// enumerate all feature-variables
181+
182+
let variablesMap = optConfig.featuresMap[featKey]!.variablesMap
183+
let variableKeys = variablesMap.keys
184+
185+
variableKeys.forEach { variableKey in
186+
let variable = variablesMap[variableKey]!
187+
188+
print("[OptimizelyConfig] - (feature)variable: \(variableKey), \(variable)")
189+
}
190+
}
191+
192+
// listen to NotificationType.datafileChange to get updated data
193+
194+
_ = optimizely.notificationCenter?.addDatafileChangeNotificationListener { (_) in
195+
if let newOptConfig = try? optimizely.getOptimizelyConfig() {
196+
print("[OptimizelyConfig] revision = \(newOptConfig.revision)")
197+
}
198+
}
199+
103200
}
104201

105202
}

0 commit comments

Comments
 (0)