博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发中的系统版本比较
阅读量:5360 次
发布时间:2019-06-15

本文共 6168 字,大约阅读时间需要 20 分钟。

由于系统平台和SDK更新迭代,一部分过时的成员、方法会被彻底从SDK中移除,为了兼容旧的设备,这时就需要区分系统平台版本调用正确的API。

另一种情况是iOS设备的屏幕和设备参数不同,虽然UI上的AutoLayout技术能很好的解决显示适配问题,但仍有时候不得不根据平台版本进行编码。

有很多方法来区分平台版本,常用的有 [UIDevice currentDevice].systemVersion floatValue] ,或者根据SDK更新增加和淘汰的Class进行判断(不直观且必须对历史版本非常了解),根据设备情况判断(最不可取),通过NSObjCRuntime.h的宏定义判断(使用NSFoundationVersionNumber)。

最建议这种方法,因为可读性较高,支持iOS2以后的所有及可预见的未来版本。

举个例子:CFURLCreateStringByReplacingPercentEscapesUsingEncoding在iOS9中被完全移除,为了同时兼容iOS6版本,decodedUrlString代码如下:

1 #ifndef NSFoundationVersionNumber_iOS_7_0 2 #define NSFoundationVersionNumber_iOS_7_0 1047.20 3 #endif 4  5 -(NSString *)decodedUrlString:(NSString *)urlString { 6     if (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_7_0) { 7 #pragma clang diagnostic push 8 #pragma clang diagnostic ignored "-Wdeprecated-declarations" 9         NSString * decodedString = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (__bridge CFStringRef)urlString, CFSTR(""), kCFStringEncodingUTF8);10 #pragma clang diagnostic pop11         return decodedString;12     } else {13         return [urlString stringByRemovingPercentEncoding];14     }15 }

解释:因为iOS8之前的SDK未定义NSFoundationVersionNumber_iOS_7_0,而iOS7之后可以使用stringByRemovingPercentEncoding方法代替前面的方法,这里给没有定义NSFoundationVersionNumber_iOS_7_0的情况手动定义它,使编译器能编译旧版本SDK。它的值见NSObjCRuntime.h中的定义,可用版本见开发文档:

