2009-09-10 80 views
8

我在嘗試升級應用程序(Clarke)以提供10.6兼容性。當存在新的API時,構建向後兼容的OS X應用程序?

我的計劃是根據所使用的OSX版本使用兩種不同的代碼路徑。

在10.5上它將使用一個控制器,它由完全自定義的代碼組成,這些代碼不依賴於任何特定的Cocoa API。在10.6版本中,它將使用另一個控制器,該控制器基於相同的抽象類將新的CoreLocation API封裝在相同的接口中。在運行時,應用程序將通過檢測操作系統版本在控制器之間切換。

這適用於10.6 10.6 SDK內置正常,但在同一建立炸燬的10.5:

10/09/2009 18:30:50 [0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575] dyld: unknown required load command 0x80000022 
10/09/2009 18:30:51 com.apple.launchd[403] ([0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575]) Exited abnormally: Trace/BPT trap 

如果我建10.5 SDK無法編譯CoreLocation的東西,很明顯。

我希望能夠爲這個應用程序提供一個二進制文件。有沒有辦法從10.5中「隱藏」CoreLocation API?

回答

4

您應該能夠通過改變目標的構建設置來解決這個問題:

  1. 設置基本SDK 10.6
  2. 將部署SDK 10.5
+4

這是正確的方法,但還有更多: 當您需要調用10.6但不是10.5的API時,您需要使用NSClassFromString()來獲取類名。然後檢查返回的類名是否有效。如果它是有效的,你可以繼續並調用你需要的API。如果沒有,你需要優雅地故障恢復。 – Jasarien 2009-09-10 21:22:08

5

部署只有當你在兩個平臺上都有相同的框架,而在新的平臺上有新的調用時,SDK技巧纔有效。對於CoreLocation,整個框架在10.5上缺失,所以您的應用程序將無法加載,因爲它無法動態綁定到框架。

您需要執行上述操作,並將CoreLocation添加爲弱框架。選擇您的鏈接框架和二進制文件構建階段,在詳細信息視圖中找到CoreLocation,在中間欄中將「必需」更改爲「弱化」。

當你建立你的應用程序時,Xcode將CoreLocation通過-weak_framework到鏈接器,以及您的應用程序將加載在所有10.5和10.6系統無論CoreLocation是否存在。儘管如此,除非你真的在10.6上運行,否則確保不要調用任何CoreLocation方法。

+0

它是-weak_framework,而不是-weak-framework – AlBlue 2009-09-22 07:47:10