From 5e1472b49283e8c2374529ce89edb65ee0e8ea0b Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Fri, 29 Jun 2018 11:39:45 -0700 Subject: Fix the race condition of global data flag and fcm auto init enabled flag (#1466) --- Example/Messaging/Tests/FIRMessagingTest.m | 15 +++++++++++---- Firebase/Messaging/FIRMessaging+FIRApp.m | 22 ---------------------- Firebase/Messaging/FIRMessaging.m | 8 ++------ Firebase/Messaging/FIRMessaging_Private.h | 3 --- 4 files changed, 13 insertions(+), 35 deletions(-) diff --git a/Example/Messaging/Tests/FIRMessagingTest.m b/Example/Messaging/Tests/FIRMessagingTest.m index 61ff136..92cf0f5 100644 --- a/Example/Messaging/Tests/FIRMessagingTest.m +++ b/Example/Messaging/Tests/FIRMessagingTest.m @@ -17,6 +17,8 @@ #import #import + +#import #import #import "FIRMessaging.h" @@ -44,6 +46,7 @@ extern NSString *const kFIRMessagingFCMTokenFetchAPNSOption; @property(nonatomic, readonly, strong) FIRMessaging *messaging; @property(nonatomic, readwrite, strong) id mockMessaging; @property(nonatomic, readwrite, strong) id mockInstanceID; +@property(nonatomic, readwrite, strong) id mockFirebaseApp; @end @@ -51,6 +54,9 @@ extern NSString *const kFIRMessagingFCMTokenFetchAPNSOption; - (void)setUp { [super setUp]; + _mockFirebaseApp = OCMClassMock([FIRApp class]); + OCMStub([_mockFirebaseApp defaultApp]).andReturn(_mockFirebaseApp); + _messaging = [[FIRMessaging alloc] initWithInstanceID:[FIRInstanceID instanceID] userDefaults:[NSUserDefaults standardUserDefaults]]; _mockMessaging = OCMPartialMock(self.messaging); @@ -63,6 +69,7 @@ extern NSString *const kFIRMessagingFCMTokenFetchAPNSOption; - (void)tearDown { [_mockMessaging stopMocking]; [_mockInstanceID stopMocking]; + [_mockFirebaseApp stopMocking]; [super tearDown]; } @@ -76,7 +83,7 @@ extern NSString *const kFIRMessagingFCMTokenFetchAPNSOption; } - (void)testAutoInitEnableFlagOverrideGlobalTrue { - OCMStub([self.mockMessaging isGlobalAutomaticDataCollectionEnabled]).andReturn(YES); + OCMStub([_mockFirebaseApp isAutomaticDataCollectionEnabled]).andReturn(YES); id bundleMock = OCMPartialMock([NSBundle mainBundle]); OCMStub([bundleMock objectForInfoDictionaryKey:kFIRMessagingPlistAutoInitEnabled]).andReturn(nil); XCTAssertTrue(self.messaging.isAutoInitEnabled); @@ -87,7 +94,7 @@ extern NSString *const kFIRMessagingFCMTokenFetchAPNSOption; } - (void)testAutoInitEnableFlagOverrideGlobalFalse { - OCMStub([self.mockMessaging isGlobalAutomaticDataCollectionEnabled]).andReturn(YES); + OCMStub([_mockFirebaseApp isAutomaticDataCollectionEnabled]).andReturn(YES); id bundleMock = OCMPartialMock([NSBundle mainBundle]); OCMStub([bundleMock objectForInfoDictionaryKey:kFIRMessagingPlistAutoInitEnabled]).andReturn(nil); XCTAssertTrue(self.messaging.isAutoInitEnabled); @@ -98,7 +105,7 @@ extern NSString *const kFIRMessagingFCMTokenFetchAPNSOption; } - (void)testAutoInitEnableGlobalDefaultTrue { - OCMStub([self.mockMessaging isGlobalAutomaticDataCollectionEnabled]).andReturn(YES); + OCMStub([_mockFirebaseApp isAutomaticDataCollectionEnabled]).andReturn(YES); id bundleMock = OCMPartialMock([NSBundle mainBundle]); OCMStub([bundleMock objectForInfoDictionaryKey:kFIRMessagingPlistAutoInitEnabled]).andReturn(nil); @@ -107,7 +114,7 @@ extern NSString *const kFIRMessagingFCMTokenFetchAPNSOption; } - (void)testAutoInitEnableGlobalDefaultFalse { - OCMStub([self.mockMessaging isGlobalAutomaticDataCollectionEnabled]).andReturn(NO); + OCMStub([_mockFirebaseApp isAutomaticDataCollectionEnabled]).andReturn(NO); id bundleMock = OCMPartialMock([NSBundle mainBundle]); OCMStub([bundleMock objectForInfoDictionaryKey:kFIRMessagingPlistAutoInitEnabled]).andReturn(nil); diff --git a/Firebase/Messaging/FIRMessaging+FIRApp.m b/Firebase/Messaging/FIRMessaging+FIRApp.m index d48a3b4..dda360c 100644 --- a/Firebase/Messaging/FIRMessaging+FIRApp.m +++ b/Firebase/Messaging/FIRMessaging+FIRApp.m @@ -26,12 +26,6 @@ #import "FIRMessagingVersionUtilities.h" #import "FIRMessaging_Private.h" -@interface FIRMessaging () - -@property(nonatomic, readwrite, strong) NSString *fcmSenderID; - -@end - @implementation FIRMessaging (FIRApp) + (void)load { @@ -58,22 +52,6 @@ } - (void)configureMessaging:(FIRApp *)app { - FIROptions *options = app.options; - NSError *error; - if (!options.GCMSenderID.length) { - error = - [FIRApp errorForSubspecConfigurationFailureWithDomain:kFirebaseCloudMessagingErrorDomain - errorCode:FIRErrorCodeCloudMessagingFailed - service:kFIRServiceMessaging - reason:@"Google Sender ID must not be nil" - @" or empty."]; - [self exitApp:app withError:error]; - return; - } - - self.fcmSenderID = [options.GCMSenderID copy]; - self.globalAutomaticDataCollectionEnabled = [app isAutomaticDataCollectionEnabled]; - // Swizzle remote-notification-related methods (app delegate and UNUserNotificationCenter) if ([FIRMessagingRemoteNotificationsProxy canSwizzleMethods]) { NSString *docsURLString = @"https://firebase.google.com/docs/cloud-messaging/ios/client" diff --git a/Firebase/Messaging/FIRMessaging.m b/Firebase/Messaging/FIRMessaging.m index fa4bdbc..1152032 100644 --- a/Firebase/Messaging/FIRMessaging.m +++ b/Firebase/Messaging/FIRMessaging.m @@ -36,6 +36,7 @@ #import "FIRMessagingUtilities.h" #import "FIRMessagingVersionUtilities.h" +#import #import #import @@ -127,7 +128,6 @@ NSString *const kFIRMessagingPlistAutoInitEnabled = FIRReachabilityDelegate> // FIRApp properties -@property(nonatomic, readwrite, copy) NSString *fcmSenderID; @property(nonatomic, readwrite, strong) NSData *apnsTokenData; @property(nonatomic, readwrite, strong) NSString *defaultFcmToken; @@ -173,10 +173,6 @@ NSString *const kFIRMessagingPlistAutoInitEnabled = _loggedMessageIDs = [NSMutableSet set]; _instanceID = instanceID; _messagingUserDefaults = defaults; - - // TODO: Remove this once the race condition with FIRApp configuring and InstanceID - // is fixed. This must be fixed before Core's flag becomes public. - _globalAutomaticDataCollectionEnabled = YES; } return self; } @@ -479,7 +475,7 @@ NSString *const kFIRMessagingPlistAutoInitEnabled = } // If none of above exists, we default to the global switch that comes from FIRApp. - return self.isGlobalAutomaticDataCollectionEnabled; + return [[FIRApp defaultApp] isAutomaticDataCollectionEnabled]; } - (void)setAutoInitEnabled:(BOOL)autoInitEnabled { diff --git a/Firebase/Messaging/FIRMessaging_Private.h b/Firebase/Messaging/FIRMessaging_Private.h index 6bac99d..143cc9f 100644 --- a/Firebase/Messaging/FIRMessaging_Private.h +++ b/Firebase/Messaging/FIRMessaging_Private.h @@ -38,9 +38,6 @@ FOUNDATION_EXPORT NSString *const kFIRMessagingUserDefaultsKeyAutoInitEnabled; #pragma mark - Private API -// The data collection flag from Core. -@property(nonatomic, readwrite, getter=isGlobalAutomaticDataCollectionEnabled) BOOL globalAutomaticDataCollectionEnabled; - - (NSString *)defaultFcmToken; - (FIRMessagingClient *)client; - (FIRMessagingPubSub *)pubsub; -- cgit v1.2.3