@@ -26,6 +26,8 @@ public struct GrowthBookModel {
2626 var stickyBucketService : StickyBucketServiceProtocol ?
2727 var backgroundSync : Bool
2828 var remoteEval : Bool
29+ var apiRequestHeaders : [ String : String ] ? = nil
30+ var streamingHostRequestHeaders : [ String : String ] ? = nil
2931}
3032
3133/// GrowthBookBuilder - inItializer for GrowthBook SDK for Apps
@@ -39,23 +41,57 @@ public struct GrowthBookModel {
3941 private var refreshHandler : CacheRefreshHandler ?
4042 private var networkDispatcher : NetworkProtocol = CoreNetworkClient ( )
4143
42- private var cachingManager : CachingManager
44+ private var cachingManager : CachingLayer
4345
44- @objc public init ( apiHost: String ? = nil , clientKey: String ? = nil , encryptionKey: String ? = nil , attributes: [ String : Any ] , features: Data ? = nil , trackingCallback: @escaping TrackingCallback , refreshHandler: CacheRefreshHandler ? = nil , backgroundSync: Bool = false , remoteEval: Bool = false ) {
45- growthBookBuilderModel = GrowthBookModel ( apiHost: apiHost, clientKey: clientKey, encryptionKey: encryptionKey, features: features, attributes: JSON ( attributes) , trackingClosure: trackingCallback, backgroundSync: backgroundSync, remoteEval: remoteEval)
46+ @objc public init (
47+ apiHost: String ? = nil ,
48+ clientKey: String ? = nil ,
49+ encryptionKey: String ? = nil ,
50+ attributes: [ String : Any ] ,
51+ features: Data ? = nil ,
52+ trackingCallback: @escaping TrackingCallback ,
53+ refreshHandler: CacheRefreshHandler ? = nil ,
54+ backgroundSync: Bool = false ,
55+ remoteEval: Bool = false ,
56+ apiRequestHeaders: [ String : String ] ? = nil ,
57+ streamingHostRequestHeaders: [ String : String ] ? = nil
58+ ) {
59+ growthBookBuilderModel = GrowthBookModel (
60+ apiHost: apiHost,
61+ clientKey: clientKey,
62+ encryptionKey: encryptionKey,
63+ features: features,
64+ attributes: JSON ( attributes) ,
65+ trackingClosure: trackingCallback,
66+ backgroundSync: backgroundSync,
67+ remoteEval: remoteEval,
68+ apiRequestHeaders: apiRequestHeaders,
69+ streamingHostRequestHeaders: streamingHostRequestHeaders)
4670 self . refreshHandler = refreshHandler
71+ self . networkDispatcher = CoreNetworkClient (
72+ apiRequestHeaders: apiRequestHeaders ?? [ : ] ,
73+ streamingHostRequestHeaders: streamingHostRequestHeaders ?? [ : ]
74+ )
4775 self . cachingManager = CachingManager ( apiKey: clientKey)
4876 }
4977
50- @objc public init ( features: Data , attributes: [ String : Any ] , trackingCallback: @escaping TrackingCallback , refreshHandler: CacheRefreshHandler ? = nil , backgroundSync: Bool , remoteEval: Bool = false ) {
51- growthBookBuilderModel = GrowthBookModel ( features: features, attributes: JSON ( attributes) , trackingClosure: trackingCallback, backgroundSync: backgroundSync, remoteEval: remoteEval)
78+ @objc public init ( features: Data , attributes: [ String : Any ] , trackingCallback: @escaping TrackingCallback , refreshHandler: CacheRefreshHandler ? = nil , backgroundSync: Bool , remoteEval: Bool = false , apiRequestHeaders : [ String : String ] ? = nil , streamingHostRequestHeaders : [ String : String ] ? = nil ) {
79+ growthBookBuilderModel = GrowthBookModel ( features: features, attributes: JSON ( attributes) , trackingClosure: trackingCallback, backgroundSync: backgroundSync, remoteEval: remoteEval, apiRequestHeaders : apiRequestHeaders , streamingHostRequestHeaders : streamingHostRequestHeaders )
5280 self . refreshHandler = refreshHandler
81+ self . networkDispatcher = CoreNetworkClient (
82+ apiRequestHeaders: apiRequestHeaders ?? [ : ] ,
83+ streamingHostRequestHeaders: streamingHostRequestHeaders ?? [ : ]
84+ )
5385 self . cachingManager = CachingManager ( )
5486 }
5587
56- init ( apiHost: String , clientKey: String , encryptionKey: String ? = nil , attributes: JSON , trackingCallback: @escaping TrackingCallback , refreshHandler: CacheRefreshHandler ? , backgroundSync: Bool , remoteEval: Bool = false ) {
57- growthBookBuilderModel = GrowthBookModel ( apiHost: apiHost, clientKey: clientKey, encryptionKey: encryptionKey, attributes: JSON ( attributes) , trackingClosure: trackingCallback, backgroundSync: backgroundSync, remoteEval: remoteEval)
88+ init ( apiHost: String , clientKey: String , encryptionKey: String ? = nil , attributes: JSON , trackingCallback: @escaping TrackingCallback , refreshHandler: CacheRefreshHandler ? , backgroundSync: Bool , remoteEval: Bool = false , apiRequestHeaders : [ String : String ] ? = nil , streamingHostRequestHeaders : [ String : String ] ? = nil ) {
89+ growthBookBuilderModel = GrowthBookModel ( apiHost: apiHost, clientKey: clientKey, encryptionKey: encryptionKey, attributes: JSON ( attributes) , trackingClosure: trackingCallback, backgroundSync: backgroundSync, remoteEval: remoteEval, apiRequestHeaders : apiRequestHeaders , streamingHostRequestHeaders : streamingHostRequestHeaders )
5890 self . refreshHandler = refreshHandler
91+ self . networkDispatcher = CoreNetworkClient (
92+ apiRequestHeaders: apiRequestHeaders ?? [ : ] ,
93+ streamingHostRequestHeaders: streamingHostRequestHeaders ?? [ : ]
94+ )
5995 self . cachingManager = CachingManager ( apiKey: clientKey)
6096 }
6197
@@ -71,6 +107,12 @@ public struct GrowthBookModel {
71107 return self
72108 }
73109
110+ /// Set Caching Manager - Caching Client for saving fetched features
111+ @objc public func setCachingManager( cachingManager: CachingLayer ) -> GrowthBookBuilder {
112+ self . cachingManager = cachingManager
113+ return self
114+ }
115+
74116 @objc public func setStickyBucketService( stickyBucketService: StickyBucketServiceProtocol ? = StickyBucketService ( ) ) -> GrowthBookBuilder {
75117 growthBookBuilderModel. stickyBucketService = stickyBucketService
76118 return self
@@ -155,15 +197,15 @@ public struct GrowthBookModel {
155197 private var attributeOverrides : JSON = JSON ( )
156198 private var savedGroupsValues : JSON ?
157199 private var evalContext : EvalContext ? = nil
158- var cachingManager : CachingManager
200+ var cachingManager : CachingLayer
159201
160202 init ( context: Context ,
161203 refreshHandler: CacheRefreshHandler ? = nil ,
162204 logLevel: Level = . info,
163205 networkDispatcher: NetworkProtocol = CoreNetworkClient ( ) ,
164206 features: Features ? = nil ,
165207 savedGroups: JSON ? = nil ,
166- cachingManager: CachingManager ) {
208+ cachingManager: CachingLayer ) {
167209 gbContext = context
168210 self . refreshHandler = refreshHandler
169211 self . networkDispatcher = networkDispatcher
@@ -300,6 +342,14 @@ public struct GrowthBookModel {
300342 refreshStickyBucketService ( )
301343 }
302344
345+ /// Merges the provided user attributes with the existing ones.
346+ /// - Throws: `SwiftyJSON.Error.wrongType` if the top-level JSON types differ
347+ @objc public func appendAttributes( attributes: Any ) throws {
348+ let updatedAttributes = try gbContext. attributes. merged ( with: JSON ( attributes) )
349+ gbContext. attributes = updatedAttributes
350+ refreshStickyBucketService ( )
351+ }
352+
303353 @objc public func setAttributeOverrides( overrides: Any ) {
304354 attributeOverrides = JSON ( overrides)
305355 if gbContext. stickyBucketService != nil {
@@ -314,6 +364,20 @@ public struct GrowthBookModel {
314364 refreshForRemoteEval ( )
315365 }
316366
367+ /// Updates API request headers for dynamic header management
368+ @objc public func updateApiRequestHeaders( _ headers: [ String : String ] ) {
369+ if let networkClient = networkDispatcher as? CoreNetworkClient {
370+ networkClient. apiRequestHeaders = headers
371+ }
372+ }
373+
374+ /// Updates streaming host request headers for SSE connections
375+ @objc public func updateStreamingHostRequestHeaders( _ headers: [ String : String ] ) {
376+ if let networkClient = networkDispatcher as? CoreNetworkClient {
377+ networkClient. streamingHostRequestHeaders = headers
378+ }
379+ }
380+
317381 @objc func featuresAPIModelSuccessfully( model: FeaturesDataModel ) {
318382 refreshStickyBucketService ( model)
319383 }
0 commit comments