2010-07-27 8 views
3

Je suis en train de développer une application que je voudrais déployer pour iPhone 3.0, iPhone 4.0 et qui peut fonctionner sur l'iPad en mode émulation.__IPHONE_OS_VERSION_MIN_REQUIRED veuillez expliquer

Je développe avec XCode 3.2.3 et j'ai des vidéos à lire. Je voudrais utiliser MPMoviePlayerViewController pour> = 3,2 et MPMoviePlayerController pour < 3.2.

Si je

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController"); 
if(mplayerControllerClass != nil) 
{ 
    MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl]; 

    ... 
} 

sera un iPhone avec OS 3.0 capable de gérer une classe, il ne sait pas?

Est-il bon de mettre le code à l'intérieur __IPHONE_OS_VERSION_MIN_REQUIRED > 30200 ifelse block? comme ceci:

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController"); 
if(mplayerControllerClass != nil) { 
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
    MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl]; 
    ... 
} 

mais que fait vraiment __IPHONE_OS_VERSION_MIN_REQUIRED? Il me semble qu'il ne fait que répéter les paramètres que j'ai configurés pour mon projet: min = 3.0

Répondre

2

Sur votre premier extrait, vous créez une classe basée sur NSString. Ceci est possible car vous faîtes un lien faible avec votre framework, de sorte que les anciennes versions de l'OS ne se bloquent pas dans cette situation. Ceci est fait dans l'exécution, et fonctionnera comme prévu.

Le deuxième extrait, en revanche, utilise un précompilateur conditionnel. Cela n'aura aucun effet, puisque pour utiliser MPMoviePlayerViewController, vous utiliserez un SDK de base de 4.0, donc le #if sera toujours vrai.

Ligne de fond: liaison faible est ce que vous voulez, allez-y avec votre premier extrait, et assurez-vous que les cadres sont faible lié.

2

Vous avez raison sur __IPHONE_OS_VERSION_MIN_REQUIRED: c'est juste ce que vous mettez dans votre projet. Donc toute instruction #if que vous utiliserez sera évaluée au moment de la compilation, ce qui n'est pas ce que vous voulez.

Au lieu de cela, faites ce que vous avez fait au départ, mais avec quelques modifications mineures, quelque chose comme:

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController"); 
if(mplayerControllerClass != nil) { 
    id moviePlayerViewController = [[mplayerControllerClass alloc] initWithContentURL:movieUrl]; 
    ... 
} 

Le point est que vous ne devriez pas utiliser MPMoviePlayerViewController par lui-même, même si vous avez vérifié qu'il devrait exister (en tout cas, je ne pense pas que cela va compiler/lier correctement). Mais oui, cela fonctionnera très bien sur un appareil avec OS 3.0. (Voir, par exemple, l'exemple OpenGL ES d'Apple pour la même chose avec CADisplayLink.)

+0

Vous pouvez inclure la nouvelle classe, à condition que votre SDK de base soit le nouveau. Voir l'exemple de code pomme pour '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

+0

@pgb, on dirait que tu as raison. Je pensais me souvenir de recevoir des avertissements dans le passé si je venais juste d'utiliser la classe. –

Questions connexes