title: Xcode shows blank screen with tab view
body: <p><a href="https://i.stack.imgur.com/AC3k0.png" rel="nofollow noreferrer">iPhone simulator</a></p>
  <p>App delegate</p>
  <pre><code>import UIKit
  import Firebase
  import UserNotifications
  
  @UIApplicationMain
  class AppDelegate: UIResponder, UIApplicationDelegate {
      
      let gcmMessageIDKey = NSUUID().uuidString
  
      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&gt; Bool {
          FirebaseApp.configure()
          attemptToRegisterForNotifications(application: application)
          return true
      }
      
      func attemptToRegisterForNotifications(application: UIApplication) {
          Messaging.messaging().delegate = self
          UNUserNotificationCenter.current().delegate = self
          
          let options: UNAuthorizationOptions = [.alert, .badge, .sound]
          UNUserNotificationCenter.current().requestAuthorization(options: options) { (authorized, error) in
              if authorized {
                  print(&quot;DEBUG: SUCCESSFULLY REGISTERED FOR NOTIFICATIONS&quot;)
              }
          }
          
          application.registerForRemoteNotifications()
      }
  
      // MARK: UISceneSession Lifecycle
  
      func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -&gt; UISceneConfiguration {
          // Called when a new scene session is being created.
          // Use this method to select a configuration to create the new scene with.
          return UISceneConfiguration(name: &quot;Default Configuration&quot;, sessionRole: connectingSceneSession.role)
      }
  
      func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set&lt;UISceneSession&gt;) {
          // Called when the user discards a scene session.
          // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
          // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
      }
  
      func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
        // If you are receiving a notification message while your app is in the background,
        // this callback will not be fired till the user taps on the notification launching the application.
        // TODO: Handle data of notification
  
        // With swizzling disabled you must let Messaging know about the message, for Analytics
        // Messaging.messaging().appDidReceiveMessage(userInfo)
  
        // Print message ID.
        if let messageID = userInfo[gcmMessageIDKey] {
          print(&quot;Message ID: \(messageID)&quot;)
        }
  
        // Print full message.
        print(userInfo)
      }
  
      func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                       fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -&gt; Void) {
        // If you are receiving a notification message while your app is in the background,
        // this callback will not be fired till the user taps on the notification launching the application.
        // TODO: Handle data of notification
  
        // With swizzling disabled you must let Messaging know about the message, for Analytics
        // Messaging.messaging().appDidReceiveMessage(userInfo)
  
        // Print message ID.
        if let messageID = userInfo[gcmMessageIDKey] {
          print(&quot;Message ID: \(messageID)&quot;)
        }
  
        // Print full message.
        print(userInfo)
  
        completionHandler(UIBackgroundFetchResult.newData)
      }
  }
  
  extension AppDelegate: MessagingDelegate {
      func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
          print(&quot;DEBUG: Registered for notifications with device token: &quot;, deviceToken)
          Messaging.messaging().apnsToken = deviceToken
      }
      
      func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
          print(&quot;DEBUG: Registered with FCM Token: &quot;, fcmToken)
      }
  }
  
  @available(iOS 10, *)
  extension AppDelegate : UNUserNotificationCenterDelegate {
  
    // Receive displayed notifications for iOS 10 devices.
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
      withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -&gt; Void) {
      let userInfo = notification.request.content.userInfo
  
      // With swizzling disabled you must let Messaging know about the message, for Analytics
      // Messaging.messaging().appDidReceiveMessage(userInfo)
  
      // Print message ID.
      if let messageID = userInfo[gcmMessageIDKey] {
        print(&quot;Message ID: \(messageID)&quot;)
      }
  
      // Print full message.
      print(userInfo)
  
      // Change this to your preferred presentation option
      completionHandler([[.alert, .sound]])
    }
  
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -&gt; Void) {
      let userInfo = response.notification.request.content.userInfo
      // Print message ID.
      if let messageID = userInfo[gcmMessageIDKey] {
        print(&quot;Message ID: \(messageID)&quot;)
      }
  
      // With swizzling disabled you must let Messaging know about the message, for Analytics
      // Messaging.messaging().appDidReceiveMessage(userInfo)
  
      // Print full message.
      print(userInfo)
  
      completionHandler()
    }
  }
  </code></pre>
  <p>Scene delegate:</p>
  <pre><code>import UIKit
  
  class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  
      var window: UIWindow?
  
  
      func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
          
          guard let scene = (scene as? UIWindowScene) else { return }
          window = UIWindow(windowScene: scene)
          window?.rootViewController = MainTabController()
          window?.makeKeyAndVisible()
      }
  
      func sceneDidDisconnect(_ scene: UIScene) {
          // Called as the scene is being released by the system.
          // This occurs shortly after the scene enters the background, or when its session is discarded.
          // Release any resources associated with this scene that can be re-created the next time the scene connects.
          // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
      }
  
      func sceneDidBecomeActive(_ scene: UIScene) {
          // Called when the scene has moved from an inactive state to an active state.
          // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
      }
  
      func sceneWillResignActive(_ scene: UIScene) {
          // Called when the scene will move from an active state to an inactive state.
          // This may occur due to temporary interruptions (ex. an incoming phone call).
      }
  
      func sceneWillEnterForeground(_ scene: UIScene) {
          // Called as the scene transitions from the background to the foreground.
          // Use this method to undo the changes made on entering the background.
      }
  
      func sceneDidEnterBackground(_ scene: UIScene) {
          // Called as the scene transitions from the foreground to the background.
          // Use this method to save data, release shared resources, and store enough scene-specific state information
          // to restore the scene back to its current state.
      }
  
  
  }
  </code></pre>
  <p>I have tried-:</p>
  <ul>
  <li>Rebooting Mac</li>
  <li>Removing main.storyboard file and adding it back</li>
  <li>Changed target from Launhscreen to main</li>
  </ul>
  <p>Since the app is able to show me push notifications and the login view controller. I am assuming the issue might be where my app has the root view controller set up. Because I can see the tab bar at the bottom.</p>