IOS中多版本,多设备类型支持注意事项
IOS系统从07年出来,到现在也有6年了,每年发布一次到两次新的设备,从iPhone1,iPhone2 ... iPhone4s再到最新的iPhone5。硬件在升级的过程中CPU的架构也可能发生变化,如最早的armv6,armv7再带最新的iPhone5所以用的armv7s。同时伴随每一次硬件升级,系统都会做一次大版本的升级,目前最新的版本已经到了6.x了。
每次系统升级的时候,总有一些用户会因为各种原因不愿或者不能升级到最新的系统。这就意味着,如果我们的程序要让尽可能多的人使用,就得支持尽可能多的硬件架构及系统版本。如果我们写的程序和硬件打交道比较少的话,要做的事也就是配置一下工程选项中的Architectures,在其中添加上我们要支持的硬件架构就好了。然而每次系统的升级都会伴随这很多新的API,Framework的引入,以及部分老的API的废弃。也就说我们要支持的系统版本越多,工作量也就越大,所以我们通常会根据工作量和系统版本的分布情况做出取舍。现在AppStore上基本上的程序一般最多也就支持IOS 4.3的系统了吧,我做的上个项目PowerCam记得也是从4.0版本开始支持。
下面我们分别从两个方面讨论一下:
一、支持多设备类型
不同的设备CPU指令集可能是不同的,这也就导致了其支持的框架可能不同。例如iPhone3G及之前版本的设备的CPU只支持armv6的指令集,导致了这些设备只支持OpenGL ES 1.1版本,所有iPad及iPhone3GS之后的所有设备都采用armv7及armv7s(iPhone5,iPad4采用)指令集,因此既可以支持OpenGL ES 1.1和2.0。

二、支持多系统版本
Xcode在工程的编译选项中,我们可以看到两个选项:Base SDK和Deployment Target,第一个选项是用来设置我们项目是基于哪个版本的SDK开发,第二选项是用来设置我们的项目最低可以部署到哪一个系统运行。
Xcode新建的工程中通常都会采用最用的SDK以及支持到最新的版本。因为我们要既支持新的版本,同事兼顾的老的版本,为了能够利用上新版本中新的特性,所以最好选择最新的SDK,这一项通常不用改,维持原样就好。如果要支持叫早的系统版本,则需要修改Deployment Target选项。如下图所示,我们设置项目需要最老的版本为IOS 4.3。

到这儿就设置完了,Xcode会根据我们的设置进行编译打包。在这里我们讨论一下Xcode是如何使用了最新版本的SDK,却可以支持到较老的系统版本呢?查阅文档SDK Compatibility Guide发现,在程序打包的时候,Xcode只是将一些导出符号打到我们的程序包中,具体到运行时会根据实际的设备的系统版本进行匹配。文档中有一个图可以解释Base SDK和Deployment Target之间是如何运作的,如下图:

