1616
1717#import " FirebaseRemoteConfig/Sources/RCNConfigFetch.h"
1818
19- #import < FirebaseCore/FIRApp.h>
2019#import < FirebaseCore/FIRLogger.h>
2120#import < FirebaseCore/FIROptions.h>
22- #import < FirebaseInstallations/FirebaseInstallations.h>
21+ #import < FirebaseInstanceID/FIRInstanceID+Private.h>
22+ #import < FirebaseInstanceID/FIRInstanceIDCheckinPreferences.h>
2323#import < GoogleUtilities/GULNSData+zlib.h>
2424#import " FirebaseRemoteConfig/Sources/Private/RCNConfigSettings.h"
2525#import " FirebaseRemoteConfig/Sources/RCNConfigConstants.h"
4040static NSString *const kServerURLQuery = @" :fetch?" ;
4141static NSString *const kServerURLKey = @" key=" ;
4242static NSString *const kRequestJSONKeyAppID = @" app_id" ;
43+ static NSString *const kRequestJSONKeyAppInstanceID = @" app_instance_id" ;
4344
4445static NSString *const kHTTPMethodPost = @" POST" ; // /< HTTP request method config fetch using
4546static NSString *const kContentTypeHeaderName = @" Content-Type" ; // /< HTTP Header Field Name
4849static NSString *const kAcceptEncodingHeaderName = @" Accept-Encoding" ; // /< HTTP Header Field Name
4950static NSString *const kETagHeaderName = @" etag" ; // /< HTTP Header Field Name
5051static NSString *const kIfNoneMatchETagHeaderName = @" if-none-match" ; // /< HTTP Header Field Name
51- static NSString *const kInstallationsAuthTokenHeaderName = @" x-goog-firebase-installations-auth" ;
5252// Sends the bundle ID. Refer to b/130301479 for details.
5353static NSString *const kiOSBundleIdentifierHeaderName =
5454 @" X-Ios-Bundle-Identifier" ; // /< HTTP Header Field Name
5555
5656// / Config HTTP request content type proto buffer
5757static NSString *const kContentTypeValueJSON = @" application/json" ;
58+ static NSString *const kInstanceIDScopeConfig = @" *" ; // / InstanceID scope
5859
5960// / HTTP status codes. Ref: https://cloud.google.com/apis/design/errors#error_retries
6061static NSInteger const kRCNFetchResponseHTTPStatusCodeOK = 200 ;
@@ -191,22 +192,18 @@ - (void)fetchConfigWithExpirationDuration:(NSTimeInterval)expirationDuration
191192 withError: error];
192193 }
193194 strongSelf->_settings .isFetchInProgress = YES ;
194- [strongSelf refreshInstallationsTokenWithCompletionHandler : completionHandler];
195+ [strongSelf refreshInstanceIDTokenAndFetchCheckInInfoWithCompletionHandler : completionHandler];
195196 });
196197}
197198
198199#pragma mark - Fetch helpers
199200
200- - (NSString *)FIRAppNameFromFullyQualifiedNamespace {
201- return [[_FIRNamespace componentsSeparatedByString: @" :" ] lastObject ];
202- }
203- // / Refresh installation ID token before fetching config. installation ID is now mandatory for fetch
201+ // / Refresh instance ID token before fetching config. Instance ID is now mandatory for fetch
204202// / requests to work.(b/14751422).
205- - (void )refreshInstallationsTokenWithCompletionHandler :
203+ - (void )refreshInstanceIDTokenAndFetchCheckInInfoWithCompletionHandler :
206204 (FIRRemoteConfigFetchCompletion)completionHandler {
207- FIRInstallations *installations = [FIRInstallations
208- installationsWithApp: [FIRApp appNamed: [self FIRAppNameFromFullyQualifiedNamespace ]]];
209- if (!installations || !_options.GCMSenderID ) {
205+ FIRInstanceID *instanceID = [FIRInstanceID instanceID ];
206+ if (!_options.GCMSenderID ) {
210207 NSString *errorDescription = @" Failed to get GCMSenderID" ;
211208 FIRLogError (kFIRLoggerRemoteConfig , @" I-RCN000074" , @" %@ " ,
212209 [NSString stringWithFormat: @" %@ " , errorDescription]);
@@ -220,11 +217,10 @@ - (void)refreshInstallationsTokenWithCompletionHandler:
220217 NSLocalizedDescriptionKey : errorDescription
221218 }]];
222219 }
223- FIRInstallationsTokenHandler installationsTokenHandler = ^(
224- FIRInstallationsAuthTokenResult *tokenResult, NSError *error) {
225- if (!tokenResult || !tokenResult.authToken || error) {
220+ FIRInstanceIDTokenHandler instanceIDHandler = ^(NSString *token, NSError *error) {
221+ if (!token || error) {
226222 NSString *errorDescription =
227- [NSString stringWithFormat: @" Failed to get installations token. Error : %@ ." , error];
223+ [NSString stringWithFormat: @" Failed to get InstanceID token. Error : %@ ." , error];
228224 FIRLogError (kFIRLoggerRemoteConfig , @" I-RCN000073" , @" %@ " ,
229225 [NSString stringWithFormat: @" %@ " , errorDescription]);
230226 self->_settings .isFetchInProgress = NO ;
@@ -238,21 +234,20 @@ - (void)refreshInstallationsTokenWithCompletionHandler:
238234 }]];
239235 }
240236
241- // We have a valid token. Get the backing installationID .
237+ // If the token is available, try to get the instanceID .
242238 __weak RCNConfigFetch *weakSelf = self;
243- [installations installationIDWithCompletion: ^(NSString *_Nullable identifier,
244- NSError *_Nullable error) {
239+ [instanceID getIDWithHandler: ^(NSString *_Nullable identity, NSError *_Nullable error) {
245240 RCNConfigFetch *strongSelf = weakSelf;
246241
247242 // Dispatch to the RC serial queue to update settings on the queue.
248243 dispatch_async (strongSelf->_lockQueue , ^{
249244 RCNConfigFetch *strongSelfQueue = weakSelf;
250245
251246 // Update config settings with the IID and token.
252- strongSelfQueue->_settings .configInstallationsToken = tokenResult. authToken ;
253- strongSelfQueue->_settings .configInstallationsIdentifier = identifier ;
247+ strongSelfQueue->_settings .configInstanceIDToken = [token copy ] ;
248+ strongSelfQueue->_settings .configInstanceID = identity ;
254249
255- if (!identifier || error) {
250+ if (!identity || error) {
256251 NSString *errorDescription =
257252 [NSString stringWithFormat: @" Error getting iid : %@ ." , error];
258253 FIRLogError (kFIRLoggerRemoteConfig , @" I-RCN000055" , @" %@ " ,
@@ -270,23 +265,56 @@ - (void)refreshInstallationsTokenWithCompletionHandler:
270265 }
271266
272267 FIRLogInfo (kFIRLoggerRemoteConfig , @" I-RCN000022" , @" Success to get iid : %@ ." ,
273- strongSelfQueue->_settings .configInstallationsIdentifier );
274- [strongSelf
275- getAnalyticsUserPropertiesWithCompletionHandler: ^(NSDictionary *userProperties) {
276- dispatch_async (strongSelf->_lockQueue , ^{
277- [strongSelf fetchWithUserProperties: userProperties
278- completionHandler: completionHandler];
279- });
280- }];
268+ strongSelfQueue->_settings .configInstanceID );
269+
270+ // Continue the fetch regardless of whether fetch of instance ID succeeded.
271+ [strongSelfQueue fetchCheckinInfoWithCompletionHandler: completionHandler];
281272 });
282273 }];
283274 };
284-
285275 FIRLogDebug (kFIRLoggerRemoteConfig , @" I-RCN000039" , @" Starting requesting token." );
286- [installations authTokenWithCompletion: installationsTokenHandler];
276+ // Note: We expect the GCMSenderID to always be available by the time this request is made.
277+ [instanceID tokenWithAuthorizedEntity: _options.GCMSenderID
278+ scope: kInstanceIDScopeConfig
279+ options: nil
280+ handler: instanceIDHandler];
281+ }
282+
283+ // / Fetch checkin info before fetching config. Checkin info including device authentication ID,
284+ // / secret token and device data version are optional fields in config request.
285+ - (void )fetchCheckinInfoWithCompletionHandler : (FIRRemoteConfigFetchCompletion)completionHandler {
286+ FIRInstanceID *instanceID = [FIRInstanceID instanceID ];
287+ __weak RCNConfigFetch *weakSelf = self;
288+ [instanceID fetchCheckinInfoWithHandler: ^(FIRInstanceIDCheckinPreferences *preferences,
289+ NSError *error) {
290+ RCNConfigFetch *fetchCheckinInfoWithHandlerSelf = weakSelf;
291+ dispatch_async (fetchCheckinInfoWithHandlerSelf->_lockQueue , ^{
292+ RCNConfigFetch *strongSelf = fetchCheckinInfoWithHandlerSelf;
293+ if (error) {
294+ FIRLogError (kFIRLoggerRemoteConfig , @" I-RCN000023" , @" Failed to fetch checkin info: %@ ." ,
295+ error);
296+ } else {
297+ strongSelf->_settings .deviceAuthID = preferences.deviceID ;
298+ strongSelf->_settings .secretToken = preferences.secretToken ;
299+ strongSelf->_settings .deviceDataVersion = preferences.deviceDataVersion ;
300+ if (strongSelf->_settings .deviceAuthID .length && strongSelf->_settings .secretToken .length ) {
301+ FIRLogInfo (kFIRLoggerRemoteConfig , @" I-RCN000024" ,
302+ @" Success to get device authentication ID: %@ , security token: %@ ." ,
303+ self->_settings .deviceAuthID , self->_settings .secretToken );
304+ }
305+ }
306+ // Checkin info is optional, continue fetch config regardless fetch of checkin info
307+ // succeeded.
308+ [strongSelf fetchWithUserPropertiesCompletionHandler: ^(NSDictionary *userProperties) {
309+ dispatch_async (strongSelf->_lockQueue , ^{
310+ [strongSelf fetchWithUserProperties: userProperties completionHandler: completionHandler];
311+ });
312+ }];
313+ });
314+ }];
287315}
288316
289- - (void )getAnalyticsUserPropertiesWithCompletionHandler :
317+ - (void )fetchWithUserPropertiesCompletionHandler :
290318 (FIRAInteropUserPropertiesCallback)completionHandler {
291319 FIRLogDebug (kFIRLoggerRemoteConfig , @" I-RCN000060" , @" Fetch with user properties completed." );
292320 id <FIRAnalyticsInterop> analytics = self->_analytics ;
@@ -562,8 +590,6 @@ - (NSURLSessionDataTask *)URLSessionDataTaskWithContent:(NSData *)content
562590 timeoutInterval: timeoutInterval];
563591 URLRequest.HTTPMethod = kHTTPMethodPost ;
564592 [URLRequest setValue: kContentTypeValueJSON forHTTPHeaderField: kContentTypeHeaderName ];
565- [URLRequest setValue: _settings.configInstallationsToken
566- forHTTPHeaderField: kInstallationsAuthTokenHeaderName ];
567593 [URLRequest setValue: [[NSBundle mainBundle ] bundleIdentifier ]
568594 forHTTPHeaderField: kiOSBundleIdentifierHeaderName];
569595 [URLRequest setValue: @" gzip" forHTTPHeaderField: kContentEncodingHeaderName ];
0 commit comments