我们如何以编程方式检测运行设备的iOS版本?

时间:2011-10-21 11:30:07

标签: iphone objective-c ios cocoa-touch ios4

我想检查用户是否在小于5.0的iOS上运行应用,并在应用中显示标签。

如何以编程方式检测用户设备上正在运行的iOS?

谢谢!

10 个答案:

答案 0 :(得分:670)

最新版本,无需在NSString中处理数字搜索就是定义macros(参见原始答案:Check iPhone iOS Version

这些宏确实存在于github中,请参阅:https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h

像这样:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

并像这样使用它们:

if (SYSTEM_VERSION_LESS_THAN(@"5.0")) {
    // code here
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
    // code here
}

以下的过时版本

获取操作系统版本:

[[UIDevice currentDevice] systemVersion]

返回字符串,可以通过

转换为int / float
-[NSString floatValue]
-[NSString intValue]
像这样

  

由于它的类型,两个值(floatValue,intValue)都将被剥离,5.0.1将变为5.0或5(float或int),为了准确比较,你必须将它分离为INT数组      在这里查看接受的答案:Check iPhone iOS Version

NSString *ver = [[UIDevice currentDevice] systemVersion];
int ver_int = [ver intValue];
float ver_float = [ver floatValue];

并像这样比较

NSLog(@"System Version is %@",[[UIDevice currentDevice] systemVersion]);
NSString *ver = [[UIDevice currentDevice] systemVersion];
float ver_float = [ver floatValue];
if (ver_float < 5.0) return false;

适用于Swift 4.0语法

下面的示例只是检查设备是iOS11还是更高版本。

let systemVersion = UIDevice.current.systemVersion
if systemVersion.cgFloatValue >= 11.0 {
    //"for ios 11"
  }
else{
   //"ios below 11")
  }

答案 1 :(得分:256)

更新

从iOS 8开始,我们可以在isOperatingSystemAtLeastVersion

上使用新的NSProcessInfo方法
   NSOperatingSystemVersion ios8_0_1 = (NSOperatingSystemVersion){8, 0, 1};
   if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:ios8_0_1]) {
      // iOS 8.0.1 and above logic
   } else {
      // iOS 8.0.0 and below logic
   }

请注意,这将在iOS 7上崩溃,因为在iOS 8之前不存在API。如果您支持iOS 7及更低版本,则可以安全地执行检查

if ([NSProcessInfo instancesRespondToSelector:@selector(isOperatingSystemAtLeastVersion:)]) {
  // conditionally check for any version >= iOS 8 using 'isOperatingSystemAtLeastVersion'
} else {
  // we're on iOS 7 or below
}

原始答案iOS&lt; 8

为了完整起见,这是Apple自己在iOS 7 UI Transition Guide中提出的另一种方法,它涉及检查Foundation Framework版本。

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
   // Load resources for iOS 6.1 or earlier
} else {
   // Load resources for iOS 7 or later
}

答案 2 :(得分:22)

我知道我来不及回答这个问题。我不确定我的方法是否仍适用于低iOS版本(&lt; 5.0):

NSString *platform = [UIDevice currentDevice].model;

NSLog(@"[UIDevice currentDevice].model: %@",platform);
NSLog(@"[UIDevice currentDevice].description: %@",[UIDevice currentDevice].description);
NSLog(@"[UIDevice currentDevice].localizedModel: %@",[UIDevice currentDevice].localizedModel);
NSLog(@"[UIDevice currentDevice].name: %@",[UIDevice currentDevice].name);
NSLog(@"[UIDevice currentDevice].systemVersion: %@",[UIDevice currentDevice].systemVersion);
NSLog(@"[UIDevice currentDevice].systemName: %@",[UIDevice currentDevice].systemName);

您可以获得以下结果:

[UIDevice currentDevice].model: iPhone
[UIDevice currentDevice].description: <UIDevice: 0x1cd75c70>
[UIDevice currentDevice].localizedModel: iPhone
[UIDevice currentDevice].name: Someones-iPhone002
[UIDevice currentDevice].systemVersion: 6.1.3
[UIDevice currentDevice].systemName: iPhone OS

