diff --git a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m index 77f2078991c6..ff5ea02c58ad 100644 --- a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m +++ b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m @@ -229,6 +229,16 @@ - (void)setupNotificationHandlingWithRemoteNotification: [self setupNotificationHandlingWithRemoteNotification:remoteNotification actionIdentifier:nil]; } +- (void)registerForRemoteNotifications { +#if TARGET_OS_OSX + if (@available(macOS 10.14, *)) { + [[NSApplication sharedApplication] registerForRemoteNotifications]; + } +#else + [[UIApplication sharedApplication] registerForRemoteNotifications]; +#endif +} + - (void)setupNotificationHandlingWithRemoteNotification:(nullable NSDictionary *)remoteNotification actionIdentifier:(nullable NSString *)actionIdentifier { // If notification handling was already set up (e.g. from @@ -359,14 +369,11 @@ - (void)setupNotificationHandlingWithRemoteNotification:(nullable NSDictionary * // We automatically register for remote notifications as // application:didReceiveRemoteNotification:fetchCompletionHandler: will not get called unless // registerForRemoteNotifications is called early on during app initialization, calling this from - // Dart would be too late. -#if TARGET_OS_OSX - if (@available(macOS 10.14, *)) { - [[NSApplication sharedApplication] registerForRemoteNotifications]; + // Dart would be too late. Defer registration when auto-init is disabled so the APNs token cannot + // trigger FCM registration before the user opts in. + if ([FIRMessaging messaging].isAutoInitEnabled) { + [self registerForRemoteNotifications]; } -#else - [[UIApplication sharedApplication] registerForRemoteNotifications]; -#endif } - (void)markInitialNotificationGatheredAfterDelay { @@ -521,13 +528,15 @@ - (void)application:(NSApplication *)application - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { #endif - if ([FIRMessaging messaging] == nil) { + FIRMessaging *messaging = [FIRMessaging messaging]; + if (!messaging.isAutoInitEnabled) { _apnsToken = deviceToken; + return; } #ifdef DEBUG - [[FIRMessaging messaging] setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeSandbox]; + [messaging setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeSandbox]; #else - [[FIRMessaging messaging] setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeProd]; + [messaging setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeProd]; #endif } @@ -704,7 +713,12 @@ - (void)messagingSubscribeToTopic:(id)arguments - (void)messagingSetAutoInitEnabled:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallResult *)result { FIRMessaging *messaging = [FIRMessaging messaging]; - messaging.autoInitEnabled = [arguments[@"enabled"] boolValue]; + BOOL enabled = [arguments[@"enabled"] boolValue]; + messaging.autoInitEnabled = enabled; + if (enabled) { + [self registerForRemoteNotifications]; + [self ensureAPNSTokenSetting]; + } result.success(@{ @"isAutoInitEnabled" : @(messaging.isAutoInitEnabled), }); @@ -1182,11 +1196,11 @@ + (NSDictionary *)remoteMessageUserInfoToDict:(NSDictionary *)userInfo - (void)ensureAPNSTokenSetting { FIRMessaging *messaging = [FIRMessaging messaging]; - if (messaging.APNSToken == nil && _apnsToken != nil) { + if (messaging.isAutoInitEnabled && messaging.APNSToken == nil && _apnsToken != nil) { #ifdef DEBUG - [[FIRMessaging messaging] setAPNSToken:_apnsToken type:FIRMessagingAPNSTokenTypeSandbox]; + [messaging setAPNSToken:_apnsToken type:FIRMessagingAPNSTokenTypeSandbox]; #else - [[FIRMessaging messaging] setAPNSToken:_apnsToken type:FIRMessagingAPNSTokenTypeProd]; + [messaging setAPNSToken:_apnsToken type:FIRMessagingAPNSTokenTypeProd]; #endif _apnsToken = nil; }