符合iOS系统兼容性需求的方法

转载本文请保留以下原作者信息: 原作:OneV‘s Den http://www.onevcat.com/2012/02/iosversion/

兼容性,开发者之殇

兼容性问题是全世界所有开发这面临的最头疼的问题之一,这句话不会有开发者会反驳。往昔的Windows Vista的升级死掉一批应用的惨状历历在目,而如今火热的移动互联网平台上类似的问题也层出不穷。Andriod的开源导致产商繁多,不同的设备不仅硬件配置有差异,系统有差异,就连屏幕比例也有差异。想要开发出一款真正全Android平台都完美运行的app简直是不可能的.. iOS好很多,因为iPhone和iTouch的分辨率完全一致(就算retina也有Apple帮你打理好了),因此需要关注的往往只有系统版本的差别。在使用到某些新系统才有的特性,或者被废弃的方法时,都需要对运行环境做出判定。

何时需要照顾兼容性

没有人可以记住所有系统新加入的类或者属性方法,也没有人可以开发出一款能针对全系统的还amazing的应用。

在iOS的话,首先要做的就是为自己所开发的app选择合适的最低版本,在XCode中的对应app的target属性中,设置iOS Deployment Target属性,这对应着你的app将会运行在的最低的系统版本。如果你设成iOS 4.3的话,那你就不需要考虑代码对4.3之前的系统的兼容性了——因为低于iOS 4.3的设备是无法通过正规渠道安装你的应用的。

但是你仍然要考虑在此之后的系统的兼容性。随着Apple不断升级系统,有些功能或者特性在新系统版本上会有很容易很高效的实现方法,有些旧的API被废弃或者删除。如果没有对这些可能存在的兼容性问题做出处理的话,小则程序效率低下,之后难以维护,大则直接crash。对于这些可能存在的问题,开发者一定要明确自己所调用的API是否存在于所用的框架中。某个类或者方法所支持的系统版本可以在官方文档中查到,所有的条目都会有类似这样的说明

Availability Available in iOS 5.0 and later.

或者

Availability Available in iOS 2.1 and later. 

Deprecated in iOS 5.0. 从Availability即可得知版本兼容的信息。 如果iOS Deployment Target要小于系统要求,则需要另写处理代码,否则所使用的特性在老版本的系统上将无法表现。

另外,Apple也不过是一家公司,Apple的开发人员也不过是牛一点的程序员,iOS本身就有可能有某些bug,导致在某些版本上存在瑕疵。开发人员会很care,并尽快修正,但是很多时候用户并不care,或者由于种种原因一直不升级系统。这时候便需要检测系统,去避开这些bug,以增加用户体验了(比如3.0时的UITableView插入行时可能crash)。

符合兼容性需求的代码

判定系统版本,按运行时的版本号运行代码

这不一定是最有效的方法,但这是最直接的方法。对系统版本的判定可以参考我的另一片文章:UIViewController的误用。 顺便在这边也把比较的方法贴出来:

// System Versioning Preprocessor Macros

#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 (SYSTEMVERSIONLESS_THAN(@“5.0”)) {    //系统版本不小于5.0...Do something } ···

需要注意的是,[@“5.0” compare:@“5” options:NSNumericSearch]这样的输入将会返回一个NSOrderedDescending,而不是期望中的NSOrderedSame,因此在输入的时候需要特别小心。另外这个方法的局限还在于对于4.1.3这样的系统版本号比较无力,想要使用的话也许需要自己进行转换(也许去掉第二个小数点再进行比较是个可行的方案)。

对于类,可以检测其是否存在

如果要使用的新特性是个类,而不是某个特定的方法的话,可以用NSClassFromString来将字符串转为类,如果runtime没有这个类的存在,该方法将返回nil。比如对于iOS 5,在位置解析方面,Apple使用了CoreLocation中的新类CLGeocoder来替代原来的MKReverseGeocoder,要判定使用哪个类,可以用下面的代码:

if(NSClassFromString(@"CLGeocoder")) {
    //CLGeocoder存在,可以使用
}
else{
    //只能使用MKReverseGeocoder
}

这个方法应该是绝对靠谱的,但是只有类能够使用。而系统更新往往带来的不止类,也有很多新的方法和属性这样的东西,这个方式就无能为力了。

向特定的类或对象询问是否拥有某特性

对于某些类活期成员,他们本身有类似询问支不支持某种特性这样的方法,比如大家所熟知的UIImagePickerController里检测可用媒体类型的availableMediaTypesForSourceType:方法,以及CMMotionManager里检测三轴陀螺是否可用的方法gyroAvailable。但是有些类询问方法的类和成员所要使用的特性基本基本都是和设备硬件有关的。

