I don't think it has ever been safe to assume that any other code would get executed before didFinishLaunchingWithOptions. Important initialization should normally be done in the app delegate.
Workflow scenario: LaunchViewController.m decides if (fresh installation of app) AuthenticationViewController needs to appear or the Main Display window (after authentication) should appear.
This has been working fine for Xcode 8 and 9. With Xcode 11, AppDelegate.m's didFinishLaunchingWithOptions appears first, which is manageable.
But then because LaunchViewController has the storyboard entry point, its viewDidLoad would appear after didFinishLaunchingWithOptions
and that disrupts the workflow. Since it would decide whether to call AuthenticationViewController, we end up with this error:
Attempt to present <AuthenticationViewController: 0x> on <LaunchViewController: 0x> whose view is not in the window hierarchy!
No other view controller can be the initial view controller but the LaunchViewController but since it would appear right after AppDelegate's didFinishLaunchingWithOptions, it disrupts the workflow.
loadStoryBoard method of AppDelegate.m is not triggered at all in Xcode 8, 9, or 11. Ideally if we can have LaunchViewController's didViewLoad be called first to handle authentication or not (before AppDelegate), then the app will work with iOS 13 simulator, the purpose of this coding change.