3131#import " Crashlytics/Crashlytics/Helpers/FIRCLSDefines.h"
3232#include " Crashlytics/Crashlytics/Helpers/FIRCLSProfiling.h"
3333#include " Crashlytics/Crashlytics/Helpers/FIRCLSUtility.h"
34+ #import " Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h"
3435#import " Crashlytics/Crashlytics/Models/FIRCLSFileManager.h"
3536#import " Crashlytics/Crashlytics/Models/FIRCLSSettings.h"
3637#import " Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h"
4748#import " Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.h"
4849#import " Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h"
4950#import " Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h"
51+ #import " Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.h"
5052#import " Crashlytics/Crashlytics/Private/FIRCLSExistingReportManager_Private.h"
5153#import " Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h"
5254#import " Crashlytics/Crashlytics/Private/FIRExceptionModel_Private.h"
5860#import < GoogleDataTransport/GoogleDataTransport.h>
5961
6062@import FirebaseSessions;
63+ @import FirebaseRemoteConfigInterop;
64+ #if SWIFT_PACKAGE
65+ @import FirebaseCrashlyticsSwift;
66+ #else // Swift Package Manager
67+ #import < FirebaseCrashlytics/FirebaseCrashlytics-Swift.h>
68+ #endif // CocoaPods
6169
6270#if TARGET_OS_IPHONE
6371#import < UIKit/UIKit.h>
7684@protocol FIRCrashlyticsInstanceProvider <NSObject >
7785@end
7886
79- @interface FIRCrashlytics () <FIRLibrary, FIRCrashlyticsInstanceProvider, FIRSessionsSubscriber>
87+ @interface FIRCrashlytics () <FIRLibrary,
88+ FIRCrashlyticsInstanceProvider,
89+ FIRSessionsSubscriber,
90+ FIRRolloutsStateSubscriber>
8091
8192@property (nonatomic ) BOOL didPreviouslyCrash;
8293@property (nonatomic , copy ) NSString *googleAppID;
@@ -91,6 +102,8 @@ @interface FIRCrashlytics () <FIRLibrary, FIRCrashlyticsInstanceProvider, FIRSes
91102
92103@property (nonatomic , strong ) FIRCLSAnalyticsManager *analyticsManager;
93104
105+ @property (nonatomic , strong ) FIRCLSRemoteConfigManager *remoteConfigManager;
106+
94107// Dependencies common to each of the Controllers
95108@property (nonatomic , strong ) FIRCLSManagerData *managerData;
96109
@@ -104,7 +117,8 @@ - (instancetype)initWithApp:(FIRApp *)app
104117 appInfo : (NSDictionary *)appInfo
105118 installations : (FIRInstallations *)installations
106119 analytics : (id <FIRAnalyticsInterop>)analytics
107- sessions : (id <FIRSessionsProvider>)sessions {
120+ sessions : (id <FIRSessionsProvider>)sessions
121+ remoteConfig : (id <FIRRemoteConfigInterop>)remoteConfig {
108122 self = [super init ];
109123
110124 if (self) {
@@ -189,8 +203,19 @@ - (instancetype)initWithApp:(FIRApp *)app
189203 }] catch: ^void (NSError *error) {
190204 FIRCLSErrorLog (@" Crash reporting failed to initialize with error: %@ " , error);
191205 }];
192- }
193206
207+ // RemoteConfig subscription should be made after session report directory created.
208+ if (remoteConfig) {
209+ FIRCLSDebugLog (@" Registering RemoteConfig SDK subscription for rollouts data" );
210+
211+ FIRCLSRolloutsPersistenceManager *persistenceManager =
212+ [[FIRCLSRolloutsPersistenceManager alloc ] initWithFileManager: _fileManager];
213+ _remoteConfigManager =
214+ [[FIRCLSRemoteConfigManager alloc ] initWithRemoteConfig: remoteConfig
215+ persistenceDelegate: persistenceManager];
216+ [remoteConfig registerRolloutsStateSubscriber: self for: FIRRemoteConfigConstants.FIRNamespaceGoogleMobilePlatform];
217+ }
218+ }
194219 return self;
195220}
196221
@@ -215,6 +240,7 @@ + (void)load {
215240
216241 id <FIRAnalyticsInterop> analytics = FIR_COMPONENT (FIRAnalyticsInterop, container);
217242 id <FIRSessionsProvider> sessions = FIR_COMPONENT (FIRSessionsProvider, container);
243+ id <FIRRemoteConfigInterop> remoteConfig = FIR_COMPONENT (FIRRemoteConfigInterop, container);
218244
219245 FIRInstallations *installations = [FIRInstallations installationsWithApp: container.app];
220246
@@ -224,7 +250,8 @@ + (void)load {
224250 appInfo: NSBundle .mainBundle.infoDictionary
225251 installations: installations
226252 analytics: analytics
227- sessions: sessions];
253+ sessions: sessions
254+ remoteConfig: remoteConfig];
228255 };
229256
230257 FIRComponent *component =
@@ -377,11 +404,13 @@ - (void)recordError:(NSError *)error {
377404}
378405
379406- (void )recordError : (NSError *)error userInfo : (NSDictionary <NSString *, id> *)userInfo {
380- FIRCLSUserLoggingRecordError (error, userInfo);
407+ NSString *rolloutsInfoJSON = [_remoteConfigManager getRolloutAssignmentsEncodedJsonString ];
408+ FIRCLSUserLoggingRecordError (error, userInfo, rolloutsInfoJSON);
381409}
382410
383411- (void )recordExceptionModel : (FIRExceptionModel *)exceptionModel {
384- FIRCLSExceptionRecordModel (exceptionModel);
412+ NSString *rolloutsInfoJSON = [_remoteConfigManager getRolloutAssignmentsEncodedJsonString ];
413+ FIRCLSExceptionRecordModel (exceptionModel, rolloutsInfoJSON);
385414}
386415
387416- (void )recordOnDemandExceptionModel : (FIRExceptionModel *)exceptionModel {
@@ -407,4 +436,14 @@ - (FIRSessionsSubscriberName)sessionsSubscriberName {
407436 return FIRSessionsSubscriberNameCrashlytics;
408437}
409438
439+ #pragma mark - FIRRolloutsStateSubscriber
440+ - (void )rolloutsStateDidChange : (FIRRolloutsState *_Nonnull)rolloutsState {
441+ if (!_remoteConfigManager) {
442+ FIRCLSDebugLog (@" rolloutsStateDidChange gets called without init the rc manager." );
443+ return ;
444+ }
445+ NSString *currentReportID = _managerData.executionIDModel .executionID ;
446+ [_remoteConfigManager updateRolloutsStateWithRolloutsState: rolloutsState
447+ reportID: currentReportID];
448+ }
410449@end
0 commit comments