The delegate method:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
where you should get your variables, is run asynchronously.
And yes, it might get called after your RootViewController has been initialized.
You shouldn't perform the URL connection on your ViewController, as you might not yet have an access token.
You should perform this on the delegate method it self.
Now if you want to use a function of your ViewController and don't want to do the server communication in the AppDelegate, get a reference to your ViewController in your AppDelegate, make the URL function on your ViewController public, and call it.
As for getting a reference to your ViewController, this will be hard to answer, without knowing your App's design.
Assuming your App's RootViewController is a NavigationController and let's say the NavigationController RootViewController is named HomeNewViewController, this is how you would get a pointer reference to it from the App Delegate:
NavigationController *navigationController = (NavigationController*) [self.window rootViewController];
HomeNewViewController *homeController = (HomeNewViewController*)[navigationController.viewControllers objectAtIndex:0];
Then let's say in the HomeNewViewController, you have a function called uploadToken.
You could then do:
[homeController uploadToken];
and upload it.