iOS版本

1.静态检查

静态检查,即在编译时段就检查当前SDK编译与构建应用是否能使用某个API或已经不支持某个API。

编译常量

__IPHONE_OS_VERSION_MIN_REQUIRED

用来判断是否当前SDK版本“仍然”支持或具有某些功能。

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 80000
    //minimum deployment target is 8.0, so it’s safe to use iOS 8-only code
    当前SDK最小支持的设备系统,即8.0,所以在iOS 8.0设备上是安全的

#else
    //you can use iOS8 APIs, but the code will need to be backwards
    //compatible or it will crash when run on an iOS 7 device
    你仍然可以使用iOS 8的API,但是在iOS 7的设备上可能会crash.
#endif

__IPHONE_OS_VERSION_MAX_ALLOWED

用来判断是否当前版本“开始”支持或具有某些功能;

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000
    //you can use iOS 10 APIs here because the SDK supports them
    //but the code may still crash if run on an iOS 8 device
    可以使用最新的iOS 10的API,开始支持的新功能。但是仍然可能会在iOS 8的设备上crash。
#else
    //this code can’t use iOS 10 APIs as the SDK version doesn’t support them
    不能使用iOS 10的API,只能使用iOS 10之前的。
#endif

针对Xcode的旧版本,或者设备上的就版本,不存在相应的宏,采用如下定义:

#ifndef __IPHONE_10_0
#define __IPHONE_10_0 100000
#endif

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0

#else

#endif

2.动态检查

CoreFoudation/NSFoundation版本宏

类似于iOS 系统版本宏,系统还给出了CoreFoudation和NSFoudation宏,并且给出了kCFCoreFoundationVersionNumber和NSFoundationVersionNumber两个值。这两个值均是double值。

在iOS10.2.1系统上,以上两个值,分别是:1348.220000、1349.130000。
在Debug下,两个值的存储po出来分别是:1348.22、1349.1300000000001。

kCFCoreFoundationVersionNumber

详见 CoreFoundatin/CFBase.h中定义。

NSFoundationVersionNumber

详见 Foundation/NSObjRuntime.h中定义。

针对上面的宏,写起来复杂,所以可以定义一个宏,来简化书写:

#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_10_0
#define kCFCoreFoundationVersionNumber_iPhoneOS_10_0 1299
#endif

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000
#define IF_IOS10_OR_GREATER(...) if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_10_0) { __VA_ARGS__ }
#else
#define IF_IOS10_OR_GREATER(...)
#endif

#define IF_PRE_IOS10(...) if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_10_0) { __VA_ARGS__ }

IF_IOS10_OR_GREATERIF_PRE_IOS10就可以在使用中快捷调用。

IF_IOS10_OR_GREATER
(
    //iOS 10 code here
);

然而,即使上面这种方法可以简单的检查系统版本,你仍然无法保证绝对正确,因为你会发现以上宏中不同的系统版本中存在相同的值。

缺陷:当你要判断那些刚好存在相同值的版本的时候,也是一个危险的判断。

3.检查运行的iOS 系统版本

