我有一些代码,希望只在最新的 iPhone SDK (3.0) 上执行,但是我似乎无法找到能够仅针对 3.0 并忽略 2.2.1 等版本的方法。虽然有一个 ifdef 语句,但它似乎只覆盖整个 iPhone:
#if TARGET_OS_IPHONE
非常感谢任何帮助。
我有一些代码,希望只在最新的 iPhone SDK (3.0) 上执行,但是我似乎无法找到能够仅针对 3.0 并忽略 2.2.1 等版本的方法。虽然有一个 ifdef 语句,但它似乎只覆盖整个 iPhone:
#if TARGET_OS_IPHONE
非常感谢任何帮助。
#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
推荐在此处查找解决方案: 如何检查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
}
3.2.00..005
版本的doubleValue
问题是否仍然存在? - Ky -NSDecimalNumber
来表示是微不足道的。 - Ky -double
是二进制的,因此在数学上不可能精确表示3.2。 - Brennan Vincent更新:在使用Xcode 4构建和运行iPhone(4.3.1)时,此方法似乎不再适用于我。同时,我得到了__IPHONE_OS_VERSION_MIN_REQUIRED = 30200
。
《iPhone开发者手册》中提到您也可以这样做:
#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的构建选项中。左上角的下拉菜单显示类似“myapp - 3.0 | Debug”的内容。 选择您想要的构建,完成后就可以了。
我相当确定OP的评论总结了一切。你不能这样做。因为编译时指令无法做出运行时决策。在Xcode中,如果你的目标是3.0,它将无法在2.2.1手机上运行。如果你的目标是2.2.1,它将无法编译,因为你有3.0特定的代码。
唯一真正的解决方案是你的应用程序有两个版本,一个编译为3.0,另一个编译为2.2.1。
嗯,我有两句话要说:
你可以使用最新的版本(比如3.0)构建你的应用程序,这样你就可以利用所有新的和酷炫的API,并将部署目标指定为你想要支持的最早期版本,这样那些没有花时间升级设备的人仍然可以运行你的应用程序。在这种情况下,如上所示,你需要检查SDK的最早期版本,并提供替代功能,使你的应用程序向后兼容。
此致, Hardik
3.10 < 3.2
,但是"3.10" > "3.2"
。此外,版本字符串可能有超过两个部分(例如,5.0.1,在许多应用程序中用于从iCloud备份中排除文件)。进行版本检查的正确方法是使用[systemVersion compare:version options:NSNumericSearch]
。 - yakovlev#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_0
? - Ky -