该图是以Mac OS工程为例的,不过原理是一样的。意思是对于我们支持部署的版本之前的所有API,我们都是可以无条件使用的(当前在新的版本中最好使用新的API),在我们支持部署的版本和我们开发所基于的SDK版本之间的API,能否使用取决于我们的APP具体运行的系统版本。
在系统版本升级的过程中,通常会添加一些新的API和Framework,也会废弃掉一些旧的效率不高的API。这些废弃的API虽然不能立马变得不可用,但是不保证在后面的版本中会继续支持,所以为了我们的程序能够在新的系统中更可靠,高效的运行,我们应该尽量使用新的API。
无论是在新的系统版本中调用已经不支持了的API,还是在旧的系统版本中调用新的系统版本中才引入的API都会导致我们的程序Crush。因此我们在调用那些我们部署的版本以后添加的API或者Framework时需要进行判断当前程序所运行的环境是否支持。
下面我们从几个方面讨论:
1) 判断一个类是否可用
在IOS 4.2以后我们可以通过class这个类方法来判断一个类在当前运行时是否可用,代码如下:
if ([UICollectionView class]) {
// 6.0以后可以使用
}
else {
// 之前的版本,需要使用可替代的技术实现
}
在Mac OS则需要使用NSClassFromString来判断一个类是否可用。
2) 判断一个方法是否可用
NSObject类有一个方法instancesRespondToSelector可以用来判断一个类的实例是否响应指定的方法,如果要判断一个类是否响应一个类方法则可以使用respondToSeletor方法。代码如下:
if ([UIViewController instancesRespondToSelector:@selector(presentViewController:animated:completion:)]) {
// 5.0以后支持
}
else {
// 不支持该方法
}
3) 判断一个函数是否可用
我们知道C语言中每个函数名都代表着这个函数的地址,因此我们可以通过判断该函数名字是否NULL来判断支持该函数。
if (CGColorCreateCopyWithAlpha != NULL) {
// 支持该函数
}
else {
// 不支持该函数
}
4) 判断一个extern 变量或者Notification名是否可用
extern变量和Notification名其实都是一个变量,我们只需要判断它的地址是否NULL即可,代码如下:
if (&MPMoviePlayerReadyForDisplayDidChangeNotification != NULL) {
// 6.0以后存在该通知
}
else {
// 不存在该通知
}
该文档中还讲到如果你想针对不同的SDK版本进行条件编译,可以采用宏来实现,感兴趣的同学可以自己看看。
至此,多版本多设备类型支持注意事项就介绍完了,希望对大家能有帮助。
参考文档: SDK Compatibility Guide
注:转自 http://www.cnblogs.com/smileEvday/archive/2013/04/10/SDKCompatility.html
IOS中多版本,多设备类型支持注意事项的更多相关文章
- IOS中input键盘事件支持的解决方法
欢迎大家去我的网站详细查看http://genghongshuo.com.cn/ IOS中input键盘事件keyup.keydown.等支持不是很好, 用input监听键盘keyup事件,在安卓手机 ...
- iOS中如何知道app版本已更新
主要用于程序升级,开启程序后是否显示新特性两个方面. 1.苹果app版本 苹果规定,程序的版本只能升不能降.例如1.0->1.1可以,1.1->1.0就不可以,不允许上架. 2.app版本 ...
- iOS中如何让TextView和TextField控件支持return键收起输入法
TextView和TextField控件是iOS中负责接收用户输入的控件,那当用户输入完成时怎么收起面板呢? 1.TextView和TextField控件获得焦点之后的第一反应就是弹出输入法面板: 2 ...
- ios 中不new Date 的格式 不支持年月日 以‘-’ 分割的格式
new Date("2018-1-5") 在 ios 中显示 invalid date - 换做 / 则可以顺利显示 new Date("2018/1/5")
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- 在iOS中使用ZXing库[转]
前言 ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0).它不但支持众多的条码格式,而且有各种语言的实现版本,它支持的语言包括:Java, C++, C#, ...
- iOS中JSONModel的使用
iOS中JSONModel的使用 流弊的JSON数据模型框架 https://github.com/jsonmodel/jsonmodel 版本 1.3.0 如果你喜欢JSONModel,并且使用 ...
- iOS中集成ijkplayer视频直播框架
ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijk ...
- iOS中dyld缓存的实现原理是怎样的?
在iOS开发中,为了提升系统的安全性,很多系统库文件都被打包到一个缓存的文件当中即dyld缓存,那大家对dyld缓存了解多少呢?今天小编将和大家分享的就是一位iOS大神对dyld缓存的使用分析,一起来 ...
随机推荐
- .NET 自带的动态代理+Expression 实现AOP
下面代码(摘抄之别处,原创在哪不知)是采用TransparentProxy和RealProxy实现对象的动态代理.碍于其使用反射掉用方法,所以就小试着将反射改成Expression以提高执行的效率.第 ...
- Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar
web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...
- 分析system_call中断处理过程
分析system_call中断处理过程 上周我们使用gcc内嵌汇编调用系统调用,这次我们具体分析下过程. 将getpid嵌入menuos 代码从github下载,步骤如下: 1. 增加一个函数,get ...
- linux下安装tomcat,部署项目
一.先检查是否安装jdk java -version 查看版本信息,如果显示 那基本就是安装了. root@iZ2ze2hksqphzp0eh7dskoZ:/opt# java -version -b ...
- Android运行时异常“Binary XML file line # : Error inflating class”
http://blog.csdn.net/huangxiaohu_coder/article/details/8497286 在原生Android下编译APK,编译没有问题,但是在运行的时候经常出现如 ...
- 解决中64位Win7系统上PLSQL无法连接ORACLE的方法(PLSQL无法识别ORACLE_HOME的配置)
最近新安装了64位的Win7系统,工作中需要用oracle数据库,而数据库是公司IT的DBA进行管理和维护的. 我们只需要连接上去进行使用就可以了,于是我就在自己的机器上安装了oracle clien ...
- 关于年终奖励的扣税算法BUG
这么多年,第一次拿年终奖,于是查一下年终奖是怎么扣税的,根据 国税发[2005]9号 适用公式为: 应纳税额=雇员当月取得全年一次性奖金×适用税率一速算扣除数 年终奖: /= 的税率是3% 按照网上说 ...
- solr python客户端 - solrpy
solrPy 基础使用: 1)与solr建立连接 import solr s = solr.Solr('http://host:ip/solr/collectionName') 2)查询 r = s. ...
- Spectrum to XYZ to sRGB
如何将频谱响应转换为对应的RGB显示值: 首先要在频率功率分布(SPD)曲线的基础上,分别使用X/Y/Z三个频率匹配曲线(spectral matching curves,又名CIE XYZ Colo ...
- 阿里云 通过YUM源安装nginx
阿里云centOS-6.3-64位通过YUM源安装nginx 第一步:在 /etc/yum.repos.d/ 目录下,建立名叫nginx.repo的软件源配置文件. 文件 nginx.repo 的 ...