我们如何通过程序检测设备运行的iOS版本?

我想检查用户是否在iOS 5.0以下运行应用程序,并在应用程序中显示一个标签。

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

谢谢!

229266 次浏览

当前最佳版本,不需要处理NSString中的数字搜索是定义macros(见原始答案:检查iPhone iOS版本)

这些宏确实存在于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数组 检查接受的答案在这里:检查iPhone iOS版本

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")
}
[[UIDevice currentDevice] systemVersion]

[[UIDevice currentDevice] systemVersion];

或者像这样检查版本

你可以从在这里中得到下面的宏。

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;


}

希望这能有所帮助

一个简单的检查iOS版本小于5(所有版本):

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

在MonoTouch:

要获得Major版本,请使用:

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

对于小版本使用:

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

Marek Sebera的大多数时候都很棒,但如果你像我一样,发现自己需要频繁地检查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+。在测试中,这种方法比持续运行宏运行得快得多。

希望这能帮助任何经历我的问题!

[[[UIDevice currentDevice] systemVersion] floatValue]

我知道现在回答这个问题已经太迟了。我不确定我的方法是否仍然适用于低iOS版本(<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

更新

从iOS 8开始,我们可以在NSProcessInfo上使用新的isOperatingSystemAtLeastVersion方法

   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上崩溃,因为该API在iOS 8之前并不存在。如果您支持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 <8

为了完整起见,下面是Apple自己在iOS 7用户界面过渡指南中提出的另一种方法,它涉及检查基础框架版本。

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

要获得分隔主版本和次版本的更具体版本号信息:

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

数组vN将包含主版本和次版本作为字符串,但如果你想进行比较,版本号应该存储在作为数字 (int)中。你可以添加这段代码来将它们存储在c数组* versionNumbers中:

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

*这里使用的c数组更简洁的语法。