@@ -68,7 +68,11 @@ + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
6868 [registrar addMethodCallDelegate: instance channel: channel];
6969 [registrar addMethodCallDelegate: instance channel: callbackChannel];
7070 [registrar addApplicationDelegate: instance];
71-
71+ #if __has_include(<Flutter/FlutterSceneLifeCycleDelegate.h>)
72+ if (@available (iOS 13.0 , *)) {
73+ [registrar addSceneDelegate: instance];
74+ }
75+ #endif
7276
7377}
7478
@@ -904,9 +908,20 @@ - (void)appDidBecomeActive {
904908
905909
906910+ (FlutterViewController*) getViewController {
907- UIViewController *topMostViewControllerObj = [[[UIApplication sharedApplication ] delegate ] window ].rootViewController ;
911+ UIWindow *window = nil ;
912+ if (@available (iOS 13.0 , *)) {
913+ for (UIWindowScene *scene in [UIApplication sharedApplication ].connectedScenes ) {
914+ if (scene.activationState == UISceneActivationStateForegroundActive) {
915+ window = scene.windows .firstObject ;
916+ break ;
917+ }
918+ }
919+ }
920+ if (window == nil ) {
921+ window = [[[UIApplication sharedApplication ] delegate ] window ];
922+ }
923+ UIViewController *topMostViewControllerObj = window.rootViewController ;
908924 FlutterViewController *flutterViewController = (FlutterViewController *)topMostViewControllerObj;
909-
910925 return flutterViewController;
911926}
912927
@@ -947,10 +962,52 @@ - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceAppl
947962// Open Universal Links
948963- (BOOL )application : (UIApplication *)application continueUserActivity : (NSUserActivity *)userActivity restorationHandler : (void (^)(NSArray * _Nullable))restorationHandler {
949964 [[AppsFlyerAttribution shared ] continueUserActivity: userActivity restorationHandler: restorationHandler];
950-
965+
951966 // Results of this are ORed and NO doesn't affect other delegate interceptors' result.
952967 return NO ;
953968}
954969
970+ #if __has_include(<Flutter/FlutterSceneLifeCycleDelegate.h>)
971+ #pragma mark - FlutterSceneLifeCycleDelegate
972+
973+ // UIScene-based URI-scheme deep links (iOS 13+, Flutter 3.41+ UIScene migration)
974+ - (BOOL )scene : (UIScene*)scene openURLContexts : (NSSet <UIOpenURLContext*>*)URLContexts API_AVAILABLE(ios(13.0 )) {
975+ for (UIOpenURLContext *context in URLContexts) {
976+ NSDictionary *opts = @{};
977+ if (context.options .sourceApplication ) {
978+ opts = @{UIApplicationOpenURLOptionsSourceApplicationKey: context.options .sourceApplication };
979+ }
980+ [[AppsFlyerAttribution shared ] handleOpenUrl: context.URL options: opts];
981+ }
982+ return NO ;
983+ }
984+
985+ // Cold-start deep links delivered via UISceneConnectionOptions (iOS 13+)
986+ // Handles both URI-scheme links (URLContexts) and Universal Links (userActivities)
987+ - (BOOL )scene : (UIScene*)scene
988+ willConnectToSession : (UISceneSession*)session
989+ options : (UISceneConnectionOptions*)connectionOptions API_AVAILABLE(ios(13.0 )) {
990+ for (UIOpenURLContext *context in connectionOptions.URLContexts ) {
991+ NSDictionary *opts = @{};
992+ if (context.options .sourceApplication ) {
993+ opts = @{UIApplicationOpenURLOptionsSourceApplicationKey: context.options .sourceApplication };
994+ }
995+ [[AppsFlyerAttribution shared ] handleOpenUrl: context.URL options: opts];
996+ }
997+ for (NSUserActivity *activity in connectionOptions.userActivities ) {
998+ if ([activity.activityType isEqualToString: NSUserActivityTypeBrowsingWeb ]) {
999+ [[AppsFlyerAttribution shared ] continueUserActivity: activity restorationHandler: nil ];
1000+ }
1001+ }
1002+ return NO ;
1003+ }
1004+
1005+ // UIScene-based Universal Links (iOS 13+)
1006+ - (BOOL )scene : (UIScene*)scene continueUserActivity : (NSUserActivity *)userActivity API_AVAILABLE(ios(13.0 )) {
1007+ [[AppsFlyerAttribution shared ] continueUserActivity: userActivity restorationHandler: nil ];
1008+ return NO ;
1009+ }
1010+ #endif // __has_include(<Flutter/FlutterSceneLifeCycleDelegate.h>)
1011+
9551012
9561013@end
0 commit comments