可能重复:
Check iPhone iOS Version
我尝试使用此代码:
#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_2_2)
NSLog(@"iPhone 4.2");
#endif
但是当我在模拟器4.1上再次运行它时,我仍然在控制台中获得日志“iPhone 4.2”。
感谢您的帮助。
Tung Do
答案 0 :(得分:27)
您应该完全避免询问系统版本。
更好的设计会询问特定功能。
例如:if (NSClassFromString(@"UIPrintInfo"))
会告诉您当前设备是否支持4.2或更高版本的打印API。
通过这种方式,您可以计划代码以使用功能(如果可用),而不是基于操作系统版本。
答案 1 :(得分:21)
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
答案 2 :(得分:6)
或者,甚至更好:
CGFloat systemVersion = [[[ UIDevice currentDevice ] systemVersion ] floatValue ];
然后,您可以进行简单的等式检查,例如
if( systemVersion > 4.1 ){...}
答案 3 :(得分:5)
您可以在编译时或运行时执行此操作。
对于编译时,您使用所谓的可用性宏:
#if __IPHONE_OS_VERSION_MAX_ALLOWED > 40000 // __IPHONE_4_0
NSLog( @"After Version 4.0" );
#else
NSLog( @"Version 4.0 or earlier" );
#endif
然而,编译时的问题是你必须维护多个二进制文件。如果您希望此二进制文件在4.x之前运行,那么您应该弱链接到iOS库。
if(kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iPhoneOS_4_0)
{
NSLog( @"After Version 4.0" );
}
else
{
NSLog( @"Version 4.0 or earlier" );
}
这里有一个很好的教程: http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html
答案 4 :(得分:3)
规则1:不依赖于版本或设备类型来确定功能是否可用。不同的设备(iPhone,iPod Touch和iPad)可以在不同版本的操作系统中获得相同的功能。
弱框架和缺少类的链接将是nil
。或者使用NSClassFromString()
函数,如果某个类不存在,该函数也会返回nil
。还可以使用-[NSObject respondsToSelector:]
来查询方法是否存在。
规则2:Apple在检查版本时不鼓励使用定义的常量(例如__IPHONE_2_2
),而是使用它们的数值:
#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 40200)
NSLog(@"BUILT against iPhone 4.2 or later");
#endif
但请注意使用#if
编译时指令只会检查构建的SDK的版本,而不是以后运行的操作系统的哪个版本强>
答案 5 :(得分:1)
试试这个:
NSString * v = [[[UIDevice currentDevice] systemVersion] substringToIndex:0];