解决多版本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
}
posted @ 2012-11-07 15:55  痴人指路  阅读(1173)  评论(0编辑  收藏  举报