From 953d4cd7eb5ac5ac4cb99c46148babca4188b377 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Thu, 27 Nov 2025 20:36:28 +0000 Subject: [PATCH 1/3] feat(firebase_messaging): implement scene delegate support for iOS --- .../example/ios/Runner/AppDelegate.h | 2 +- .../example/ios/Runner/AppDelegate.m | 5 ++++- .../example/ios/Runner/Info.plist | 21 +++++++++++++++++++ .../FLTFirebaseMessagingPlugin.m | 2 ++ .../include/FLTFirebaseMessagingPlugin.h | 4 ++-- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h index 36e21bbf9cf4..01e6e1d4793a 100644 --- a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h +++ b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h @@ -1,6 +1,6 @@ #import #import -@interface AppDelegate : FlutterAppDelegate +@interface AppDelegate : FlutterAppDelegate @end diff --git a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m index 70e83933db14..cebafc9ec155 100644 --- a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m +++ b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m @@ -5,9 +5,12 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; // Override point for customization after application launch. return [super application:application didFinishLaunchingWithOptions:launchOptions]; } +- (void)didInitializeImplicitFlutterEngine:(NSObject*)engineBridge { + [GeneratedPluginRegistrant registerWithRegistry:engineBridge.pluginRegistry]; +} + @end diff --git a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist index b8293061bd33..cd5c989988e6 100644 --- a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist +++ b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist @@ -50,5 +50,26 @@ UIApplicationSupportsIndirectInputEvents + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneDelegateClassName + FlutterSceneDelegate + UISceneConfigurationName + flutter + UISceneStoryboardFile + Main + + + + 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 d62ffdc0dc2f..4f1e015cf019 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 @@ -89,6 +89,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { [registrar addMethodCallDelegate:instance channel:channel]; #if !TARGET_OS_OSX [registrar publish:instance]; // iOS only supported + [registrar addSceneDelegate:instance]; #endif } @@ -252,6 +253,7 @@ - (void)application_onDidFinishLaunchingNotification:(nonnull NSNotification *)n // https://github.com/google/GoogleUtilities/pull/162/files#diff-6bb6d1c46632fc66405a524071cc4baca5fc6a1a6c0eefef81d8c3e2c89cbc13L520-L533 // broke notifications which was released with firebase-ios-sdk v11.0.0 [_registrar addApplicationDelegate:self]; + // [_registrar addSceneDelegate:self]; #endif // Set UNUserNotificationCenter but preserve original delegate if necessary. diff --git a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h index 2f32bac24d5d..16ea20bbe147 100644 --- a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h +++ b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h @@ -49,10 +49,10 @@ API_AVAILABLE(ios(10.0)) FLTFirebasePlugin, FIRMessagingDelegate, UIApplicationDelegate, - UNUserNotificationCenterDelegate> + FlutterSceneLifeCycleDelegate> #else @interface FLTFirebaseMessagingPlugin - : FLTFirebasePlugin + : FLTFirebasePlugin #endif #endif @end From 578302482f715a4aa05734fa46d27ee408816284 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Mon, 1 Dec 2025 14:23:12 +0000 Subject: [PATCH 2/3] feat(firebase_messaging, iOS): add scene delegate support firebase_messaging --- .../example/ios/Runner/AppDelegate.h | 4 +-- .../example/ios/Runner/AppDelegate.m | 7 ++--- .../example/ios/Runner/Info.plist | 23 +------------- .../FLTFirebaseMessagingPlugin.m | 31 +++++++++++++++++-- .../include/FLTFirebaseMessagingPlugin.h | 25 ++++++++++++--- 5 files changed, 54 insertions(+), 36 deletions(-) diff --git a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h index 01e6e1d4793a..34dcb22c348e 100644 --- a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h +++ b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h @@ -1,6 +1,6 @@ #import #import -@interface AppDelegate : FlutterAppDelegate +@interface AppDelegate : FlutterAppDelegate -@end +@end \ No newline at end of file diff --git a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m index cebafc9ec155..959b6df359c4 100644 --- a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m +++ b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m @@ -5,12 +5,9 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; // Override point for customization after application launch. return [super application:application didFinishLaunchingWithOptions:launchOptions]; } -- (void)didInitializeImplicitFlutterEngine:(NSObject*)engineBridge { - [GeneratedPluginRegistrant registerWithRegistry:engineBridge.pluginRegistry]; -} - -@end +@end \ No newline at end of file diff --git a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist index cd5c989988e6..4f5a7f7dbfd2 100644 --- a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist +++ b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist @@ -50,26 +50,5 @@ UIApplicationSupportsIndirectInputEvents - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneClassName - UIWindowScene - UISceneDelegateClassName - FlutterSceneDelegate - UISceneConfigurationName - flutter - UISceneStoryboardFile - Main - - - - - + \ No newline at end of file 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 4f1e015cf019..7af15f16070f 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 @@ -89,7 +89,11 @@ + (void)registerWithRegistrar:(NSObject *)registrar { [registrar addMethodCallDelegate:instance channel:channel]; #if !TARGET_OS_OSX [registrar publish:instance]; // iOS only supported - [registrar addSceneDelegate:instance]; + if (@available(iOS 13.0, *)) { + if ([registrar respondsToSelector:@selector(addSceneDelegate:)]) { + [registrar performSelector:@selector(addSceneDelegate:) withObject:instance]; + } + } #endif } @@ -253,7 +257,6 @@ - (void)application_onDidFinishLaunchingNotification:(nonnull NSNotification *)n // https://github.com/google/GoogleUtilities/pull/162/files#diff-6bb6d1c46632fc66405a524071cc4baca5fc6a1a6c0eefef81d8c3e2c89cbc13L520-L533 // broke notifications which was released with firebase-ios-sdk v11.0.0 [_registrar addApplicationDelegate:self]; - // [_registrar addSceneDelegate:self]; #endif // Set UNUserNotificationCenter but preserve original delegate if necessary. @@ -532,6 +535,30 @@ - (BOOL)application:(UIApplication *)application } // didReceiveRemoteNotification #endif +#pragma mark - SceneDelegate Methods + +#if !TARGET_OS_OSX +- (BOOL)scene:(UIScene *)scene + willConnectToSession:(UISceneSession *)session + options:(UISceneConnectionOptions *)connectionOptions { + // Handle launch notification if present + NSDictionary *remoteNotification = + connectionOptions.notificationResponse.notification.request.content.userInfo; + if (remoteNotification != nil) { + // If remoteNotification exists, it is the notification that opened the app. + _initialNotification = + [FLTFirebaseMessagingPlugin remoteMessageUserInfoToDict:remoteNotification]; + _initialNotificationID = remoteNotification[@"gcm.message_id"]; + } + + // Register for remote notifications in scene delegate + // This is critical for getting APNS token when using UISceneDelegate + [[UIApplication sharedApplication] registerForRemoteNotifications]; + + return YES; +} +#endif + #pragma mark - Firebase Messaging API - (void)messagingUnsubscribeFromTopic:(id)arguments diff --git a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h index 16ea20bbe147..d233a4889764 100644 --- a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h +++ b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h @@ -29,6 +29,11 @@ // Suppress warning - use can add the Flutter plugin for Firebase Analytics. #define FIREBASE_ANALYTICS_SUPPRESS_WARNING +// Forward declaration for FlutterSceneLifeCycleDelegate if not available +#if !TARGET_OS_OSX +@protocol FlutterSceneLifeCycleDelegate; +#endif + #if TARGET_OS_OSX #ifdef __FF_NOTIFICATIONS_SUPPORTED_PLATFORM @interface FLTFirebaseMessagingPlugin : FLTFirebasePlugin + UIApplicationDelegate +#if __has_include() || defined(FlutterSceneLifeCycleDelegate) + , + FlutterSceneLifeCycleDelegate +#endif + > #else -@interface FLTFirebaseMessagingPlugin - : FLTFirebasePlugin +@interface FLTFirebaseMessagingPlugin : FLTFirebasePlugin ) || defined(FlutterSceneLifeCycleDelegate) + , + FlutterSceneLifeCycleDelegate +#endif + > #endif #endif -@end +@end \ No newline at end of file From e23e7f013f237ef4951ac132ead3ca57214d36ba Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Mon, 1 Dec 2025 14:38:22 +0000 Subject: [PATCH 3/3] chore: add missing newline at end of AppDelegate.h, AppDelegate.m, and Info.plist --- .../firebase_messaging/example/ios/Runner/AppDelegate.h | 2 +- .../firebase_messaging/example/ios/Runner/AppDelegate.m | 2 +- .../firebase_messaging/example/ios/Runner/Info.plist | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h index 34dcb22c348e..36e21bbf9cf4 100644 --- a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h +++ b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.h @@ -3,4 +3,4 @@ @interface AppDelegate : FlutterAppDelegate -@end \ No newline at end of file +@end diff --git a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m index 959b6df359c4..70e83933db14 100644 --- a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m +++ b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/AppDelegate.m @@ -10,4 +10,4 @@ - (BOOL)application:(UIApplication *)application return [super application:application didFinishLaunchingWithOptions:launchOptions]; } -@end \ No newline at end of file +@end diff --git a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist index 4f5a7f7dbfd2..b8293061bd33 100644 --- a/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist +++ b/packages/firebase_messaging/firebase_messaging/example/ios/Runner/Info.plist @@ -51,4 +51,4 @@ UIApplicationSupportsIndirectInputEvents - \ No newline at end of file +