共用方式為


將繫結移轉至 Unified API

本文涵蓋更新現有 Xamarin 系結專案以支援 Xamarin.IOS 和 Xamarin.Mac 應用程式的整合 API 所需的步驟。

概觀

從 2015 年 2 月 1 日起,Apple 需要 iTunes 和 Mac App Store 的所有新提交都必須是 64 位應用程式。 因此,任何新的 Xamarin.iOS 或 Xamarin.Mac 應用程式都必須使用新的 Unified API,而不是現有的傳統 MonoTouch 和 MonoMac API,以支援 64 位。

此外,任何 Xamarin 系結專案也必須支援要包含在 64 位 Xamarin.iOS 或 Xamarin.Mac 專案中的新整合 API。 本文將涵蓋更新現有系結專案以使用整合 API 所需的步驟。

需求

若要完成本文中說明的步驟,必須執行下列動作:

  • Visual Studio for Mac - 在開發電腦上安裝及設定最新版的 Visual Studio for Mac。
  • Apple Mac - 需要 Apple mac 才能建置 iOS 和 Mac 的系結專案。

Windows 電腦上的 Visual Studio 不支援系結專案。

修改 Using 語句

整合 API 可讓您比以往更輕鬆地在 Mac 和 iOS 之間共用程式碼,以及讓您支援具有相同二進位檔的 32 和 64 位應用程式。 藉由從命名空間卸除MonoMac和MonoTouch前置詞,即可跨 Xamarin.Mac 和 Xamarin.iOS 應用程式項目達成更簡單的共用。

因此,我們需要修改任何系結合約(以及系結專案中的其他.cs檔案),以從using語句中移除MonoMacMonoTouch前置詞。

例如,在系結合約中,假設下列 using 語句:

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.ObjCRuntime;

我們會移除前置詞, MonoTouch 以產生下列結果:

using System;
using System.Drawing;
using Foundation;
using UIKit;
using ObjCRuntime;

同樣地,我們必須針對系結專案中的任何 .cs 檔案執行此動作。 有了這項變更,下一個步驟是更新我們的系結專案,以使用新的原生數據類型。

如需整合 API 的詳細資訊,請參閱 整合 API 檔。 如需有關支援 32 和 64 位應用程式和架構的詳細資訊,請參閱 32 和 64 位平臺考慮 檔。

更新為原生數據類型

Objective-C 會將資料類型對應 NSIntegerint32_t 32 位系統上和 int64_t 64 位系統上的 。 為了符合此行為,新的 Unified API 會將先前的int用法取代為新的數據類型:System.Int32System.nint

除了新的 nint 數據類型之外,Unified API 也會引進 nuintnfloat 型別,以便對應至 NSUIntegerCGFloat 型別。

在上述情況下,我們需要檢閱 API,並確保 任何的NSIntegerNSUInteger實例,以及CGFloat我們先前對應至 int的實例,uintfloat更新為新的 nintnuintnfloat 類型。

例如,假設有 Objective-C 下列方法定義:

-(NSInteger) add:(NSInteger)operandUn and:(NSInteger) operandDeux;

如果先前的系結合約具有下列定義:

[Export("add:and:")]
int Add(int operandUn, int operandDeux);

我們會將新的系結更新為:

[Export("add:and:")]
nint Add(nint operandUn, nint operandDeux);

如果我們要對應至比我們最初連結的更新版本第三方連結庫,我們需要檢閱.h連結庫的頭檔,並查看是否有任何結束、明確呼叫 intint32_tunsigned intuint32_tfloat 已升級為 NSIntegerNSUIntegerCGFloat。 如果是,也必須對和 nuintnfloat 型別進行相同的修改nint,才能對應。

若要深入瞭解這些數據類型變更,請參閱 原生類型 檔。

更新 CoreGraphics 類型

與 搭配使用 CoreGraphics 32 或 64 位的點、大小和矩形數據類型,視其執行所在裝置而定。 當 Xamarin 最初系結 iOS 和 Mac API 時,我們使用發生符合 中 System.Drawing 數據類型的現有數據結構(RectangleF 例如)。

由於需要支援 64 位和新的原生數據類型,因此呼叫方法時 CoreGraphic ,必須對現有的程式代碼進行下列調整:

  • CGRect - 定義浮點矩形區域時,請使用 CGRect 而非 RectangleF
  • CGSize - 定義浮點大小(寬度和高度)時,請使用 CGSize 而不是 SizeF
  • CGPoint - 定義浮點位置 (X 和 Y 座標) 時,請使用 CGPoint 而非 PointF

