2011-09-02 61 views
0

如果SDK添加了新功能,這些功能是否適用於舊設備?如果API獲取新方法,編譯器是否會處理這些新方法以獲取某些內部本機代碼,或者添加的新功能無法在未運行新操作系統的設備上使用?新iOS SDK功能如何向後兼容

回答

0

大部分情況下,爲了保持向後兼容性,添加到SDK的新功能是「加入」的,並且需要您利用它們發佈新版本的應用程序。規則總是有例外,但通常情況是這樣。

+0

這是一個真實的陳述,但他似乎在問,操作系統是否會自動支持新功能,而不是應用程序是否可以自動使用新功能。 –

3

據我所知,SDK更新通常與操作系統更新一致。因此,添加到SDK中的任何功能只會在支持該SDK的操作系統版本中可用。

我給基於Android的例子,但我相信它背後的過程是爲iOS一樣的:

Android 2.1的== SDK V7(API 7級)

的Android 2.2 == SDK v8(API級別8)

運行Android 2.1或更低版本的手機將無法使用SDK v8中可用的任何功能。

5

當Apple添加新的SDK功能時,他們幾乎總是依賴新的框架或運行時功能,這些功能同時添加到操作系統中,並且在以前的迭代中不可用。有極少數例外,但它們總是與添加到編譯器的SDK功能有關。例如,根據iOS 5 SDK中有關自動引用計數的信息,假設您將能夠使用除自我調零弱指針之外的所有ARC功能構建iOS 4應用程序似乎是合理的,因爲這需要一些運行時支持。雖然我們不會確定,直到蘋果計劃提供它們的工具纔會出現NDA。

Apple反而希望您使用Objective-C運行時的動態特性,以便僅在可用時才使用新功能,並將基本部署目標設置爲支持應用程序功能的操作系統的最低受支持版本在合理的範圍內。

例如:

if(![someObject respondsToSelector:@selector(relevantNewMethod)]) 
{ 
    // this version of the OS doesn't actually have relevantNewMethod 
    // so we'll do something else instead; attempting to use it will 
    // raise an exception on this device 
} 

或者:

if(NSClassFromString(@"ShinyNewiOSClass")) 
{ 
    // ShinyNewiOSClass is implemented on this version of the OS, so 
    // we can use it. Otherwise we'd better find something else to do 
    // instead... 
} 

NSClassFromString回報無論是Class實例或nil如果具有該名稱的類存在,所以你可以改爲採取NSClassFromString的結果,並做如果您願意的話,可以使用習慣性的alloc初始化。

僅當MFMailComposer可用時(如果您希望在可用的情況下使用iOS 3方法時支持iOS 2),一個典型示例將顯示「電子郵件」按鈕。

對於全新的框架,標準實踐是弱鏈接(這意味着你的程序希望它們被加載,但操作系統不應該引發異常,如果它們不存在),然後使用相同的反射特徵檢查相關類是否在運行時可用。

0

我原來看錯了問題...

如果問題是...如果我爲iOS5功能編程,iOS 4將支持該功能嗎?

然後答案是......不。

除非你做一些像湯米提到的防禦措施,您的應用程序要麼不能編譯,或者當這些功能被訪問會崩潰。

2

SDK包含特定的iOS版本。適用於iOS 5.0的SDK爲其編譯的應用程序提供了5.0功能的界面(以及所有舊功能或API)。 5.0中新增的功能只能用於已安裝5.0的設備。該應用可以檢測它是否在具有該功能的設備上運行,並且如果該設備沒有支持該功能的iOS版本,則應避免使用該功能。如果某個應用在安裝了iOS 3.1.3的設備上運行時嘗試使用4.0功能(例如),則該應用將收到異常並崩潰。

某些設備(如原始iPhone)無法加載最新的iOS版本。原來的iPhone卡在3.1.3。 iPhone 3G獲得4.X,但它的一些功能被禁用(如多任務)。這個wikipedia article對各種設備可以運行的最大iOS版本有用。