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 mplayerControlle开发者_如何学编程rClass = 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.
You're right about __IPHONE_OS_VERSION_MIN_REQUIRED
: it's just whatever you put in your project. So any #if
statement you use will get evaluated at compile time, which isn't what you want.
Instead, do what you did initially, but with some minor changes, something like:
Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
id moviePlayerViewController = [[mplayerControllerClass alloc] initWithContentURL:movieUrl];
...
}
The point is that you shouldn't use MPMoviePlayerViewController
by itself, even if you've verified it should exist (in any case, I don't think it'll compile/link properly). But yes, this will work fine on a device with OS 3.0. (See, for example, Apple's OpenGL ES example for the same thing with CADisplayLink
.)
精彩评论