如何针对特定的iPhone版本?

如何针对特定的iPhone版本?,iphone,Iphone,我有一些代码只想在最新的iPhone SDK 3.0上执行,但是我似乎无法找到一种方法来只针对3.0而忽略2.2.1等。有一个ifdef语句,但它似乎涵盖了整个iPhone: #if TARGET_OS_IPHONE 非常感谢您的帮助。这在Xcode的构建选项中。左上角的下拉列表显示类似myapp-3.0 | Debug的内容 选择你想要的构建,然后就完成了。使用添加其他\u CFLAGS=-g3-save temps-dD from的技巧,我发现define\u IPHONE\u OS\u

我有一些代码只想在最新的iPhone SDK 3.0上执行,但是我似乎无法找到一种方法来只针对3.0而忽略2.2.1等。有一个ifdef语句,但它似乎涵盖了整个iPhone:

#if TARGET_OS_IPHONE

非常感谢您的帮助。

这在Xcode的构建选项中。左上角的下拉列表显示类似myapp-3.0 | Debug的内容
选择你想要的构建,然后就完成了。

使用添加其他\u CFLAGS=-g3-save temps-dD from的技巧,我发现define\u IPHONE\u OS\u VERSION\u MIN\u需要20000个目标为2.2.1的项目。也许这会奏效?

我相当肯定OP上的评论是对它的总结。你不能。因为编译时指令无法做出运行时决策。在Xcode中,如果以3.0为目标,它将无法在2.2.1手机上运行。如果您的目标是2.2.1,它将不会编译,因为您有3.0特定的代码


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

您可以使用此定义更改为每个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
    }
嗯,我的两分钱:

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

问候,,
Hardik

你肯定也可以做到:

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

更新:当使用Xcode 4在iPhone4.3.1上构建和运行时,这似乎不再适用于我。另外,我得到的IPHONE操作系统版本要求=30200

说你也可以做:

#ifdef __IPHONE_3_0
// 3.0 code here
#endif
#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
请在此处推荐解决方案:

摘录:

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
}

这种方法的问题是,我希望我的应用程序也能在2.2.1上运行,而在3.0上只运行这一行代码。你的方法意味着我将不得不放弃对2.2x的支持。我明白你现在的意思,很棘手,但你可能能够进行精确检查。比如在头中检查define。需要注意的一点是,针对模拟器和设备进行编译可能会导致这些宏发生意外的变化。在为模拟器SDK 2.2.1进行编译时,我得到了uu IPHONE_OS_VERSION_MIN_REQUIRED=20000。但是,在为设备编译时,我得到了uu IPHONE_OS_VERSION_MIN_REQUIRED=20201,这打破了您上面定义的条件。我目前正在使用普通的ifdef uu IPHONE 3 0来隔离只在3.0或更高版本中工作的代码。这是因为直到3.0 SDK才定义宏。请小心运行时代码。通过调用floatValue,即使实际版本是3.2.2,您也只能得到3.20000。当我使用Xcode 4在IPHONE 4.3.1上构建和运行时,为什么要得到u_IPHONE_OS_version_MIN_REQUIRED=30200?您答案中的运行时代码完全错误。浮点值和字符串的顺序不同:3.10<3.2,但3.10>3.2。此外,版本字符串可能有两个以上的组件,例如5.0.1,它在许多应用程序中用于从iCloud备份中排除文件。执行版本检查的正确方法是使用[systemVersion compare:version options:NSNumericSearch]。版本号根本不是浮点数或十进制数。版本号是整数,由点字符分隔。1:OP实际上并不排除编译时检查。第二:你的规则有例外。例如,MPMoviePlayerController存在于3.0和3.2上,但在3.2和4.0上的工作方式不同-为了在这两种平台上正确支持它,我发现使用运行时操作系统版本检查非常方便。在我的特殊情况下,忽略此检查仍将导致两个平台上的正确构建,但会在3.2以下的任何平台上崩溃。3.2.00..005是否仍然存在doubleValue问题?@BenC.R.Leggiero应该是这样的。不管你使用多高的精度,都不可能精确地用二进制表示3.2。@BrennanVincent我想你指的是IEEE浮点数,因为用二进制表示是很简单的NSDecimalNumber@BenLeggiero我说的是二进制的。NSDecimalNumber不是二进制的;它是二进制编码的十进制。我的发言是关于数学,而不是计算机技术。双是二进制,所以在数学上它不可能精确地表示3.2。我找不到可能在基础中定义的地方。它在哪里?请注意,那里的代码是3.0+,而不仅仅是3.0。这如何有助于在iOS 3或更高版本上只运行一段代码?