iOS 之版本适配问题

本文探讨了iOS开发中的版本适配问题,强调了Development Target和Base SDK的设置对应用兼容性的影响。通过示例解释了如何处理新版本SDK引入的特性在旧版本系统上运行时可能导致的错误,提出了使用预处理语句来避免编译错误的方法,确保应用在不同iOS版本上的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS SDK 有着不慢的更新速度 , 每次更新都会有不少新添加的内容和改动 ,如果不做适配 ,可能会导致使用的高版本里的方法,在低版本手机运行时程序崩溃 。所以做好iOS应用的版本适配 , 也是开发过程中比较重要的一项内容 。

在xcode中又两个地方设置sdk,一个是Development Target,指的是编译后的app可再终端的哪个版本上运行,设置方法如图


另外一个是Base SDK,指的是当前编译所用的SDK版本,设置方法如图



高版本的x-code对应的BaseSDK也是高版本的 , 比如当前X-code6.3对应的是iOS SDK8.3 。但市面上用户手里的手机系统版本可能还有 7.0、 7.1等低版本,所以我们必须让我们的应用同时支持低版本 。

修改方法就是 ,在Development Target即第一张图所示位置里面更改支持的最低版本 ,但并不是说仅改这一个值就高枕无忧了。因为此时是用最新的SDK生成app,但却允许在早期版本的系统上运行,所以此时开发者要确认在旧系统上运行app时不能调用那些新的SDK中添加的功能,否则会在运行时出错导致app闪退。下面就介绍一下如何确保app能够在旧的系统上正确运行。

从网上找了个例子:说明的是在iOS7.0和iOS6.1(以及更低版本)之间的适配问题(用的是xcode5.0,里边有6.1和7.0两个版本的sdk),其他版本同样的问题 , 解决办法类似 。

新建一个工程,默认的development target,base sdk以及模拟器的版本都是7.0,在AppDelegate中的didFinishLaunchingWithOptions方法里写下

self.window.tintColor = [UIColor redColor];  
然后运行,这样是没有任何错误的。接下来将development target,base sdk以及模拟器的版本都改成6.1(注意默认的xcode是没有6.1的sdk的,需要自己另外导入)。然后运行,就会报错:



也就是说tintColor属性在iOS6.1中根本就没有,在编译时候就会出错。这时候如下加上判断语句也是没有用的,照样报错

也就是说tintColor属性在iOS6.1中根本就没有,在编译时候就会出错。这时候如下加上判断语句也是没有用的,照样报错

  

  1. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {  
  2.     self.window.tintColor = [UIColor redColor];  
  3. }  


遇见这种情况只能加上预处理语句,这样写:

  

  1. #ifdef __IPHONE_7_0  
  2.     if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {  
  3.         self.window.tintColor = [UIColor redColor];  
  4.     }  
  5. #endif  

这样编译通过就不会报错了……这是因为在sdk6.1下的usr/include下边有一个Availability.h文件,里边定义了一大堆宏,其中关于iphone的有

  

  1. #define __IPHONE_2_0     20000  
  2. #define __IPHONE_2_1     20100  
  3. #define __IPHONE_2_2     20200  
  4. #define __IPHONE_3_0     30000  
  5. #define __IPHONE_3_1     30100  
  6. #define __IPHONE_3_2     30200  
  7. #define __IPHONE_4_0     40000  
  8. #define __IPHONE_4_1     40100  
  9. #define __IPHONE_4_2     40200  
  10. #define __IPHONE_4_3     40300  
  11. #define __IPHONE_5_0     50000  
  12. #define __IPHONE_5_1     50100  
  13. #define __IPHONE_6_0     60000  
  14. #define __IPHONE_6_1     60100  
  15. #define __IPHONE_NA      99999  /* not available */  


而sdk7.0里边多了一行 

  1. #define __IPHONE_7_0     60100  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值