Migrowanie powiązania do ujednoliconego interfejsu API
W tym artykule opisano kroki wymagane do zaktualizowania istniejącego projektu powiązania platformy Xamarin w celu obsługi ujednoliconych interfejsów API dla aplikacji platform Xamarin.IOS i Xamarin.Mac.
Omówienie
Od 1 lutego 2015 r. Apple wymaga, aby wszystkie nowe zgłoszenia do iTunes i Sklepu Mac App Store musiały być aplikacjami 64-bitowymi. W związku z tym każda nowa aplikacja platformy Xamarin.iOS lub Xamarin.Mac będzie musiała używać nowego ujednoliconego interfejsu API zamiast istniejących klasycznych interfejsów API MonoTouch i MonoMac do obsługi 64-bitowych interfejsów API.
Ponadto każdy projekt powiązania platformy Xamarin musi również obsługiwać nowe ujednolicone interfejsy API, które mają zostać uwzględnione w 64-bitowym projekcie Xamarin.iOS lub Xamarin.Mac. W tym artykule opisano kroki wymagane do zaktualizowania istniejącego projektu powiązania w celu korzystania z ujednoliconego interfejsu API.
Wymagania
Do wykonania kroków przedstawionych w tym artykule są wymagane następujące czynności:
- Visual Studio dla komputerów Mac — najnowsza wersja Visual Studio dla komputerów Mac zainstalowana i skonfigurowana na komputerze dewelopera.
- Apple Mac — komputer Mac firmy Apple jest wymagany do tworzenia projektów powiązań dla systemów iOS i Mac.
Tworzenie powiązań projektów nie jest obsługiwane w programie Visual Studio na maszynie z systemem Windows.
Modyfikowanie instrukcji Using
Ujednolicone interfejsy API ułatwiają udostępnianie kodu między komputerami Mac i iOS, a także umożliwiają obsługę 32 i 64-bitowych aplikacji z tym samym plikiem binarnym. Porzucając prefiksy MonoMac i MonoTouch z przestrzeni nazw, łatwiejsze udostępnianie odbywa się w projektach aplikacji Xamarin.Mac i Xamarin.iOS.
W rezultacie musimy zmodyfikować dowolny z naszych kontraktów powiązań (i innych .cs
plików w naszym projekcie powiązania), aby usunąć prefiksy MonoMac i MonoTouch z naszych using
instrukcji.
Na przykład, biorąc pod uwagę następujące instrukcje using w umowie powiązania:
using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.ObjCRuntime;
Usuńmy MonoTouch
prefiks, co spowoduje wykonanie następujących czynności:
using System;
using System.Drawing;
using Foundation;
using UIKit;
using ObjCRuntime;
Ponownie musimy to zrobić dla dowolnego .cs
pliku w naszym projekcie powiązania. Po tej zmianie następnym krokiem jest zaktualizowanie naszego projektu powiązania w celu użycia nowych natywnych typów danych.
Aby uzyskać więcej informacji na temat ujednoliconego interfejsu API, zobacz dokumentację ujednoliconego interfejsu API . Aby uzyskać więcej informacji na temat obsługi aplikacji 32-bitowych i 64-bitowych oraz informacji o strukturach, zobacz dokumentację 32 i 64-bitowych zagadnień dotyczących platformy .
Aktualizacja do natywnych typów danych
Objective-C mapuje NSInteger
typ danych na int32_t
w systemach 32-bitowych i int64_t
w systemach 64-bitowych. Aby dopasować to zachowanie, nowy ujednolicony interfejs API zastępuje poprzednie zastosowania int
(które na platformie .NET są zdefiniowane jako zawsze System.Int32
) do nowego typu danych: System.nint
.
Wraz z nowym nint
typem danych ujednolicony nuint
interfejs API wprowadza typy i nfloat
do mapowania na NSUInteger
typy i CGFloat
.
Biorąc pod uwagę powyższe elementy, musimy przejrzeć nasz interfejs API i upewnić się, że dowolne wystąpienie NSInteger
elementu NSUInteger
CGFloat
i zostało wcześniej zamapowane na int
, uint
i float
zostanie zaktualizowane do nowych nuint
nint
typów i nfloat
.
Na przykład biorąc pod uwagę definicję Objective-C metody:
-(NSInteger) add:(NSInteger)operandUn and:(NSInteger) operandDeux;
Jeśli poprzedni kontrakt powiązania miał następującą definicję:
[Export("add:and:")]
int Add(int operandUn, int operandDeux);
Zaktualizowalibyśmy nowe powiązanie tak, aby było następujące:
[Export("add:and:")]
nint Add(nint operandUn, nint operandDeux);
Jeśli mapujemy na nowszą wersję biblioteki innej firmy niż to, z czym początkowo połączono, musimy przejrzeć .h
pliki nagłówkowe biblioteki i sprawdzić, czy jakiekolwiek zakończenie, jawne wywołania , int
int32_t
, unsigned int
uint32_t
lub float
zostały uaktualnione do NSInteger
NSUInteger
elementu , lub CGFloat
. Jeśli tak, te same modyfikacje nint
nuint
typów i nfloat
również będą musiały zostać wprowadzone do ich mapowań.
Aby dowiedzieć się więcej na temat tych zmian typów danych, zobacz dokument Native Types (Typy natywne).
Aktualizowanie typów CoreGraphics
Typy danych punktów, rozmiarów i prostokątów, które są używane z CoreGraphics
użyciem 32 lub 64 bitów w zależności od urządzenia, na którym są uruchomione. Gdy platforma Xamarin pierwotnie powiązała interfejsy API systemów iOS i Mac, użyliśmy istniejących struktur danych, które były zgodne z typami danych w System.Drawing
programie (RectangleF
na przykład).
Ze względu na wymagania dotyczące obsługi 64 bitów i nowych natywnych typów danych podczas wywoływania CoreGraphic
metod należy wprowadzić następujące zmiany w istniejącym kodzie:
- CGRect —
CGRect
zamiastRectangleF
definiowania prostokątnych regionów zmiennoprzecinkowych. - CGSize —
CGSize
zamiastSizeF
definiowania rozmiarów zmiennoprzecinkowych (szerokość i wysokość). - CGPoint —
CGPoint
zamiastPointF
definiowania lokalizacji zmiennoprzecinkowych (współrzędnych X i Y).
Biorąc pod uwagę powyższe, musimy przejrzeć nasz interfejs API i upewnić się, że dowolne wystąpienie elementu lub, które zostało wcześniej powiązane z RectangleF
, SizeF
lub PointF
zostanie zmienione na typ CGSize
CGRect
natywny lub CGPoint
bezpośrednio.CGPoint
CGSize
CGRect
Na przykład przy użyciu Objective-C inicjatora:
- (id)initWithFrame:(CGRect)frame;
Jeśli poprzednie powiązanie zawiera następujący kod:
[Export ("initWithFrame:")]
IntPtr Constructor (RectangleF frame);
Zaktualizujemy ten kod na:
[Export ("initWithFrame:")]
IntPtr Constructor (CGRect frame);
Po wprowadzeniu wszystkich zmian w kodzie musimy zmodyfikować nasz projekt powiązania lub utworzyć plik w celu powiązania z ujednoliconymi interfejsami API.
Modyfikowanie projektu powiązania
W ostatnim kroku aktualizowania projektu powiązania w celu korzystania z ujednoliconych interfejsów API musimy zmodyfikować MakeFile
element używany do skompilowania projektu lub typu projektu Xamarin (jeśli jesteśmy powiązani z poziomu Visual Studio dla komputerów Mac) i poinstruować btouch, aby powiązać z ujednoliconymi interfejsami API zamiast klasycznych.
Aktualizowanie pliku MakeFile
Jeśli używamy pliku make do kompilowania naszego projektu powiązania w .DLL platformy Xamarin, musimy dołączyć --new-style
opcję wiersza polecenia i wywołać btouch-native
metodę zamiast btouch
.
W związku z tym, biorąc pod uwagę następujące elementy 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
Musimy przełączyć się z wywołania btouch
na btouch-native
, więc dostosujemy definicję makr w następujący sposób:
BTOUCH=/Developer/MonoTouch/usr/bin/btouch-native
Zaktualizujemy wywołanie btouch
metody i dodamy --new-style
opcję w następujący sposób:
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
Teraz możemy wykonać nasz MakeFile
standard, aby skompilować nową 64-bitowa wersję naszego interfejsu API.
Aktualizowanie typu projektu powiązania
Jeśli do skompilowania interfejsu API używamy szablonu projektu powiązania Visual Studio dla komputerów Mac, musimy zaktualizować go do nowej ujednoliconej wersji interfejsu API szablonu wiążącego projektu. Najprostszym sposobem wykonania tej czynności jest uruchomienie nowego projektu ujednoliconego powiązania interfejsu API i skopiowanie całego istniejącego kodu i ustawień.
Należy wykonać następujące czynności:
Uruchom Visual Studio dla komputerów Mac.
Wybierz pozycję Plik>nowe>rozwiązanie...
W oknie dialogowym Nowe rozwiązanie wybierz pozycję Projekt powiązania ujednoliconego interfejsu API>systemu iOS dla systemu iOS>:
W oknie dialogowym "Konfigurowanie nowego projektu" wprowadź nazwę nowego projektu powiązania i kliknij przycisk OK .
Uwzględnij 64-bitowej Objective-C wersji biblioteki, dla której będziesz tworzyć powiązania.
Skopiuj kod źródłowy z istniejącego 32-bitowego projektu powiązania interfejsu API klasycznego (na przykład
ApiDefinition.cs
plików iStructsAndEnums.cs
).Wprowadź powyższe zanotowany zmiany w plikach kodu źródłowego.
Po wprowadzeniu wszystkich tych zmian można utworzyć nową 64-bitowa wersję interfejsu API, tak jak w przypadku wersji 32-bitowej.
Podsumowanie
W tym artykule przedstawiono zmiany, które należy wprowadzić w istniejącym projekcie powiązania platformy Xamarin, aby obsługiwać nowe ujednolicone interfejsy API i urządzenia 64-bitowe oraz kroki wymagane do utworzenia nowej 64-bitowej wersji interfejsu API zgodnej.