針對 Xamarin.iOS 中的不同裝置進行編譯
您可以從 Project 的 iOS 組建屬性頁面設定可執行檔的組建屬性,其找到方式是以滑鼠右鍵按兩下 [項目名稱],然後流覽至 Visual Studio for Mac 中的 [選項 > iOS 組建],以及 Visual Studio 中的 [屬性]:
除了 UI 上可用的組態選項外,您也可以將自己的命令列選項集傳遞至 Xamarin.iOS 建置工具 (mtouch)。
SDK 選項
Visual Studio for Mac 可讓您設定兩個與 SDK 相關的重要屬性:iOS SDK 版本 (用來建置軟體) 和部署目標 (或最小的必要 iOS 版本)。
iOS SDK 版本選項可讓您使用不同版本的 Apple 發佈 SDK,這會將 Xamarin.iOS 導向至其應該在建置期間參考的編譯器、連結器和程式庫。 以滑鼠右鍵按兩下項目,然後選擇 [選項],然後在 [選項] 視窗中選取 [iOS 組建]:
部署目標設定可用來選取應用程式執行所在之作業系統的最小必要版本。 這會在專案的 Info.plist 檔案中設定。 請挑選擁有您執行應用程式所需之所有 API 的最小版本。
一般來說,Xamarin.iOS API 會公開最新版 SDK 中的所有可用方法,而且如有必要,我們也會提供可讓您偵測功能是否可在執行階段使用的便利屬性 (例如,UIDevice.UserInterfaceIdiom
和 UIDevice.IsMultitaskingSupported
隨時都會在 Xamarin.iOS 上運作,我們會執幕後行在所有工作)。
正在連結
請參閱我們的連結器專屬頁面,以深入了解連結器如何協助您減少可執行檔的大小,以及了解如何有效地使用連結器。
程式代碼產生引擎
從 Xamarin.iOS 4.0 開始,Xamarin.iOS 就有兩個程式碼產生後端。 正規的 Mono 程式碼產生引擎,以及以 LLVM 最佳化編譯器為基礎的引擎。 這兩個引擎各有優缺點。
一般而言,在開發過程中,您可能會使用 Mono 程式碼產生引擎,因為它可讓您快速地逐一查看。 對於發行組建和 AppStore 部署,則建議您改用 LLVM 程式碼產生引擎。
相較於 Mono 引擎,LLVM 最佳化後端引擎能夠產生更快、更嚴謹的程式碼,但代價是編譯時間較久。
您可以從 Visual Studio for Mac 或 Visual Studio 的 [iOS 組建] 選項啟用這兩個引擎。
架構支援
ARMv6 (Xamarin.iOS 已在 8.10 版中斷對 ARMv6 的支援)
- iPhone (第一代)、3G
- iPod 第 1 代、第 2 代
ARMv7
- iPhone 3GS、4、4S
- iPad 1、2、3、Mini
- iPod 3、4、5 代
ARMv7s
- iPhone 5
- iPhone 5c
- iPad 4
如果您只以 ARMv7s 處理器作為目標,所產生的程式碼會快一些,但除非您所編譯的 fat 二進位檔在套件中包含多個可執行檔,否則該程式碼將無法再於 ARMv7 或 ARMv6 系統上執行。
ARM64 (Xamarin.iOS 已在 8.6 版開始支援 ARM64)
- iPhone 5s
- iPhone SE
- iPhone 6、6 Plus
- iPhone 6s、6s Plus
- iPhone 7、7 Plus
- iPhone 8、8 Plus
- iPhone X
- iPad Air
- iPad Air 2
- iPad Mini 2、3、4
- iPad Pro (所有機型)
請注意,提交至 App Store 的任何組建都必須包含 64 位元的支援,這是 Apple 所設下的需求。 此外,iOS 11 僅支援 64 位元應用程式。
ARM Thumb-2 支援
Thumb 是 ARM 處理器所使用、更為精簡的指令集。 藉由啟用 Thumb 支援,您可以減少可執行檔的大小,但代價是執行時間較久。 ARMv7 和 ARMv7s 可支援 Thumb。
條件式架構使用方式
如果您的專案想要利用較新版 iOS 的某些功能,您可能需要有條件地依賴某些新架構。 其基本範例是想要在 iOS 4.0 或更新版本上執行時使用 iAd,但又要繼續支援 3.x 裝置。 為了實現此目的,您需要讓 Xamarin.iOS 知道您需要針對 iAd 架構進行「弱式」連結。 弱式繫結可確保系統只會在首次需要架構中的類別時,隨需載入架構。
如果要這麼做,請執行下列步驟:
- 開啟 [專案選項],然後瀏覽至 [iOS 組建] 窗格。
- 針對您想要弱式連結的每個組態新增
'-gcc_flags "-weak_framework iAd"'
至 [其他選項 ]:
除此之外,您還必須確保您使用的類型不會在沒有這些類型的舊版 iOS 上執行。 有數種方法可達成此目的,但其中一個方式是剖析 UIDevice.CurrentDevice.SystemVersion
。