iOS、Mac 和系結專案中的原生參考
原生參考可讓您將原生架構內嵌至 Xamarin.iOS 或 Xamarin.Mac 專案或系結專案。
由於 iOS 8.0 可以建立內嵌架構,在應用程式延伸模組與 Xcode 中的主要應用程式之間共用程式代碼。 使用原生參考功能,就可以在 Xamarin.iOS 中使用這些內嵌架構(以 Xcode 建立)。
重要
無法從任何類型的 Xamarin.iOS 或 Xamarin.Mac 專案建立內嵌架構,原生參考僅允許使用現有的原生架構Objective-C。
詞彙
在 iOS 8(和更新版本中), 內嵌架構 可以同時內嵌靜態連結和動態連結的架構。 若要正確散發它們,您必須將它們設為「fat」架構,其中包含您想要支援應用程式之每個裝置架構的所有 配量 。
靜態與動態架構
靜態架構會在編譯階段連結,其中 Dynamic Framework 會在運行時間連結,而且可以修改,而不需重新連結。 如果您在 iOS 8 之前已使用任何第三方架構,則使用的是 已編譯至應用程式的靜態架構 。 如需詳細資訊,請參閱Apple的 動態連結庫程式設計 檔。
內嵌與系統架構
內嵌架構 包含在您的應用程式套件組合中,而且只能透過其沙箱存取特定應用程式。 系統架構 會儲存在作業系統層級,並可供裝置上的所有應用程式使用。 目前只有 Apple 能夠建立作業系統層級架構。
精簡與 Fat 架構
精簡架構 只包含特定系統架構的已編譯程序代碼,其中 Fat Framework 包含多個架構的程式代碼。 編譯至架構的每個架構特定程式代碼基底稱為 Slice。 因此,例如,如果我們有針對兩個 iOS 模擬器架構編譯的架構(i386 和 X86_64),則會包含兩個 Slices。
如果您嘗試將這個範例 Framework 與您的應用程式一起散發,它會在模擬器上正確執行,但在裝置上會失敗,因為 Framework 不包含 iOS 裝置的任何程式代碼特定配量。 為了確保架構在所有實例中都能運作,它也需要包含裝置特定的配量,例如arm64、armv7和armv7。
使用內嵌架構
您必須完成兩個步驟,才能在 Xamarin.iOS 或 Xamarin.Mac 應用程式中使用內嵌架構:建立 Fat Framework 並內嵌架構。
建立 Fat Framework
如上所述,若要能夠在應用程式中取用內嵌架構,它必須是 Fat Framework,其中包含應用程式將執行之裝置的所有系統架構 Slices。
當 Framework 和取用應用程式位於相同的 Xcode 專案中時,這不是問題,因為 Xcode 會使用相同的組建設定來建置 Framework 和應用程式。 由於 Xamarin 應用程式無法建立內嵌架構,因此無法使用這項技術。
若要解決此問題, lipo
命令行工具可用來將兩個或多個架構合併成一個 Fat Framework,其中包含所有必要的配量。 如需使用 lipo
命令的詳細資訊,請參閱連結 原生連結庫 檔。
內嵌架構
若要使用原生參考在 Xamarin.iOS 或 Xamarin.Mac 專案中內嵌架構,必須執行下列步驟:
建立新的或開啟現有的 Xamarin.iOS、Xamarin.Mac 或 Binding 專案。
在 方案總管 中,以滑鼠右鍵按兩下專案名稱,然後選取 [新增>原生參考]:
從 [ 開啟 ] 對話框中,選取您要內嵌的 Native Framework 名稱,然後按兩下 [ 開啟 ] 按鈕:
架構將會新增至專案的樹狀結構:
編譯專案時,Native Framework 會內嵌在應用程式的套件組合中。
應用程式延伸模組和內嵌架構
內部 Xamarin.iOS 可能會利用這項功能,將 Mono 運行時間連結為架構(當部署目標為 >= iOS 8.0 時),因此大幅減少具有擴充功能的應用程式大小(因為 Mono 運行時間只會針對整個應用程式套件組合包含一次,而不是針對容器應用程式一次,而針對每個擴充功能只包含一次)。
擴充功能會以Mono運行時間作為架構連結,因為所有擴充功能都需要iOS 8.0。
沒有以 iOS 為目標之擴充功能和應用程式的應用程式
摘要
本文已詳細探討將原生架構內嵌至 Xamarin.iOS 或 Xamarin.Mac 應用程式。