Migrace vazby na Unified API

Tento článek popisuje kroky potřebné k aktualizaci existujícího projektu vazby Xamarin na podporu sjednocených rozhraní API pro aplikace Xamarin.IOS a Xamarin.Mac.

Přehled

Od 1. února 2015 apple vyžaduje, aby všechna nová odeslání do iTunes a Mac App Store měly být 64bitové aplikace. V důsledku toho bude nová aplikace Xamarin.iOS nebo Xamarin.Mac muset místo stávajících klasických rozhraní MonoTouch a MonoMac používat nové sjednocené rozhraní API, aby podporovala 64bitovou verzi.

Kromě toho musí každý projekt vazby Xamarin podporovat také nová sjednocená rozhraní API, která se mají zahrnout do 64bitového projektu Xamarin.iOS nebo Xamarin.Mac. Tento článek popisuje kroky potřebné k aktualizaci existujícího projektu vazby tak, aby používal sjednocené rozhraní API.

Požadavky

K dokončení kroků uvedených v tomto článku je nutné provést následující kroky:

  • Visual Studio pro Mac – nejnovější verze Visual Studio pro Mac nainstalovaná a nakonfigurovaná na vývojovém počítači.
  • Apple Mac – K sestavení vazeb projektů pro iOS a Mac se vyžaduje Apple Mac.

Projekty vazeb nejsou v sadě Visual Studio na počítači s Windows podporované.

Úprava příkazů Using

Sjednocená rozhraní API usnadňují sdílení kódu mezi Macem a iOSem a umožňují podporovat 32 a 64bitové aplikace se stejným binárním souborem. Vyřazením předpon MonoMac a MonoTouch z oborů názvů se jednodušší sdílení dosahuje napříč projekty aplikací Xamarin.Mac a Xamarin.iOS.

V důsledku toho budeme muset upravit všechny naše vazbové kontrakty (a další .cs soubory v našem projektu vazeb), aby se z našich using příkazů odebraly předpony MonoMac a MonoTouch.

Například vzhledem k následujícím příkazům using ve vazbě kontraktu:

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

Oddělíme předponu MonoTouch , která bude mít za následek následující:

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

Znovu to budeme muset udělat pro jakýkoli .cs soubor v našem projektu vazby. Při této změně je dalším krokem aktualizace projektu vazby tak, aby používal nové nativní datové typy.

Další informace o sjednoceném rozhraní API najdete v dokumentaci k sjednocenému rozhraní API . Další informace o podpoře 32 a 64bitových aplikací a informací o architekturách najdete v dokumentaci k 32 a 64bitovým aspektům platformy.

Aktualizace na nativní datové typy

Objective-CNSInteger mapuje datový typ na int32_t 32bitové systémy a na int64_t 64bitové systémy. Aby toto chování odpovídalo, nahradí nové sjednocené rozhraní API předchozí použití int (které v .NET je definováno jako vždy System.Int32) na nový datový typ: System.nint.

Společně s novým nint datovým typem zavádí sjednocené rozhraní API i nfloatnuint typy pro mapování na typy NSUInteger a CGFloat typy.

Vzhledem k výše uvedenému příkladu musíme zkontrolovat naše rozhraní API a zajistit, aby se všechny instance NSIntegera dříve namapované na inta uintfloat aktualizovaly se na nové nuintninta nfloat typy.CGFloatNSUInteger

Například s ohledem na Objective-C definici metody:

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

Pokud předchozí kontrakt vazby měl následující definici:

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

Aktualizovali bychom novou vazbu tak, aby byla:

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

Pokud namapujeme na novější knihovnu třetích stran, než na kterou jsme původně propojili, musíme zkontrolovat .h soubory hlaviček pro knihovnu a zjistit, jestli nedošlo k intukončení, explicitním voláním , int32_t, unsigned intnebo uint32_tfloat že byly upgradovány tak, aby byly nebo NSUIntegerNSIntegerCGFloat. Pokud ano, stejné úpravy nintnuint a nfloat typy budou muset být provedeny i v jejich mapování.

Další informace o těchtozměnách

Aktualizace typů CoreGraphics

