如何定位特定的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
}
它在Xcode的构建选项。在左上角的下拉菜单上写着“myapp - 3.0 | Debug” 选择你想要的版本,然后完成。
该方法的问题是,我希望我的应用程序能够在2.2.1上运行,只有这一行代码在3.0上运行。你的方法意味着我不得不放弃对2.2x的支持。 – Oliver 2009-05-04 13:53:00
我明白你的意思了,棘手,但你也许能够做出精确的检查。说检查标题中的定义。 – 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。
第一: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
}
我不知道。谢谢! – Kriem 2009-05-06 16:48:33
太好了,谢谢! – Oliver 2009-05-10 13:26:26
有一点需要注意的是,模拟器与设备的编译可能会导致这些宏中出人意料的变化。当为模拟器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