Sorry, I realize I didn't say this right.
When you create a XIB file, you change the class of the File's Owner pseudo-object in the XIB to that of the intended owner object. The actual owner object is instantiated before the NIB file is loaded, and a pointer passed to the NIB loading process to be set as the actual File's Owner reference.
For a normal view controlled by a view controller, it's up to you to create an instance of the correct view controller class (the class that you put in the XIB for File's Owner). However, in the case of a main NIB, you don't create the owner object, so you don't control its class.
So, the error message tells you that iOS used the UIApplication object as owner of the main NIB, and this did not match the File's Owner class you put there.
I found an old iOS app of mine that didn't use storyboards. What I actually did (which I suppose was normal practice years ago, though I don't remember) was to NOT have a main nib specified in info plist. Instead, there was just a series of view XIBs, one of which was intended as the initial display. In my applicationDidFinishLaunching method, I had code like this (Obj-C in those days, of course):
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
myRootViewController = [[UITabBarController alloc] init];
myRootViewController.viewControllers = …;
self.window.rootViewController = myRootViewController;
Maybe you should try something like that, but also loading the initial NIB manually.