將繫結移轉至 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
語句中移除MonoMac和MonoTouch前置詞。
例如,在系結合約中,假設下列 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 會將資料類型對應 NSInteger
至 int32_t
32 位系統上和 int64_t
64 位系統上的 。 為了符合此行為,新的 Unified API 會將先前的int
用法取代為新的數據類型:System.Int32
System.nint
。
除了新的 nint
數據類型之外,Unified API 也會引進 nuint
和 nfloat
型別,以便對應至 NSUInteger
和 CGFloat
型別。
在上述情況下,我們需要檢閱 API,並確保 任何的NSInteger
NSUInteger
實例,以及CGFloat
我們先前對應至 int
的實例,uint
並float
更新為新的 nint
和 nuint
nfloat
類型。
例如,假設有 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
連結庫的頭檔,並查看是否有任何結束、明確呼叫 int
、int32_t
、 unsigned int
uint32_t
或 float
已升級為 NSInteger
或 NSUInteger
CGFloat
。 如果是,也必須對和 nuint
nfloat
型別進行相同的修改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,並確保先前系結至 RectangleF
SizeF
的任何 實例CGRect
, CGSize
CGPoint
或PointF
已變更為原生類型 CGRect
,CGSize
或CGPoint
直接變更。
例如,假設初始化運算式為 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 系結專案,並複製所有現有的程式代碼和設定。
執行下列操作:
啟動 Visual Studio for Mac。
選取 [檔案>新>方案...
在 [新增解決方案] 對話框中,選取 [iOS>整合 API>iOS 系結專案]:
在 [設定新專案] 對話框中,輸入 新系結專案的 [名稱 ],然後按兩下 [ 確定] 按鈕。
包含您要為其建立系結的 Objective-C 64位版本連結庫。
從現有的32位傳統 API 系結項目複製原始碼(例如
ApiDefinition.cs
和StructsAndEnums.cs
檔案)。對原始碼檔案進行上述記號變更。
有了所有這些變更,您可以建置新的64位版本 API,就像32位版本一樣。
摘要
在本文中,我們已示範需要對現有的 Xamarin 系結專案進行變更,以支援新的整合 API 和 64 位裝置,以及建置新 64 位相容 API 版本所需的步驟。