部分參考http://www.cnblogs.com/ios8/p/ios-version-com.html
下面舉個簡單的例子來說明在iOS7.0和iOS6.1(以及更低版本)之間的適配問題(用的是xcode5.0,裡邊有6.1和7.0兩個版本的sdk)
新建一個工程,默認的development target,base sdk以及模擬器的版本都是7.0,在AppDelegate中的didFinishLaunchingWithOptions方法裡寫下
self.window.tintColor = [UIColor redColor];
也就是說tintColor屬性在iOS6.1中根本就沒有,在編譯時候就會出錯。這時候如下加上判斷語句也是沒有用的,照樣報錯(預處理,編譯,運行的問題這裡不再廢話)
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.window.tintColor = [UIColor redColor]; }遇見這種情況只能加上預處理語句,這樣寫:
#ifdef __IPHONE_7_0 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.window.tintColor = [UIColor redColor]; } #endif
注意需要加入頭文件
#import這樣編譯通過就不會報錯了……這是因為在sdk6.1下的usr/include下邊有一個Availability.h文件,裡邊定義了一大堆宏,其中關於iphone的有
#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_4_1 40100 #define __IPHONE_4_2 40200 #define __IPHONE_4_3 40300 #define __IPHONE_5_0 50000 #define __IPHONE_5_1 50100 #define __IPHONE_6_0 60000 #define __IPHONE_6_1 60100 #define __IPHONE_NA 99999 /* not available */而sdk7.0裡邊多了一行
#define __IPHONE_7_0 60100iOS8當然也是一樣的道理
除此之外,當使用framework或者.a的時候需要注意
因為在編譯framework或者.a的時候是依賴當時編譯的環境決定的,如使用iOS6的sdk可以將framework或者.a順利編譯通過,但是在真正生成app的時候需要保證編譯app時的sdk和編譯framework或者.a的sdk是一致的,且同時需要加入運行時判斷([[[UIDevice currentDevice] systemVersion] floatValue]那個)
說明:
1、如果是使用低版本sdk編譯的(如iOS6),將最終的應用安裝至高版本的設備上(iOS7的系統),此時應該不會出現問題,因為iOS7兼容iOS6,但是無法使用iOS7特有的新功能,因為代碼被屏蔽了。
2、如果是使用高版本sdk編譯的(如iOS7),將最終的應用安裝至低版本的設備上(iOS6的系統),此時如果不加入運行時判斷就會出現問題(可能是crash)。因為應用本身是用iOS7編譯的,並使用iOS7才有的新功能,而設備並不支持iOS7。
寫的可能有點亂了,純自己記錄用的