2011-09-05 65 views
12

我的應用程序是針對最新的iOS 4.x版SDK目前編制。一旦iOS 5.0 SDK發佈,我是否可以在我的應用程序中使用新的iOS 5.0 SDK功能,並且可以在iOS 4設備上運行它(但使用禁用了新功能的部件)?使用的是iOS 5功能,而不會破壞向後兼容性

+0

可能的重複[你如何可選地使用2.0兼容的應用程序中的iPhone OS 3.0功能?](http://stackoverflow.com/questions/986589/how-do-you-optionally-use-iphone-os- 3-0的功能-IN-A-2-0兼容的應用程序內) –

+0

參見[如何使iPhone應用程序使用多個SDK(固件)版本兼容(http://stackoverflow.com/questions/3027120/how -to-化妝與iPhone應用程序兼容與 - 多SDK固件版本)。雖然這些問題的版本較舊,但適用相同的一般原則。 –

回答

10

一般回答的問題,Objective-C運行是完全反射的,這意味着可以查詢該方法的對象支架(經由respondsToSelector:),並通過得到的類保持運行時名稱(通過NSClassFromString)。 iOS的二進制文件還支持弱聯動的概念,框架,這意味着如果它是可用的框架將被加載,但是,如果框架是不可用你不認爲這是一個致命的錯誤(這是默認行爲)。

這意味着,當蘋果發佈OS的新版本中,你可以編寫使用的操作系統,但功能罰款最新版本的新功能沒有他們,如果這些新功能是API的新位代碼。

蘋果有時也會提供新的SDK功能,是不是新的API,當鏘靜態分析器加入的Xcode如。由於這些功能通常不需要任何運行時支持,因此它們完全可用。 iOS 5有一點獨特,因爲蘋果對LLVM項目的承諾表明,ARC的東西中有一些新的編譯時功能依賴於某些運行時支持。所以他們將無法使用,如果他們確實在蘋果打算分發它們的工具中。

9

你可以請檢查是否某些功能是可用的或者不運行時。

例如:

Class motionManagerClass = NSClassFromString(@"CMMotionManager"); 
if(motionManagerClass) { 
    CMMotionManager *motionManager = [[CMMotionManager alloc] init]; 
    if([motionManager isGyroAvailable]) { 
     //iOS device with gyro 
    }else { 
     //right iOS but device has no gyro 
    } 
}else{ 
//wrong iOS 
}