if ([[ [UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {
}

注意:上面的判断方法,在判断整数版本的时候,使用起来挺方便,也不会出什么大问题。但是仍然是极其危险的。因为float在计算机中的存储,是近似而非精确。

比如,最新的iOS 10.2.1系统,有以下一段代码:

NSString *version = [[UIDevice currentDevice] systemVersion];
int int_ver = [version intValue];
float float_ver = [version floatValue];
NSLog(@"%@-%d-%f",version,int_ver,float_ver);

打印出来如下的结果:

10.2.1-10-10.200000

可以看出,10.2.1打印出来的floatValue值,是【10.20000】,这还算小事。更为致命的是,在控制台调试时发现:

所以,假如比较10.2.1和10.2.2比较,就很难得出结果。

鉴于此,以上方法不推荐使用!最好不用!

那么,什么是好的运行时判断系统的方法呢?

定义判断版本的宏:

#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)
 
 

但是,由于NSString的compare方法本身的缺陷:

NSInteger compareResult = [@"10.0" compare:@"10" options:NSNumericSearch];


遗憾的是,上面的系统版本判断也是有漏洞的。但是相对于之前的漏洞,这个漏洞似乎可以接受。
上面返回的结果:NSOrderedDescending,即10.0相比于10是低版本。

4.iOS 8之后,NSOperatingSystemVersion

NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];

NSProcessInfo还提供了:

NSOperatingSystemVersion v = (NSOperatingSystemVersion){8,1,3};
if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:v]) {

}

以上这个方法,只有在iOS 8之后,但是对于一些超级APP,仍然在支持iOS 7,所以也就无能为力了。

 转自
时间: 2024-10-30 03:19:23

iOS版本的相关文章

不同iOS版本做代码适配__IPHONE_OS_VERSION_MAX_ALLOWED 和 __IPHONE_8_0等专业术语

目前开发只想最低版本支持iOS8了,iOS8以前的就不管了,然后现在iOS9和iOS10出来以后,有些新的API,也有些弃用的API,为了兼容,有时候代码里面需要编写判断不同iOS版本,或者只允许指定的iOS版本才可以编译或者执行. 需要用到以下方式,以下方式只针对OC(Swift的写法暂时还不清楚,等需要的时候在补充): 示例: //ios8.0以后用此方法替代willRotateToInterfaceOrientation:duration:这个方法 #if __IPHONE_OS_VERS

ios版本与xcode版本

iOS版本 iPhone版本 Xcode版本 其他 2003年 Xcode1.0 2005年4月29日 Xcode2.0 2007年1月9日 iPhone OS(iOS1): 虚拟键盘.谷歌地图 第一代iPhone:3.5英寸,触屏 谷歌研发安卓 2007年6月29日 iPhone2G 2007年10月26日 Xcode3.0 2008年7月11日 iOS2: 同步服务.云计算电子邮件.AppStore面世.GPS导航 iPhone 3G:支持3G.AppStore 同年,首款安卓手机T-Mob

CiscoASA防火墙升级IOS版本需注意的问题

引用Cisco官方的公告: 在Internet密钥交换(IKE)1版本的漏洞(V1)和IKE协议版本2(v2)Cisco ASA软件代码可能允许未经身份验证的远程攻击者造成的影响重装系统或远程执行代码. 该漏洞是由于受影响的代码区缓冲区溢出.攻击者可以通过发送特制的UDP数据包来利用此漏洞影响的系统.一个漏洞可能允许攻击者执行任意代码,获得系统的完全控制或导致重装系统的影响. 注意:只有流量定向到受影响的系统可以用来利用此漏洞.这个漏洞影响配置防火墙模式只在单个或多个上下文模式系统.此漏洞可以被

Unity3D 实现简单的语音聊天 [iOS版本]

现在很多手机游戏中的聊天系统都加入语音聊天的功能,相比于传统的文字聊天,语音聊天在MMORPG中显得尤为重要,毕竟直接口头交流总比你码字快得多了,也更直观些. 实现语音聊天的方法很多,U3D中有不少第三方的插件,提供了很多功能强大的语音功能,具体有哪些我就不一一举例了(其实我都没用过- -!),本文想从一个原生开发的角度去实现一个简单的语音聊天功能. 语音聊天大概流程如图: 上图中可以看到,客户端录制语音数据,并进行编码转换,数据压缩,然后把语音数据发送到语音服务器,语音服务器进行派发功能(语音

iOS版本、iPhone版本、Xcode版本比对

iOS版本 iPhone版本 Xcode版本 其他 2003年 Xcode1.0 2005年4月29日 Xcode2.0 2007年1月9日 iPhone OS(iOS1): 虚拟键盘.谷歌地图 第一代iPhone:3.5英寸,触屏 谷歌研发安卓 2007年6月29日 iPhone2G 2007年10月26日 Xcode3.0 2008年7月11日 iOS2: 同步服务.云计算电子邮件.AppStore面世.GPS导航 iPhone 3G:支持3G.AppStore 同年,首款安卓手机T-Mob

IOS版本被拒的经历

IOS版本被拒的经历: 1,登陆方式依赖外部平台 因为我们的APP是只用微博登陆,想做成类似meerkat类型的,也能各种消息都同步微博. 结果当然行不通,这个确实是不听好人言,网上多个人都说过这个问题了,早就该引以为戒! 后加入手机号登陆,问题搞定. 2,放在app store中的广告图片有手机画面中,状态栏是android的 这个我们太不小心了,后修改图片. 3,用户排行榜中,列举所有用户,并且在UITableViewCell中例举了用户名.头像.粉丝数.关注数.人气量,苹果认为粉丝数.关注

【转】IOS版本自定义字体步骤

本文转载自:http://quick.cocoachina.com/wiki/doku.php?id=ios%E7%89%88%E6%9C%AC%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%97%E4%BD%93%E6%AD%A5%E9%AA%A4 比如字体文件名叫abc.ttf, 用mac字体工具查到字体的名称: PostScript名称 FZYHJW--GB1-0 全名 方正艺黑简体 这个PostScript 名称就是我们的字体名称,

IOS版本和IPHONE5适配总结

今天花了一天的时间对IOS6和IPHONE5进行适配 [由于自己用的机器是IPHONE5,所以没出什么问题,但是在IPHONE4上就出问题了,都是IOS7版本,还有一台IPOD是IOS6版本,也出问题- 哎,一开始没注意适配,现在得花这精力去修改-  特总结一下,防止以后犯错误,提高工作效率,加油!] 由于习惯问题,都在视图控制器下的viewDidLoad去创建自定义的UI元素,因为IOS版本问题,所以self.view.frame也会不同,如果要实现相同的UI布局,用代码进行测试,发现以下4种

XCODE 添加不同IOS版本的模拟器

一.XCode->Preferences->Downloads, 可以下载模拟器. XCODE 就可以选择不同版本模拟器了@~~~~ XCODE 添加不同IOS版本的模拟器

[iOS] Delphi for iOS 版本需求

http://www.cnblogs.com/onechen/p/5427886.html Delphi iOS 版本需求 版本 版本需求 官网 备注 Delphi 10.1 Berlin iPod Touch, iPhone, or iPad iOS 8 iOS 9 http://docwiki.embarcadero.com/RADStudio/Berlin/en/FireMonkey_Platform_Prerequisites 不支持iPhone 3GSiPhone 4 Delphi 1