如何定位特定的iPhone版本?

问题描述:

我已经得到了一些代码,我只想在最新的iPhone SDK(3.0)上执行,但我似乎无法找出一种方法来只瞄准3.0和忽略2.2.1等。有一个ifdef语句,但它似乎覆盖整个iPhone:如何定位特定的iPhone版本?

#if TARGET_OS_IPHONE 

任何帮助表示赞赏。

您可以使用此#定义改变你建什么每个SDK ...

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2 
// iPhone 3.0 code here 
#endif 

,并在运行时做到这一点,为3.0及以上运行代码:

float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
if (version >= 3.0) 
    { 
    // iPhone 3.0 code here 
    } 
+0

我不知道。谢谢! – Kriem 2009-05-06 16:48:33

+0

太好了,谢谢! – Oliver 2009-05-10 13:26:26

+10

有一点需要注意的是,模拟器与设备的编译可能会导致这些宏中出人意料的变化。当为模拟器SDK 2.2.1编译时,我得到__IPHONE_OS_VERSION_MIN_REQUIRED = 20000.然而,当编译器件时,我得到了__IPHONE_OS_VERSION_MIN_REQUIRED = 20201,这打破了上面定义的条件。我目前使用普通的“#ifdef __IPHONE_3_0”来隔离只能在3.0或更高版本中工作的代码。这是有效的,因为直到3.0 SDK才定义宏。 – n8gray 2009-05-29 05:34:53

它在Xcode的构建选项。在左上角的下拉菜单上写着“myapp - 3.0 | Debug” 选择你想要的版本,然后完成。

+0

该方法的问题是,我希望我的应用程序能够在2.2.1上运行,只有这一行代码在3.0上运行。你的方法意味着我不得不放弃对2.2x的支持。 – Oliver 2009-05-04 13:53:00

+0

我明白你的意思了,棘手,但你也许能够做出精确的检查。说检查标题中的定义。 – 2009-05-04 23:43:38

使用从this answer添加OTHER_CFLAGS =“-g3 -save-temps -dD”的技巧,我发现定义了__IPHONE_OS_VERSION_MIN_REQUIRED 20000,其项目定位于2.2.1。也许这会工作?

我很确定OP上的评论总结了它。你不能。因为编译时指令无法做出运行时决定。在Xcode中,如果你的目标是3.0,它将不能在2.2.1手机上运行。如果你的目标是2.2.1,那么它将不会编译,因为你有3.0特定的代码。

唯一真正的解决方案是您的应用程序的两个版本,其中一个编译为3.0,另一个编译为2.2.1。

+0

第一:OP实际上不排除编译时检查。第二:你的规则有例外。作为一个例子,MPMoviePlayerController存在于3.0和3.2上,但在3.2(和4.0)上的工作方式不同 - 为了在两个平台上正确支持它,我发现使用运行时操作系统版本检查非常方便。在我的特殊情况下,省略此检查仍然会导致在两个平台上进行适当的构建,但会在3.2以下的任何情况下崩溃。 – Till 2010-08-26 09:53:47

那么,我的两分钱:

如何使用最新版本构建您的应用程序说3.0,这样您就可以利用所有新的&酷的API并指定部署目标为最少想要支持的版本,那么那些没有花时间升级设备的人将会运行你的应用程序。在这种情况下,如上所示,您需要检查SDK的最新版本,并提供备用功能以使您的应用程序向后兼容。

问候, Hardik

敢肯定你也可以这样做:

#ifdef __IPHONE_3_0 
// 3.0 code here 
#endif 

UPDATE:当建立&在iPhone上运行(4.3.1)使用的Xcode 4,这似乎不再为工作我。另外,我得到__IPHONE_OS_VERSION_MIN_REQUIRED = 30200

The iPhone Developer's Cookbook说,你也可以这样做:

#ifdef _USE_OS_4_OR_LATER 
    // code to compile for 4.0 or later 
#else 
    // code to compile for pre-4.0 
#endif 

而且,它似乎为我工作。 :)

我会小心的的floatValue返回结果:

[[[UIDevice currentDevice] systemVersion] floatValue] 

与任何花车,它可能不正是你所期望的。当运行在我的系统上面,困惑,为什么我的条件语句不执行,我发现返回的值是:

3.20000005 

推荐的解决方案,而不是在这里:How to check iOS version?

摘录:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch]; 
if (order == NSOrderedSame || order == NSOrderedDescending) { 
    // OS version >= 3.1.3 
} else { 
    // OS version < 3.1.3 
}