Udostępnij za pośrednictwem


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 NSIntegerelementu NSUIntegerCGFloat i zostało wcześniej zamapowane na int, uint i float zostanie zaktualizowane do nowych nuintninttypó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 , intint32_t, unsigned intuint32_t lub float zostały uaktualnione do NSIntegerNSUInteger elementu , lub CGFloat. Jeśli tak, te same modyfikacje nintnuint 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:

  • CGRectCGRect zamiast RectangleF definiowania prostokątnych regionów zmiennoprzecinkowych.
  • CGSizeCGSize zamiast SizeF definiowania rozmiarów zmiennoprzecinkowych (szerokość i wysokość).
  • CGPointCGPoint zamiast PointF 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 CGSizeCGRectnatywny lub CGPoint bezpośrednio.CGPointCGSizeCGRect

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:

  1. Uruchom Visual Studio dla komputerów Mac.

  2. Wybierz pozycję Plik>nowe>rozwiązanie...

  3. W oknie dialogowym Nowe rozwiązanie wybierz pozycję Projekt powiązania ujednoliconego interfejsu API>systemu iOS dla systemu iOS>:

    W oknie dialogowym Nowe rozwiązanie wybierz pozycję Projekt powiązania interfejsu API /Ujednolicony interfejs API/iOS

  4. W oknie dialogowym "Konfigurowanie nowego projektu" wprowadź nazwę nowego projektu powiązania i kliknij przycisk OK .

  5. Uwzględnij 64-bitowej Objective-C wersji biblioteki, dla której będziesz tworzyć powiązania.

  6. Skopiuj kod źródłowy z istniejącego 32-bitowego projektu powiązania interfejsu API klasycznego (na przykład ApiDefinition.cs plików i StructsAndEnums.cs ).

  7. 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.