在上述情況下,我們必須檢閱 API,並確保先前系結至 RectangleFSizeF 的任何 實例CGRectCGSizeCGPointPointF已變更為原生類型 CGRectCGSizeCGPoint直接變更。

例如,假設初始化運算式為 Objective-C :

- (id)initWithFrame:(CGRect)frame;

如果我們先前的系結包含下列程式代碼:

[Export ("initWithFrame:")]
IntPtr Constructor (RectangleF frame);

我們會將該程式代碼更新為:

[Export ("initWithFrame:")]
IntPtr Constructor (CGRect frame);

現在所有程式代碼變更都已就緒,我們需要修改系結專案,或建立檔案以系結至整合 API。

修改系結專案

作為更新系結專案以使用整合 API 的最後一個步驟,我們需要修改 MakeFile 用來建置專案的 或 Xamarin 專案類型 (如果我們在 Visual Studio for Mac 內系結),並指示 btouch 系結至整合 API,而不是傳統 API。

更新MakeFile

如果我們使用makefile將系結專案建置至 Xamarin .DLL,則必須包含 --new-style 命令列選項並呼叫 btouch-native ,而不是 btouch

因此,假設有下列專案 MakeFile

BINDDIR=/src/binding
XBUILD=/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
PROJECT_ROOT=XMBindingLibrarySample
PROJECT=$(PROJECT_ROOT)/XMBindingLibrarySample.xcodeproj
TARGET=XMBindingLibrarySample
BTOUCH=/Developer/MonoTouch/usr/bin/btouch

all: XMBindingLibrary.dll

libXMBindingLibrarySample-i386.a:
	$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphonesimulator -configuration Release clean build
	-mv $(PROJECT_ROOT)/build/Release-iphonesimulator/lib$(TARGET).a $@

libXMBindingLibrarySample-arm64.a:
	$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch arm64 -configuration Release clean build
	-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

libXMBindingLibrarySample-armv7.a:
	$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch armv7 -configuration Release clean build
	-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

libXMBindingLibrarySampleUniversal.a: libXMBindingLibrarySample-armv7.a libXMBindingLibrarySample-i386.a libXMBindingLibrarySample-arm64.a
	lipo -create -output $@ $^

XMBindingLibrary.dll: AssemblyInfo.cs XMBindingLibrarySample.cs extras.cs libXMBindingLibrarySampleUniversal.a
	$(BTOUCH) -unsafe -out:$@ XMBindingLibrarySample.cs -x=AssemblyInfo.cs -x=extras.cs --link-with=libXMBindingLibrarySampleUniversal.a,libXMBindingLibrarySampleUniversal.a

clean:
	-rm -f *.a *.dll

我們需要從呼叫 btouch 切換為 btouch-native,因此我們會調整宏定義,如下所示:

BTOUCH=/Developer/MonoTouch/usr/bin/btouch-native

我們會更新 對 btouch 的呼叫,並新增 --new-style 選項,如下所示:

XMBindingLibrary.dll: AssemblyInfo.cs XMBindingLibrarySample.cs extras.cs libXMBindingLibrarySampleUniversal.a
	$(BTOUCH) -unsafe --new-style -out:$@ XMBindingLibrarySample.cs -x=AssemblyInfo.cs -x=extras.cs --link-with=libXMBindingLibrarySampleUniversal.a,libXMBindingLibrarySampleUniversal.a

我們現在可以正常執行 , MakeFile 以建置新的64位版本的API。

更新系結項目類型

如果我們使用 Visual Studio for Mac 系結專案範本來建置 API,則必須更新為系結專案範本的新整合 API 版本。 若要這樣做,最簡單的方式是啟動新的整合 API 系結專案,並複製所有現有的程式代碼和設定。

執行下列操作:

  1. 啟動 Visual Studio for Mac。

  2. 選取 [檔案>>方案...

  3. 在 [新增解決方案] 對話框中,選取 [iOS>整合 API>iOS 系結專案]:

    在 [新增方案] 對話框中,選取 [iOS/整合 API/ iOS 系結專案]

  4. 在 [設定新專案] 對話框中,輸入 新系結專案的 [名稱 ],然後按兩下 [ 確定] 按鈕。

  5. 包含您要為其建立系結的 Objective-C 64位版本連結庫。

  6. 從現有的32位傳統 API 系結項目複製原始碼(例如 ApiDefinition.csStructsAndEnums.cs 檔案)。

  7. 對原始碼檔案進行上述記號變更。

有了所有這些變更,您可以建置新的64位版本 API,就像32位版本一樣。

摘要

在本文中,我們已示範需要對現有的 Xamarin 系結專案進行變更,以支援新的整合 API 和 64 位裝置,以及建置新 64 位相容 API 版本所需的步驟。