这个问题在这里已经有了答案:如何检查 iOS 版本? (36 个回答) 8 年前关闭。
我想检查用户是否在低于 5.0 的 iOS 上运行应用程序并在应用程序中显示标签。
如何以编程方式检测用户设备上正在运行的 iOS?
谢谢!
当前最佳版本,无需处理 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 数组检查接受的答案:检查 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")
}
更新
从 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 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
}
isOperatingSystemAtLeastVersion
将触发无法识别的选择器发送到实例异常。
我知道我回答这个问题已经太晚了。我不确定我的方法是否仍然适用于低 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];
或检查版本
您可以从 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;
}
希望这可以帮助
[[[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+):
全局变量.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+。在测试中,这种方法比不断运行宏要快得多。
希望这可以帮助任何遇到我遇到的问题的人!
在 MonoTouch 中:
要获得主要版本,请使用:
UIDevice.CurrentDevice.SystemVersion.Split('.')[0]
对于次要版本使用:
UIDevice.CurrentDevice.SystemVersion.Split('.')[1]
要获取更具体的版本号信息,主要版本和次要版本分开:
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 数组以获得更简洁的语法。
对低于 5 的 iOS 版本(所有版本)的简单检查:
if([[[UIDevice currentDevice] systemVersion] integerValue] < 5){
// do something
};
不定期副业成功案例分享