views:

313

answers:

2

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

+2  A: 

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.)

Jesse Beder
You can include the new class, as long as your Base SDK is the new one. See apple sample code for `MessageUI`: http://developer.apple.com/IPhone/library/samplecode/MailComposer/Listings/Classes_MailComposerViewController_m.html#//apple_ref/doc/uid/DTS40008865-Classes_MailComposerViewController_m-DontLinkElementID_6
pgb
@pgb, it looks like you're right. I thought I remembered getting some warnings in the past if I just used the class.
Jesse Beder
A: 

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.

pgb