FOUNDATION_EXPORT double NSFoundationVersionNumber;#if TARGET_OS_MAC#define NSFoundationVersionNumber10_0    397.40#define NSFoundationVersionNumber10_1    425.00#define NSFoundationVersionNumber10_1_1    425.00#define NSFoundationVersionNumber10_1_2    425.00#define NSFoundationVersionNumber10_1_3    425.00#define NSFoundationVersionNumber10_1_4    425.00#define NSFoundationVersionNumber10_2    462.00#define NSFoundationVersionNumber10_2_1    462.00#define NSFoundationVersionNumber10_2_2    462.00#define NSFoundationVersionNumber10_2_3    462.00#define NSFoundationVersionNumber10_2_4    462.00#define NSFoundationVersionNumber10_2_5    462.00#define NSFoundationVersionNumber10_2_6    462.00#define NSFoundationVersionNumber10_2_7    462.70#define NSFoundationVersionNumber10_2_8    462.70#define NSFoundationVersionNumber10_3    500.00#define NSFoundationVersionNumber10_3_1    500.00#define NSFoundationVersionNumber10_3_2    500.30#define NSFoundationVersionNumber10_3_3    500.54#define NSFoundationVersionNumber10_3_4    500.56#define NSFoundationVersionNumber10_3_5    500.56#define NSFoundationVersionNumber10_3_6    500.56#define NSFoundationVersionNumber10_3_7    500.56#define NSFoundationVersionNumber10_3_8    500.56#define NSFoundationVersionNumber10_3_9    500.58#define NSFoundationVersionNumber10_4    567.00#define NSFoundationVersionNumber10_4_1    567.00#define NSFoundationVersionNumber10_4_2    567.12#define NSFoundationVersionNumber10_4_3    567.21#define NSFoundationVersionNumber10_4_4_Intel    567.23#define NSFoundationVersionNumber10_4_4_PowerPC    567.21#define NSFoundationVersionNumber10_4_5    567.25#define NSFoundationVersionNumber10_4_6    567.26#define NSFoundationVersionNumber10_4_7    567.27#define NSFoundationVersionNumber10_4_8    567.28#define NSFoundationVersionNumber10_4_9    567.29#define NSFoundationVersionNumber10_4_10    567.29#define NSFoundationVersionNumber10_4_11    567.36#define NSFoundationVersionNumber10_5    677.00#define NSFoundationVersionNumber10_5_1    677.10#define NSFoundationVersionNumber10_5_2 677.15#define NSFoundationVersionNumber10_5_3 677.19#define NSFoundationVersionNumber10_5_4 677.19#define NSFoundationVersionNumber10_5_5 677.21#define NSFoundationVersionNumber10_5_6 677.22#define NSFoundationVersionNumber10_5_7 677.24#define NSFoundationVersionNumber10_5_8 677.26#define NSFoundationVersionNumber10_6 751.00#define NSFoundationVersionNumber10_6_1 751.00#define NSFoundationVersionNumber10_6_2 751.14#define NSFoundationVersionNumber10_6_3 751.21#define NSFoundationVersionNumber10_6_4 751.29#define NSFoundationVersionNumber10_6_5 751.42#define NSFoundationVersionNumber10_6_6 751.53#define NSFoundationVersionNumber10_6_7 751.53#define NSFoundationVersionNumber10_6_8 751.62#define NSFoundationVersionNumber10_7 833.10#define NSFoundationVersionNumber10_7_1 833.10#define NSFoundationVersionNumber10_7_2 833.20#define NSFoundationVersionNumber10_7_3 833.24#define NSFoundationVersionNumber10_7_4 833.25#define NSFoundationVersionNumber10_8 945.00#define NSFoundationVersionNumber10_8_1 945.00#define NSFoundationVersionNumber10_8_2 945.11#define NSFoundationVersionNumber10_8_3 945.16#define NSFoundationVersionNumber10_8_4 945.18#define NSFoundationVersionNumber10_9 1056#define NSFoundationVersionNumber10_9_1 1056#define NSFoundationVersionNumber10_9_2 1056.13#define NSFoundationVersionNumber10_10 1151.16#define NSFoundationVersionNumber10_10_1 1151.16#define NSFoundationVersionNumber10_10_2 1152.14#define NSFoundationVersionNumber10_10_3 1153.20#endif#if TARGET_OS_IPHONE#define NSFoundationVersionNumber_iPhoneOS_2_0    678.24#define NSFoundationVersionNumber_iPhoneOS_2_1  678.26#define NSFoundationVersionNumber_iPhoneOS_2_2  678.29#define NSFoundationVersionNumber_iPhoneOS_3_0  678.47#define NSFoundationVersionNumber_iPhoneOS_3_1  678.51#define NSFoundationVersionNumber_iPhoneOS_3_2  678.60#define NSFoundationVersionNumber_iOS_4_0  751.32#define NSFoundationVersionNumber_iOS_4_1  751.37#define NSFoundationVersionNumber_iOS_4_2  751.49#define NSFoundationVersionNumber_iOS_4_3  751.49#define NSFoundationVersionNumber_iOS_5_0  881.00#define NSFoundationVersionNumber_iOS_5_1  890.10#define NSFoundationVersionNumber_iOS_6_0  992.00#define NSFoundationVersionNumber_iOS_6_1  993.00#define NSFoundationVersionNumber_iOS_7_0 1047.20#define NSFoundationVersionNumber_iOS_7_1 1047.25#define NSFoundationVersionNumber_iOS_8_0 1140.11#define NSFoundationVersionNumber_iOS_8_1 1141.1#define NSFoundationVersionNumber_iOS_8_2 1142.14#define NSFoundationVersionNumber_iOS_8_3 1144.17#define NSFoundationVersionNumber_iOS_8_4 1144.17#endif
View Code

回到代码第6行,对版本进行比较,这里必须是运行时代码,如果是iOS7之前就调用旧的方法,否则使用iOS7之后的替代方案。

第8行是忽略使用了已销毁定义的编译警告。

 

其他的方案讨论,请看.so中的讨论:

转载于:https://www.cnblogs.com/Bob-wei/p/5332994.html

你可能感兴趣的文章
图片点击轮播(三)-----2017-04-05
查看>>
直播技术细节3
查看>>
《分布式服务架构:原理、设计于实战》总结
查看>>
java中new一个对象和对象=null有什么区别
查看>>
字母和数字键的键码值(keyCode)
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
Spring mvc初学
查看>>
VTKMY 3.3 VS 2010 Configuration 配置
查看>>
01_1_准备ibatis环境
查看>>
windows中修改catalina.sh上传到linux执行报错This file is needed to run this program解决
查看>>
JavaScript中的BOM和DOM
查看>>
360浏览器兼容模式 不能$.post (不是a 连接 onclick的问题!!)
查看>>
spring注入Properties
查看>>
jmeter(五)创建web测试计划
查看>>
python基本数据类型
查看>>
1305: [CQOI2009]dance跳舞 - BZOJ
查看>>
将html代码中的大写标签转换成小写标签
查看>>
jmeter多线程组间的参数传递
查看>>
零散笔记
查看>>
信息浏览器从Android的浏览器中传递cookie数据到App中信息浏览器
查看>>