this is how i achieve #1 in my application, i dont load up the tabBarcontroller initally when the application loads. first i load my log in controller, then when the server sends back a messege stating if the user has logged in or not then i show my tabBarcontroller
in your applicaitons delegate you have these lines of code in the - (BOOL)application

UIApplication *)application didFinishLaunchingWithOptions

NSDictionary *)launchOptions method
Code:
[self.window addSubview:tabBarController.view];
[self.window makeKeyAndVisible];
;
now just place an object of your log in view controller before these lines of code and add it to the window like so
Code:
MyLogInController *logInVC = [[MyLogInController alloc]initWithNibName:@"MyLogInController" bundle:nil];
[self.window addSubview:logInVC.view];
[self.window makeKeyAndVisible];
return YES;
;
In this example I have a tabController so just place the tab controller on the window after you have completed validating users log in info like so
1)make a reference to the application delegate
2)add tabBarController to view
Code:
MyApplicationDelegate *del = (MyApplicationDelegate)[[UIApplication sharedApplication]delegate];
[del.window addSubview:tabBarController.view];
just make sure you release the log in view controller before you do it or it will just be sitting in the background using memory