I'm developing an app that I would like to deploy for iPhone 3.0, iPhone 4.0 and that can run on the iPad in emulate mode.
I'm developing with XCode 3.2.3 and I have videos to playback. I would like to use MPMoviePlayerViewController
for >= 3.2 and MPMoviePlayerController
for < 3.2.
If I use
Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil)
{
MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];
...
}
will an iPhone with OS 3.0 be able to handle a class it doesn't know?
Is it good to put the code inside __IPHONE_OS_VERSION_MIN_REQUIRED > 30200
ifelse block? like this:
Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];
...
}
but what does __IPHONE_OS_VERSION_MIN_REQUIRED
really do? It seems to me that it just repeats the settings I've setup for my project: min=3.0
On your first snippet, you are creating a class based on an NSString
. This is possible since you weak link your framework, such that old versions of the OS do not crash in this situation.
This is done in runtime, and will work as you expect.
The second snippet, on the other hand, uses a precompiler conditional. This will not have any effect, since in order for you to use MPMoviePlayerViewController
, you'll be using a Base SDK of 4.0, so the #if
will always be true.
Bottom line: weak linking is what you want, go ahead with your first snippet, and make sure the frameworks are weak linked.