Migrace vazby na Unified API

Tento článek popisuje kroky potřebné k aktualizaci existující vazby Xamarin Project pro 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 musí být 64bitové aplikace. V důsledku toho bude muset nová aplikace Xamarin.iOS nebo Xamarin.Mac používat nové sjednocené rozhraní API místo stávajících rozhraní API Classic MonoTouch a MonoMac, aby podporovala 64bitovou verzi.

Kromě toho musí všechny Project vazby Xamarinu 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 pro použití sjednoceného 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 – Apple mac je nutný k vytváření vazeb projektů pro iOS a Mac.

Vazbové projekty nejsou v sadě Visual Studio podporovány na Windows počítači.

Ú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 některé z našich vazeb kontraktů (a dalších .cs souborů v našem projektu vazeb) tak, aby se z našich using příkazů odebraly předpony MonoMac a MonoTouch.

Například pro následující příkazy using ve vazbě kontraktu:

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

Předponu MonoTouch bychom odebrali takhle:

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 závazném projektu. 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-C mapuje NSInteger 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é je v .NET 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 také typy nuint a nfloat typy pro mapování na typy NSUInteger a CGFloat typy.

Vzhledem k výše uvedeným informacím musíme zkontrolovat naše rozhraní API a zajistit, aby se všechny instance NSIntegera dříve namapované na uintinta float aktualizovaly se na nové nintnuint typy a nfloat typy.CGFloatNSUInteger

Například při definici Objective-C metody:

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

Pokud předchozí vazba kontraktu obsahovala 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ě napojili, musíme zkontrolovat .h soubory hlaviček knihovny a zjistit, jestli některé ukončovací, explicitní volání int, int32_t, unsigned intnebo uint32_tfloat byly upgradovány tak, aby byly nebo NSIntegernebo NSUIntegerCGFloat. Pokud ano, je třeba provést i stejné úpravy nintnuint a nfloat typy na jejich mapování.

Další informace o těchto změnách datového typu najdete v dokumentu Nativní typy .

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 na rozhraní API pro iOS a Mac, použili jsme existující datové struktury, které odpovídaly datovým typům ( System.DrawingRectangleF například).

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

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

Vzhledem k výše uvedenému příkladu musíme naše rozhraní API zkontrolovat a zajistit, aby byla jakákoli instance nebo CGSize dříve svázaná s RectangleFSizeF nativním typem CGSizeCGPointCGRectnebo PointF přímo.CGPointCGRect

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);

Se všemi změnami kódu teď musíme upravit projekt vazby nebo vytvořit soubor pro vytvoření vazby s jednotnými rozhraními API.

Úprava Project vazby

Jako poslední krok k aktualizaci projektu vazby tak, aby používal sjednocená rozhraní API, musíme buď upravit MakeFile to, které používáme k sestavení projektu, nebo typ Xamarinu Project (pokud jsme vazby z Visual Studio pro Mac) a dát btouch pokyn, aby se svázat s sjednocenými rozhraními API místo klasických rozhraní API.

Aktualizace souboru MakeFile

Pokud k sestavení projektu vazby do .DLL Xamarinu používáme makefile, musíme 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žnost:

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, abychom vytvořili novou 64bitovou verzi našeho rozhraní API.

Aktualizace typu Project vazby

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

Postupujte následovně:

  1. Spusťte Visual Studio pro Mac.

  2. Vyberte FileNewSolution...>>

  3. V dialogovém okně Nové řešení vyberte Project vazbyiOSUnified>APIiOS>:

    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 verzi Objective-C 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 z těchto ApiDefinition.cs souborů a StructsAndEnums.cs souborů).

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

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

Souhrn

V tomto článku jsme ukázali změny, které je potřeba provést u existující vazby Xamarin Project pro podporu nových sjednocených rozhraní API a 64bitových zařízení a kroků potřebných k sestavení nové 64bitové verze rozhraní API.