import Flutter import UIKit import UserNotifications import FirebaseCore import GoogleMaps import firebase_messaging @main @objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { func didInitializeImplicitFlutterEngine(_ engineBridge: any FlutterImplicitEngineBridge) { GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) // Run AFTER all plugins registered so Firebase sits in front of the VoIP plugin FLTFirebaseMessagingPlugin.configureNotificationCenterDelegate() } override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { FirebaseApp.configure() application.registerForRemoteNotifications() GMSServices.provideAPIKey("AIzaSyB6TERnxIr0yJ3qG4ULBZbu0sAD4tGqtng") initializePlatformChannels() return super.application(application, didFinishLaunchingWithOptions: launchOptions) } func initializePlatformChannels(){ DispatchQueue.main.async { [weak self] in guard let self = self else { return } // 1. Try accessing window via AppDelegate (legacy/single-window setup) var controller = self.window?.rootViewController as? FlutterViewController // 2. Fallback to UIWindowScene active window (modern iOS architecture) if controller == nil { controller = UIApplication.shared.connectedScenes .compactMap { $0 as? UIWindowScene } .flatMap { $0.windows } .first(where: { $0.isKeyWindow })? .rootViewController as? FlutterViewController } // 3. Perform initialization once FlutterViewController is available if let mainViewController = controller { HMGPenguinInPlatformBridge.initialize(flutterViewController: mainViewController) } else { print("⚠️ FlutterViewController not ready yet for initializePlatformChannels.") } } if let mainViewController = window?.rootViewController as? FlutterViewController{ // platform initialization suppose to be in foreground HMGPenguinInPlatformBridge.initialize(flutterViewController: mainViewController) } } override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken:Data){ // Messaging.messaging().apnsToken = deviceToken super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken) } }