如何为iOS 3.0和iOS 3.2拆分代码,以便在操作系统版本为3.2及以上时使用MPMoviePlayerViewController

3
我有一个视频要播放。在iOS 3.2中,我使用MPMoviePlayerViewController来使用全屏功能(似乎只能使用该类)。但是,如果我想构建iOS 3.0,则会出现多个错误,因为该类在iOS 3.0中不被识别。我也知道如何在iOS 3.0中使用MPMoviePlayerController来实现我的目的,但我只能选择其中一个,即iOS 3.0的代码或iOS 3.2的代码。
如何处理这个问题?-找到了解决方案(请参见编辑底部)。
我想我必须使用多个目标,你有关于如何做到这一点的建议吗(每次我尝试多个目标时都会出错,然后放弃:))?
编辑捆绑(多个编辑组合)
起初我认为这会有效。
#ifdef __IPHONE_3_0
// OS 3.0 specific
#endif

但是实际上并不会这样,因为在iOS的Availability.h文件中,你可以找到从2.0版本到当前版本的所有操作系统定义。所以如果你编译iOS 3.2,#ifdef __IPHONE_3_0也会返回true。

然后我想这个方法应该可行

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_3_2
  // Code for older iOS
#else
  // Code for iOS 3.2 up
#end

但它并不总是有效。例如,在iOS 3中,__IPHONE_3_2未定义。

所以我认为我必须创建一些更智能的if / elseif / else代码块,但后来我(终于:D)读了苹果AvailabilityInternal.h文件定义中__IPHONE_X_X上面的注释:

它说,您可以使用__IPHONE_OS_VERSION_MIN_REQUIRED来解决此类问题,但您不应该使用__IPHONE_X_X常量,因为它们可能没有被定义,从而评估为0。因此,它们建议使用这些值。因此,我现在有一个工作选择器,就像这样...

我找到的解决方案

(现在它真正100%有效)

#if __IPHONE_OS_VERSION_MIN_REQUIRED < 30200
  // code for iOS below 3.2
#else
  // code for iOS 3.2 ++
#endif
2个回答

5

我不确定您是否想要做的是这样,但根据苹果在iPad编程指南中推荐的通用应用程序,如果您想要构建具有不一致API的多个操作系统版本,则应使用NSClassFromString,然后从那里开始。这样,您只需要拥有一个目标(您支持的最低操作系统),并且在代码中可以像这样使用:

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
   //Code for 3.2, e.g. [mplayerControllerClass alloc]
} else {
   //Code for pre-3.2 OSes
}

看起来不错。但是现在我会选择if块,因为它很容易,而且我已经以这种方式实现了它。但是我会记住这个技巧,留待下次使用。谢谢。 - Allisone
1
#ifdef块的问题在于当新操作系统发布时它们会失败。@Jared的方法只要MPMoviePlayerViewController或其替代品存在,就会继续工作。 - kubi

0

试一下这个...

#ifdef IPHONE_OS_3.2

/* iOS 3.2 code */

#endif

#ifdef IPHONE_OS_3.0

/* iOS 3.0 code */

#endif

......有问题的代码将在编译器看到之前被删除。


如果我想要包括iOS 4呢? 是否有类似的东西 #ifdef GREATER_THAN_IPHONE_OS_3_2_AND_SMALLER_THAN_IPHONE_OS_4_0 - Allisone
1
即使您的代码是正确的(使用__IPHONE_3_0而不是IPHONE_OS_3.0),逻辑也是错误的,因为在OS 3.2中定义了两个常量(__IPHONE_3_0和__IPHONE_3_2以及该OS之间和之前的所有内容),因此您的代码两部分都将被执行。 - Allisone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接