So, it appears that you can trigger the system's re-evaluation of which device orientations are allowed. This will happen whenever a viewController is presented full-screen modally.
Therefore, (it's a nasty hack but it appears to work) you can ask the root VC to present a VC which only allows landscape orientations, and then as soon as it has been presented, dismiss it again.
e.g. see code below:
- (void)viewDidAppear:(BOOL)animated
{
// Force an orientation update if we are not in landscape...
BOOL force = YES;
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft)
{
force = NO;
}
if (force)
{
PortraitOnlyViewController *newVC = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"forceLandscape"];
[self.navigationController presentViewController:newVC animated:NO completion:^(void){
NSLog(@"forcing VC has been presented.");
[self.navigationController dismissViewControllerAnimated:NO completion:^(void){
NSLog(@"forcing VC has been dismissed");
}];
}];
}
}