Conditional support of iOS 6 features in an iOS 5 app
Asked Answered
B

1

7

How can you support features of iOS6 in an app with a Minimal Deployment Target set to iOS 5.0?

For example, if a user has iOS 5 he will see one UIActionSheet, if the user has iOS 6 he will see a different UIActionSheet for iOS 6? How do you do this? I have Xcode 4.5 and want an app running on iOS 5.

Barque answered 25/9, 2012 at 19:34 Comment(0)
S
19

You should always prefer detecting available methods/feature rather then iOS versions and then assuming a method is available.

See Apple documentation.

For example, in iOS 5 to display a modal view controller we would do something like this:

[self presentModalViewController:viewController animated:YES];

In iOS 6, the presentModalViewController:animated: method of UIViewController is Deprecated, you should use presentViewController:animated:completion: in iOS 6, but how do you know when to use what?

You could detect iOS version and have an if statement dictate if you use the former or latter but, this is fragile, you'll make a mistake, maybe a newer OS in the future will have a new way to do this.

The correct way to handle this is:

if([self respondsToSelector:@selector(presentViewController:animated:completion:)])
    [self presentViewController:viewController animated:YES completion:^{/* done */}];
else
    [self presentModalViewController:viewController animated:YES];

You could even argue that you should be more strict and do something like:

if([self respondsToSelector:@selector(presentViewController:animated:completion:)])
    [self presentViewController:viewController animated:YES completion:^{/* done */}];
else if([self respondsToSelector:@selector(presentViewController:animated:)])
    [self presentModalViewController:viewController animated:YES];
else
    NSLog(@"Oooops, what system is this !!! - should never see this !");

I'm unsure about your UIActionSheet example, as far as I'm aware this is the same on iOS 5 and 6. Maybe you are thinking of UIActivityViewController for sharing and you might like to fallback to a UIActionSheet if you're on iOS 5, so you might to check a class is available, see here how to do so.

Sympathize answered 25/9, 2012 at 19:47 Comment(3)
You can link to the framework in the project settings, in such a case that the framework may not be present on all versions, like your case, you simply set the include to be optional rather then required. ---- the question was deleted.... question/comment.Sympathize
@Daniel: How does one know on which methods to use respondsToSelector? Or one should do it with each method call?Igenia
respondsToSelector: will check availability of the method you pass to it on the receiver. So generally you will call this on the method you want to call. Sometimes you will call multiple methods which are part of the same iOS version/spec, so checking one you can assume the other are available.Sympathize

© 2022 - 2024 — McMap. All rights reserved.