16
16
17
17
#import " FirebaseRemoteConfig/Sources/RCNConfigFetch.h"
18
18
19
- #import < FirebaseCore/FIRApp.h>
20
19
#import < FirebaseCore/FIRLogger.h>
21
20
#import < FirebaseCore/FIROptions.h>
22
- #import < FirebaseInstallations/FirebaseInstallations.h>
21
+ #import < FirebaseInstanceID/FIRInstanceID+Private.h>
22
+ #import < FirebaseInstanceID/FIRInstanceIDCheckinPreferences.h>
23
23
#import < GoogleUtilities/GULNSData+zlib.h>
24
24
#import " FirebaseRemoteConfig/Sources/Private/RCNConfigSettings.h"
25
25
#import " FirebaseRemoteConfig/Sources/RCNConfigConstants.h"
40
40
static NSString *const kServerURLQuery = @" :fetch?" ;
41
41
static NSString *const kServerURLKey = @" key=" ;
42
42
static NSString *const kRequestJSONKeyAppID = @" app_id" ;
43
+ static NSString *const kRequestJSONKeyAppInstanceID = @" app_instance_id" ;
43
44
44
45
static NSString *const kHTTPMethodPost = @" POST" ; // /< HTTP request method config fetch using
45
46
static NSString *const kContentTypeHeaderName = @" Content-Type" ; // /< HTTP Header Field Name
48
49
static NSString *const kAcceptEncodingHeaderName = @" Accept-Encoding" ; // /< HTTP Header Field Name
49
50
static NSString *const kETagHeaderName = @" etag" ; // /< HTTP Header Field Name
50
51
static NSString *const kIfNoneMatchETagHeaderName = @" if-none-match" ; // /< HTTP Header Field Name
51
- static NSString *const kInstallationsAuthTokenHeaderName = @" x-goog-firebase-installations-auth" ;
52
52
// Sends the bundle ID. Refer to b/130301479 for details.
53
53
static NSString *const kiOSBundleIdentifierHeaderName =
54
54
@" X-Ios-Bundle-Identifier" ; // /< HTTP Header Field Name
55
55
56
56
// / Config HTTP request content type proto buffer
57
57
static NSString *const kContentTypeValueJSON = @" application/json" ;
58
+ static NSString *const kInstanceIDScopeConfig = @" *" ; // / InstanceID scope
58
59
59
60
// / HTTP status codes. Ref: https://cloud.google.com/apis/design/errors#error_retries
60
61
static NSInteger const kRCNFetchResponseHTTPStatusCodeOK = 200 ;
@@ -191,22 +192,18 @@ - (void)fetchConfigWithExpirationDuration:(NSTimeInterval)expirationDuration
191
192
withError: error];
192
193
}
193
194
strongSelf->_settings .isFetchInProgress = YES ;
194
- [strongSelf refreshInstallationsTokenWithCompletionHandler : completionHandler];
195
+ [strongSelf refreshInstanceIDTokenAndFetchCheckInInfoWithCompletionHandler : completionHandler];
195
196
});
196
197
}
197
198
198
199
#pragma mark - Fetch helpers
199
200
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
204
202
// / requests to work.(b/14751422).
205
- - (void )refreshInstallationsTokenWithCompletionHandler :
203
+ - (void )refreshInstanceIDTokenAndFetchCheckInInfoWithCompletionHandler :
206
204
(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 ) {
210
207
NSString *errorDescription = @" Failed to get GCMSenderID" ;
211
208
FIRLogError (kFIRLoggerRemoteConfig , @" I-RCN000074" , @" %@ " ,
212
209
[NSString stringWithFormat: @" %@ " , errorDescription]);
@@ -220,11 +217,10 @@ - (void)refreshInstallationsTokenWithCompletionHandler:
220
217
NSLocalizedDescriptionKey : errorDescription
221
218
}]];
222
219
}
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) {
226
222
NSString *errorDescription =
227
- [NSString stringWithFormat: @" Failed to get installations token. Error : %@ ." , error];
223
+ [NSString stringWithFormat: @" Failed to get InstanceID token. Error : %@ ." , error];
228
224
FIRLogError (kFIRLoggerRemoteConfig , @" I-RCN000073" , @" %@ " ,
229
225
[NSString stringWithFormat: @" %@ " , errorDescription]);
230
226
self->_settings .isFetchInProgress = NO ;
@@ -238,21 +234,20 @@ - (void)refreshInstallationsTokenWithCompletionHandler:
238
234
}]];
239
235
}
240
236
241
- // We have a valid token. Get the backing installationID .
237
+ // If the token is available, try to get the instanceID .
242
238
__weak RCNConfigFetch *weakSelf = self;
243
- [installations installationIDWithCompletion: ^(NSString *_Nullable identifier,
244
- NSError *_Nullable error) {
239
+ [instanceID getIDWithHandler: ^(NSString *_Nullable identity, NSError *_Nullable error) {
245
240
RCNConfigFetch *strongSelf = weakSelf;
246
241
247
242
// Dispatch to the RC serial queue to update settings on the queue.
248
243
dispatch_async (strongSelf->_lockQueue , ^{
249
244
RCNConfigFetch *strongSelfQueue = weakSelf;
250
245
251
246
// 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 ;
254
249
255
- if (!identifier || error) {
250
+ if (!identity || error) {
256
251
NSString *errorDescription =
257
252
[NSString stringWithFormat: @" Error getting iid : %@ ." , error];
258
253
FIRLogError (kFIRLoggerRemoteConfig , @" I-RCN000055" , @" %@ " ,
@@ -270,23 +265,56 @@ - (void)refreshInstallationsTokenWithCompletionHandler:
270
265
}
271
266
272
267
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];
281
272
});
282
273
}];
283
274
};
284
-
285
275
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
+ }];
287
315
}
288
316
289
- - (void )getAnalyticsUserPropertiesWithCompletionHandler :
317
+ - (void )fetchWithUserPropertiesCompletionHandler :
290
318
(FIRAInteropUserPropertiesCallback)completionHandler {
291
319
FIRLogDebug (kFIRLoggerRemoteConfig , @" I-RCN000060" , @" Fetch with user properties completed." );
292
320
id <FIRAnalyticsInterop> analytics = self->_analytics ;
@@ -562,8 +590,6 @@ - (NSURLSessionDataTask *)URLSessionDataTaskWithContent:(NSData *)content
562
590
timeoutInterval: timeoutInterval];
563
591
URLRequest.HTTPMethod = kHTTPMethodPost ;
564
592
[URLRequest setValue: kContentTypeValueJSON forHTTPHeaderField: kContentTypeHeaderName ];
565
- [URLRequest setValue: _settings.configInstallationsToken
566
- forHTTPHeaderField: kInstallationsAuthTokenHeaderName ];
567
593
[URLRequest setValue: [[NSBundle mainBundle ] bundleIdentifier ]
568
594
forHTTPHeaderField: kiOSBundleIdentifierHeaderName];
569
595
[URLRequest setValue: @" gzip" forHTTPHeaderField: kContentEncodingHeaderName ];
0 commit comments