如何定位特定的iPhone版本?

我有一些代码,我只想在最新的iPhone SDK(3.0)上执行,但我似乎无法找出一个方法只针对3.0和忽略2.2.1等有一个ifdef语句,但它只是似乎覆盖整个iPhone:

#if TARGET_OS_IPHONE 

任何帮助表示赞赏。

您可以使用此#define更改您为每个SDK构build的内容…

 #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 } 

我会小心floatValue的返回结果:

 [[[UIDevice currentDevice] systemVersion] floatValue] 

就像所有的浮标一样,这可能不是你所期望的。 当在我的系统上运行上面的,困惑为什么我的条件语句不执行,我注意到返回的值是:

 3.20000005 

在这里推荐解决scheme: 如何检查iOS版本?

摘抄:

 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 } 

更新:当使用Xcode 4构build和运行iPhone(4.3.1)时,这似乎不再适用于我。 另外,我得到__IPHONE_OS_VERSION_MIN_REQUIRED = 30200

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 

而且,它似乎为我工作。 🙂

很确定你也可以这样做:

 #ifdef __IPHONE_3_0 // 3.0 code here #endif 

这是在Xcode的构build选项。 在左上angular的下拉菜单上写着“myapp – 3.0 | Debug”select你想要的版本,然后完成。

使用从这个答案中添加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特定的代码。

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

那么,我的两分钱:

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

问候,Hardik