解决多版本sdk兼容问题

使用Xcode开发iPhone APP的时候, 为了保证代码的向下兼容, 有时候可能需要用到条件编译。 譬如有些代码只在4.0及以后版本中可用, 如MFMessageComposeViewController

    #define __IPHONE_2_0     20000
    #define __IPHONE_2_1     20100
    #define __IPHONE_2_2     20200
    #define __IPHONE_3_0     30000
    #define __IPHONE_3_1     30100
    #define __IPHONE_3_2     30200
    #define __IPHONE_4_0     40000
    #define __IPHONE_NA      99999  /* not available */

 

  

上面的代码预定义在iPhone SDK 4中,当我们查看SDK3。x版本的定义时,发现其中没有定义__IPHONE_4_0, 故我们可以通过判断是否定义__IPHONE_4_0来确定是否为4。x的版本。

#ifdef __IPHONE_4_0
#import ...
#endif

 

  
3



 

编译App的时候,可以指定App所使用的SDK,这样可以让App在多个OS版本上运行。比如:
1> 向上兼容(forward-compatibility):为某一OS做优化,同时还可以在以后的更高的OS版本上运行。
2> 向下兼容(backward-compatibility):让App在老的OS版本上也能运行。
为实现此功能,需要指定各个OS的头文件和相应的库(headers and libs),还要指定最小版本。这些由Xcode设置里的Base SDK和Deployment OS version决定。
Deployment OS version决定了你可以无条件使用的所有函数和系统调用;Base SDK决定了你可以挑选的一些功能。
如果你想在App中使用连Base SDK都不支持的函数,那会产生一个编译错误。
如果你使用了在文档中标明了在Base SDK中是deprecated的函数,那会产生一个编译警告。
如果你使用了Base SDK里的可选函数,然后编译出App。可是安装到低SDK版本的iPhone上,该函数只是一个空指针。

随着frameworks逐代演化,很多API引入,同时很多API被废弃,现存的API也会有变化。苹果为了消除API的不兼容,会提供备选项。在这种时候,程序员需要根据framework版本的不同使用不同的API。苹果的framework也会自动检测用户iPhone上的SDK版本,然后做相应调整。(前提是framework可以发现这些不兼容)

这些不兼容的API都会在framework release notes里标明。所以,release note是相当重要的东西。

如果想知道如何根据不同的SDK进行条件编译,如何在程序运行时判断SDK,如何查找deprecated函数,请参照:
http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW6


下面是两种常用的方法,简单有效。
条件编译:
#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2
// iPhone 3.0 code here
#endif

动态区分:
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version >= 3.0)
{
// iPhone 3.0 code here
}

转载于:https://www.cnblogs.com/ligun123/archive/2012/11/07/2758955.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值