【问题标题】:How to detect current iOS is 4.1 or 4.2? [duplicate]如何检测当前 iOS 是 4.1 还是 4.2? [复制]
【发布时间】:2011-05-11 21:12:11
【问题描述】:

可能重复:
Check iPhone iOS Version

我尝试使用此代码:

#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_2_2)
    NSLog(@"iPhone 4.2");
#endif

但是当我在模拟器 4.1 上再次运行它时,我仍然在控制台中看到日志“iPhone 4.2”。

谢谢你帮助我。

东都

【问题讨论】:

  • 4.1 和 4.2 都 ≥ 2.2。
  • #if/#endif 是 compile-time 指令。他们所做的只是与您的构建设置进行比较,以查看您所针对的操作系统版本。但是无论您在什么操作系统上运行,都会输出相同的代码。你想要一个run-time检查。
  • 在这里你可以得到所有与设备相关的信息github.com/aleemrazzaq/ARCompactDeviceInfo

标签: iphone ios4


【解决方案1】:

试试这个:

NSString * v = [[[UIDevice currentDevice] systemVersion] substringToIndex:0];

更多参考: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIDevice_Class/Reference/UIDevice.html

【讨论】:

【解决方案2】:
float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 

【讨论】:

【解决方案3】:

或者,甚至更好:

CGFloat systemVersion = [[[ UIDevice currentDevice ] systemVersion ] floatValue ];

然后,你可以做一个简单的相等检查,例如

if( systemVersion > 4.1 ){...}

【讨论】:

    【解决方案4】:

    您可以在编译时或运行时执行此操作。

    对于编译时,您使用所谓的可用性宏:

    #if __IPHONE_OS_VERSION_MAX_ALLOWED > 40000 // __IPHONE_4_0
        NSLog( @"After Version 4.0" ); 
    #else
        NSLog( @"Version 4.0 or earlier" ); 
    #endif
    

    但是,编译时的问题是您必须维护多个二进制文件。如果你希望这个二进制文件在 pre-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

    【讨论】:

    • 是的,但我想用另一个检测iPhone 4.2。
    【解决方案5】:

    规则 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 compile-time 指令只会检查您构建针对的SDK版本,而不是稍后运行在哪个版本的操作系统 .

    【讨论】:

    • 这段代码甚至可以在 iPhone 4.0 和 4.1 中运行
    【解决方案6】:

    您应该完全避免询问系统版本。

    更好的设计会询问特定功能。

    例如:if (NSClassFromString(@"UIPrintInfo")) 会告诉您当前设备是否支持打印 API,在 4.2 或更高版本中可用。

    这样,您可以计划代码以使用可用的功能,而不是基于操作系统版本。

    【讨论】:

    • 谢谢。此代码完美运行。
    猜你喜欢
    • 2012-12-26
    • 2011-12-11
    • 1970-01-01
    • 2011-05-19
    • 2011-06-09
    • 2010-10-10
    • 2019-12-31
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多