另外当然也可以用respondsToSelector:方法来检测是否对某个方法响应。但是这是非常危险的做法,我本人不推荐使用。因为iOS系统里存在很多私有API,而Apple的审查机制对于私有API调用的格杀勿论是业界公知的。而respondsToSelector:如果想要检测的方法在老版本的系统中是作为私有API形式存在的话,你将得到错误的结果,从而去执行私有API,那就完了。这种应用往往是被拒了都不知道自己在哪儿使用了私有API…

时间: 2024-10-09 05:18:44

符合iOS系统兼容性需求的方法的相关文章

iOS开发 UITableView的方法和属性总结

本文描述UITableView的各种方法,属性,委托以及数据源.本文的目的只是总结UITableView的用法,详细的例子另撰文描述. 1 数据源  UITableViewDataSource协议 01 返回组(节)的个数,默认是返回1,如果只有1组数据,可以不用实现该方法. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 02 返回某一组的行数,该组由section的值决定 - (NSInteger)table

ios系统铃声调用方法

首先,这里我要说明这里并不是真正调用系统内部自带的铃声,因为苹果是不允许开发者调用的,没有给开发者接口:如果调用了就无法上线的!那为什么AppStore里面还有那么多app显示的效果是调用系统的铃声一样呢?为什么就能上线呢?其实不然,他们是使用了系统一样的铃声!也就说他们录制和系统铃声相似,然后包含进他们的bundle中来实现的. 所以,我们想要实现调用系统铃声的效果,只能通过这个途径:把音频文件捆绑经我们的bundle中来调用,播放! 给一个网址,里面好多苹果系统铃声(ios8的也有啦....

iOS开发——实用篇&提高iOS开发效率的方法和工具

提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时在使用AppCode等其他的IDE,在这里我主要介绍Xcode中提升开发效率的方法. 1.善用快捷键 快捷键是开发中必不可少的,当你善于使用快捷键的时候,十指在键盘上飞舞,那画面太美,我不敢想象. 常用快捷键操作 2.常用代码片段 开发中有一些常用的代码,可以放到代码片段中,然后下次你就可以使用快捷

产品经理常用的四种需求收集方法简述

A 客户访谈 客户访谈是通过面对面的交流方式了解具体客户对产品.对流程的需求.观点和看法. 客户访谈的内容可以包括: 1.了解哪些需求对客户比较重要. 2.就了解到的一些需求请客户协助进行优先排序. 3.就问题改进建议的初步想法与客户进行讨论,确认是否能够满足客户需求. 客户访谈的优点包括: 1.由于是面对面的交流,因此在调查内容上更加灵活,可以随时根据问答状况就一些内容进行深入讨论,获得更多的客户感受. 2.客户可以再调查人的协助下,进行一些较为复杂的问卷调查. 3.客户访谈方式的适用面广,可

iOS动态运行时方法

在某些时候,程序可能需要根据获取的参数来决定调用的方法. 要实现这样的功能,就需要使用到动态运行时方法了. 首先需要定义好接口,以便调用. 然后就是动态调用定义好的方法. 这里有两种方法, 第一种: // 有参数则需要加上冒号 SEL sel = NSSelectorFromString(@"save:"); MyObject obj = [MyObject new]; [obj performSelector:sel withObject:@{@"1":@&quo

[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

ios对象copy的方法,要实现nscopy协议

ios对象copy的方法,要实现nscopy协议 by 伍雪颖 - (id)copyWithZone:(NSZone *)zone { RestEntity *copy = [[[self class] allocWithZone:zone] init]; copy.dishId = _dishId; return copy; } - (id)mutableCopyWithZone:(NSZone *)zone { RestEntity *copy = [RestEntity allocWith

ios中集合遍历方法的比较和技巧

本文原文发表自我的[自建博客],cnblogs同步发表,格式未经调整,内容以原博客为准 我是前言 集合的遍历操作是开发中最常见的操作之一,从C语言经典的for循环到利用多核cpu的优势进行遍历,开发中ios有若干集合遍历方法,本文通过研究和测试比较了各个操作方法的效率和优略势,并总结几个使用集合遍历时的小技巧. ios中常用的遍历运算方法 遍历的目的是获取集合中的某个对象或执行某个操作,所以能满足这个条件的方法都可以作为备选: 经典for循环 for in (NSFastEnumeration)

思考题:用Use Case获取需求的方法是否有什么缺陷,还有什么地方需要改进?(提示:是否对所有的应用领域都适用?使用的方便性?.......)

思考题: 用Use Case获取需求的方法是否有什么缺陷,还有什么地方需要改进?(提示:是否对所有的应用领域都适用?使用的方便性?.......) 简答: 一.用例解释: 在软件工程中,用例是一种在开发新系统或者软件改造时捕获潜在需求的技术.每个用例提供了一个或多个场景,该场景揭示了系统是如何同最终用户或其它系统交互的,从而获得一个明确的业务目标.用例要避免技术术语,取而代之的是最终用户或者领域专家的语言.用例一般是由软件开发者和最终用户共同创作的. 二.创建用例的原则: 用例是短文 用例可以是