答案 3 :(得分:15)

[[UIDevice currentDevice] systemVersion]

答案 4 :(得分:14)

[[UIDevice currentDevice] systemVersion];

或检查类似

的版本

您可以从here获取以下宏。

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(IOS_VERSION_3_2_0))      
{

        UIImageView *background = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cs_lines_back.png"]] autorelease];
        theTableView.backgroundView = background;

}

希望这有帮助

答案 5 :(得分:9)

[[[UIDevice currentDevice] systemVersion] floatValue]

答案 6 :(得分:5)

马雷克塞贝拉大部分时间都很棒,但是如果你像我一样发现你需要经常检查iOS版本,你不希望在内存中不断运行宏因为你会经历一个非常好的轻微减速,特别是在旧设备上。

相反,您希望将iOS版本计算为浮动一次并将其存储在某处。在我的例子中,我有一个GlobalVariables单例类,我用它来检查代码中的iOS版本,使用如下代码:

if ([GlobalVariables sharedVariables].iOSVersion >= 6.0f) {
    // do something if iOS is 6.0 or greater
}

要在您的应用中启用此功能,请使用此代码(对于使用ARC的iOS 5+):

<强> GlobalVariables.h

@interface GlobalVariables : NSObject

@property (nonatomic) CGFloat iOSVersion;

    + (GlobalVariables *)sharedVariables;

@end

<强> GlobalVariables.m

@implementation GlobalVariables

@synthesize iOSVersion;

+ (GlobalVariables *)sharedVariables {
    // set up the global variables as a static object
    static GlobalVariables *globalVariables = nil;
    // check if global variables exist
    if (globalVariables == nil) {
        // if no, create the global variables class
        globalVariables = [[GlobalVariables alloc] init];
        // get system version
        NSString *systemVersion = [[UIDevice currentDevice] systemVersion];
        // separate system version by periods
        NSArray *systemVersionComponents = [systemVersion componentsSeparatedByString:@"."];
        // set ios version
        globalVariables.iOSVersion = [[NSString stringWithFormat:@"%01d.%02d%02d", \
                                       systemVersionComponents.count < 1 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:0] integerValue], \
                                       systemVersionComponents.count < 2 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:1] integerValue], \
                                       systemVersionComponents.count < 3 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:2] integerValue] \
                                       ] floatValue];
    }
    // return singleton instance
    return globalVariables;
}

@end

现在,您可以轻松检查iOS版本,而无需经常运行宏。特别注意我是如何将[[UIDevice currentDevice] systemVersion] NSString转换为可以不经常访问的CGFloat,而不使用许多已在本页面指出的不正确方法。我的方法假设版本字符串的格式为n.nn.nn(允许以后的位丢失)并适用于iOS5 +。在测试中,这种方法比不断运行宏的速度快得多。

希望这可以帮助任何遇到问题的人!

答案 7 :(得分:2)

获取更多特定版本号信息,分隔主要版本和次要版本:

NSString* versionString = [UIDevice currentDevice].systemVersion;
NSArray* vN = [versionString componentsSeparatedByString:@"."];

数组vN将包含主要版本和次要版本作为字符串,但如果要进行比较,则应将版本号存储为数字(整数)。您可以添加此代码以将它们存储在C-array * versionNumbers

int versionNumbers[vN.count];
for (int i = 0; i < sizeof(versionNumbers)/sizeof(versionNumbers[0]); i++)
    versionNumbers[i] = [[vN objectAtIndex:i] integerValue];

*此处使用的C数组用于更简洁的语法。

答案 8 :(得分:1)

在MonoTouch中:

要使用主要版本:

UIDevice.CurrentDevice.SystemVersion.Split('.')[0]

对于次要版本使用:

UIDevice.CurrentDevice.SystemVersion.Split('.')[1]

答案 9 :(得分:0)

对iOS版本少于5(所有版本)的简单检查:

if([[[UIDevice currentDevice] systemVersion] integerValue] < 5){
        // do something
};