当前位置:  开发笔记 > IOS > 正文

如何定位特定的iPhone版本?

如何解决《如何定位特定的iPhone版本?》经验,为你挑选了3个好方法。

我有一些代码我想只在最新的iPhone SDK(3.0)上执行,但我似乎无法找到一种方法来定位3.0并忽略2.2.1等.有一个ifdef语句,但它似乎覆盖了整个iPhone:

#if TARGET_OS_IPHONE

任何帮助表示赞赏.



1> Jane Sales..:

您可以使用此#define更改为每个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
    }


需要注意的一件事是,为模拟器和设备进行编译可能会导致这些宏发生惊人的变化.在为模拟器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才定义宏.
小心运行时代码.通过调用floatValue,您将只获得3.20000,即使实际版本是3.2.2.
你的答案中的运行时代码是完全错误的.浮点值和字符串有不同的顺序:`3.10 <3.2`,但是`"3.10">"3.2"`.此外,版本字符串可能包含两个以上的组件(例如,5.0.1,在许多应用程序中用于从iCloud备份中排除文件).进行版本检查的正确方法是使用`[systemVersion compare:version options:NSNumericSearch]`.

2> 小智..:

我要小心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> ma11hew28..:

更新:使用Xcode 4在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

而且,它似乎对我有用.:)

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有