Bod, velikost a obdélníkové datové typy, které se používají s CoreGraphics použitím 32 nebo 64 bitů v závislosti na zařízení, na kterém běží. Když Xamarin původně vázal rozhraní API pro iOS a Mac, použili jsme existující datové struktury, které se stalo, aby odpovídaly datovým typům System.Drawing (RectangleF například).

Vzhledem k požadavkům na podporu 64 bitů a nových nativních datových typů bude nutné při volání CoreGraphic metod provést následující úpravy existujícího kódu:

  • CGRect – Použijte CGRect místo RectangleF při definování obdélníkových oblastí s plovoucí desetinou čárkou.
  • CGSize – Používejte CGSize místo SizeF při definování velikostí s plovoucí desetinnou čárkou (šířku a výšku).
  • CGPoint – Používejte CGPoint místo PointF při definování umístění s plovoucí desetinou čárkou (souřadnic X a Y).

Vzhledem k výše uvedenému příkladu budeme muset naše rozhraní API zkontrolovat a zajistit, aby všechny instance CGRectnebo dříve vázané na RectangleFnativní SizeF typ nebo PointF byly změněny na nativní typ CGRectnebo CGSizeCGPoint přímo.CGPointCGSize

Například při inicializátoru Objective-C :

- (id)initWithFrame:(CGRect)frame;

Pokud předchozí vazba obsahovala následující kód:

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

Tento kód bychom aktualizovali na:

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

Když jsou teď všechny změny kódu zavedené, musíme upravit projekt vazby nebo vytvořit soubor, který se má svázat s jednotnými rozhraními API.

Úprava projektu vazby

Jako poslední krok aktualizace projektu vazby tak, aby používal sjednocená rozhraní API, musíme buď upravit MakeFile projekt, který používáme k sestavení projektu, nebo typu projektu Xamarin (pokud jsme vázáni z Visual Studio pro Mac) a instruovat btouch k vytvoření vazby s jednotnými rozhraními API místo klasických rozhraní API.

Aktualizace souboru pravidel

Pokud k sestavení projektu vazby do .DLL Xamarinu používáme soubor pravidel, budeme muset místo toho zahrnout možnost příkazového --new-style řádku a volat btouch-nativebtouch.

S ohledem na následující 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

Potřebujeme přepnout z volání btouch na btouch-native, takže bychom upravili definici makra následujícím způsobem:

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

Volání btouch bychom aktualizovali a přidali následující --new-style možnosti:

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

Teď můžeme spustit naši MakeFile normální verzi a sestavit novou 64bitovou verzi našeho rozhraní API.

Aktualizace typu vazby projektu

Pokud k sestavení našeho rozhraní API používáme šablonu projektu vazby Visual Studio pro Mac, budeme muset aktualizovat na novou verzi sjednoceného rozhraní API šablony projektu vazby. Nejjednodušším způsobem, jak to udělat, je spustit nový projekt vazby sjednoceného rozhraní API a zkopírovat veškerý existující kód a nastavení.

Postupujte následovně:

  1. Spusťte Visual Studio pro Mac.

  2. Vyberte Nové>řešení souboru...>

  3. V dialogovém okně Nové řešení vyberte projekt vazeb rozhraní iOS>Unified API>pro iOS:

    In the New Solution Dialog Box, select iOS / Unified API / iOS Binding Project

  4. V dialogovém okně Konfigurovat nový projekt zadejte název nového projektu vazby a klikněte na tlačítko OK .

  5. Zahrňte 64bitovou Objective-C verzi knihovny, pro kterou budete vytvářet vazby.

  6. Zkopírujte zdrojový kód z existujícího 32bitového projektu vazby rozhraní API Classic (například soubory ApiDefinition.cs a StructsAndEnums.cs soubory).

  7. Proveďte výše uvedené změny souborů zdrojového kódu.

Se všemi těmito změnami můžete vytvořit novou 64bitovou verzi rozhraní API stejně jako 32bitovou verzi.

Shrnutí

V tomto článku jsme si ukázali změny, které je potřeba provést v existujícím projektu Xamarin Binding, aby podporovala nová sjednocená rozhraní API a 64bitová zařízení a kroky potřebné k sestavení nové 64bitové kompatibilní verze rozhraní API.