Skip to content

Commit 3d3eafc

Browse files
authored
fix: Crashlytics defer API calls until async context initialization completes (#15879)
1 parent 9095dfa commit 3d3eafc

File tree

3 files changed

+41
-11
lines changed

3 files changed

+41
-11
lines changed

Crashlytics/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Unreleased
2+
- [fixed] Fixed an issue where Crashlytics API calls were silently dropped if invoked immediately after Firebase initialization.
3+
14
# 12.10.0
25
- [fixed] Fixed a deadlock in Firebase Sessions where the main thread could
36
block waiting for a lock held by a background thread during settings

Crashlytics/Crashlytics/Components/FIRCLSUserLogging.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ void FIRCLSUserLoggingRecordKeysAndValues(NSDictionary *keysAndValues,
241241
FIRCLSUserLoggingKVStorage *storage,
242242
uint32_t *counter) {
243243
if (!FIRCLSContextIsInitialized()) {
244+
FIRCLSSDKLogWarn(
245+
"Failed to write key/value pairs. Crashlytics context has not initialized yet.\n");
244246
return;
245247
}
246248

@@ -317,6 +319,8 @@ static void FIRCLSUserLoggingWriteKeysAndValues(NSDictionary *keysAndValues,
317319

318320
NSArray *FIRCLSUserLoggingStoredKeyValues(const char *path) {
319321
if (!FIRCLSContextIsInitialized()) {
322+
FIRCLSSDKLogWarn(
323+
"Failed to read key/value pairs. Crashlytics context has not initialized yet.\n");
320324
return nil;
321325
}
322326

@@ -394,6 +398,7 @@ void FIRCLSUserLoggingRecordError(NSError *error,
394398
}
395399

396400
if (!FIRCLSContextIsInitialized()) {
401+
FIRCLSSDKLogWarn("Failed to record error. Crashlytics context has not initialized yet.\n");
397402
return;
398403
}
399404

Crashlytics/Crashlytics/FIRCrashlytics.m

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,10 @@ - (void)processDidCrashDuringPreviousExecution {
311311

312312
#pragma mark - API: Logging
313313
- (void)log:(NSString *)msg {
314-
FIRCLSLog(@"%@", msg);
314+
[self waitForContextInit:@"log"
315+
callback:^{
316+
FIRCLSLog(@"%@", msg);
317+
}];
315318
}
316319

317320
- (void)logWithFormat:(NSString *)format, ... {
@@ -354,17 +357,26 @@ - (void)deleteUnsentReports {
354357

355358
#pragma mark - API: setUserID
356359
- (void)setUserID:(nullable NSString *)userID {
357-
FIRCLSUserLoggingRecordInternalKeyValue(FIRCLSUserIdentifierKey, userID);
360+
[self waitForContextInit:@"setUserID"
361+
callback:^{
362+
FIRCLSUserLoggingRecordInternalKeyValue(FIRCLSUserIdentifierKey, userID);
363+
}];
358364
}
359365

360366
#pragma mark - API: setCustomValue
361367

362368
- (void)setCustomValue:(nullable id)value forKey:(NSString *)key {
363-
FIRCLSUserLoggingRecordUserKeyValue(key, value);
369+
[self waitForContextInit:@"setCustomValue"
370+
callback:^{
371+
FIRCLSUserLoggingRecordUserKeyValue(key, value);
372+
}];
364373
}
365374

366375
- (void)setCustomKeysAndValues:(NSDictionary *)keysAndValues {
367-
FIRCLSUserLoggingRecordUserKeysAndValues(keysAndValues);
376+
[self waitForContextInit:@"setCustomKeysAndValues"
377+
callback:^{
378+
FIRCLSUserLoggingRecordUserKeysAndValues(keysAndValues);
379+
}];
368380
}
369381

370382
#pragma mark - API: Development Platform
@@ -414,19 +426,29 @@ - (void)recordError:(NSError *)error {
414426

415427
- (void)recordError:(NSError *)error userInfo:(NSDictionary<NSString *, id> *)userInfo {
416428
NSString *rolloutsInfoJSON = [_remoteConfigManager getRolloutAssignmentsEncodedJsonString];
417-
FIRCLSUserLoggingRecordError(error, userInfo, rolloutsInfoJSON);
429+
[self waitForContextInit:@"recordError"
430+
callback:^{
431+
FIRCLSUserLoggingRecordError(error, userInfo, rolloutsInfoJSON);
432+
}];
418433
}
419434

420435
- (void)recordExceptionModel:(FIRExceptionModel *)exceptionModel {
421436
NSString *rolloutsInfoJSON = [_remoteConfigManager getRolloutAssignmentsEncodedJsonString];
422-
FIRCLSExceptionRecordModel(exceptionModel, rolloutsInfoJSON);
437+
[self waitForContextInit:@"recordExceptionModel"
438+
callback:^{
439+
FIRCLSExceptionRecordModel(exceptionModel, rolloutsInfoJSON);
440+
}];
423441
}
424442

425443
- (void)recordOnDemandExceptionModel:(FIRExceptionModel *)exceptionModel {
426-
[self.managerData.onDemandModel
427-
recordOnDemandExceptionIfQuota:exceptionModel
428-
withDataCollectionEnabled:[self.dataArbiter isCrashlyticsCollectionEnabled]
429-
usingExistingReportManager:self.existingReportManager];
444+
[self waitForContextInit:@"recordOnDemandExceptionModel"
445+
callback:^{
446+
[self.managerData.onDemandModel
447+
recordOnDemandExceptionIfQuota:exceptionModel
448+
withDataCollectionEnabled:[self.dataArbiter
449+
isCrashlyticsCollectionEnabled]
450+
usingExistingReportManager:self.existingReportManager];
451+
}];
430452
}
431453

432454
#pragma mark - FIRSessionsSubscriber
@@ -456,7 +478,7 @@ - (void)rolloutsStateDidChange:(FIRRolloutsState *_Nonnull)rolloutsState {
456478
reportID:currentReportID];
457479
}
458480

459-
#pragma mark - Private Helpsers
481+
#pragma mark - Private Helpers
460482
- (void)waitForContextInit:(NSString *)contextLog callback:(void (^)(void))callback {
461483
if (!_contextInitPromise) {
462484
FIRCLSErrorLog(@"Crashlytics method called before SDK was initialized: %@", contextLog);

0 commit comments

Comments
 (0)