我们如何以编程方式检测哪个iOS版本的设备正在运行?
我想检查用户是否在iOS 5.0以下运行应用程序,并在应用程序中显示标签。
如何以编程方式检测哪些iOS正在用户设备上运行?
谢谢!
当前最好的版本 ,无需处理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数组。 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;
更新
从iOS 8开始,我们可以在isOperatingSystemAtLeastVersion
上使用新的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
为了完整起见,下面是苹果公司在iOS 7 UI过渡指南中提出的一种替代方法,它涉及到检查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 }
我知道我为时已晚回答这个问题。 我不知道我的方法仍然在低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
[[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; }
希望这可以帮助
[[[UIDevice currentDevice] systemVersion] floatValue]
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,这个CGFloat可以在不使用任何许多已经在这个页面上指出的不正确的方法的情况下被访问。 我的方法假设版本字符串的格式为n.nn.nn(允许以后的位丢失),适用于iOS5 +。 在测试中,这种方法运行得比不断运行宏要快得多。
希望这有助于任何人遇到我遇到的问题!
要获得更多的主版本号和次版本号的版本号信息:
NSString* versionString = [UIDevice currentDevice].systemVersion; NSArray* vN = [versionString componentsSeparatedByString:@"."];
数组vN
将包含主要版本和次要版本作为字符串,但如果要进行比较,版本号应以数字 (整数)存储。 您可以添加此代码以将它们存储在C数组* versionNumbers
:
int versionNumbers[vN.count]; for (int i = 0; i < sizeof(versionNumbers)/sizeof(versionNumbers[0]); i++) versionNumbers[i] = [[vN objectAtIndex:i] integerValue];
*这里使用的C数组更简洁的语法。
在MonoTouch中:
要获得主要版本使用:
UIDevice.CurrentDevice.SystemVersion.Split('.')[0]
对于小版本使用:
UIDevice.CurrentDevice.SystemVersion.Split('.')[1]
iOS版本少于5(所有版本)的简单检查:
if([[[UIDevice currentDevice] systemVersion] integerValue] < 5){ // do something };