Migrieren einer Bindung zu Unified API
In diesem Artikel werden die Schritte behandelt, die erforderlich sind, um ein vorhandenes Xamarin Binding Project zu aktualisieren, um die Unified APIs für Xamarin.IOS- und Xamarin.Mac-Anwendungen zu unterstützen.
Übersicht
Ab dem 1. Februar 2015 erfordert Apple, dass alle neuen Übermittlungen an iTunes und mac App Store 64-Bit-Anwendungen sein müssen. Daher muss jede neue Xamarin.iOS- oder Xamarin.Mac-Anwendung die neue Unified-API anstelle der vorhandenen klassischen MonoTouch- und MonoMac-APIs verwenden, um 64 Bit zu unterstützen.
Darüber hinaus muss jedes Xamarin-Bindungsprojekt auch die neuen Unified-APIs unterstützen, die in einem 64-Bit-Xamarin.iOS- oder Xamarin.Mac-Projekt enthalten sein sollen. In diesem Artikel werden die Schritte behandelt, die erforderlich sind, um ein vorhandenes Bindungsprojekt für die Verwendung der Unified API zu aktualisieren.
Anforderungen
Die folgenden Schritte sind erforderlich, um die in diesem Artikel beschriebenen Schritte auszuführen:
- Visual Studio für Mac – Die neueste Version von Visual Studio für Mac auf dem Entwicklungscomputer installiert und konfiguriert.
- Apple Mac – Ein Apple Mac ist erforderlich, um Bindungsprojekte für iOS und Mac zu erstellen.
Bindungsprojekte werden in Visual Studio auf einem Windows-Computer nicht unterstützt.
Ändern der Using-Anweisungen
Die Unified-APIs erleichtern die Gemeinsame Nutzung von Code zwischen Mac und iOS sowie die Unterstützung von 32- und 64-Bit-Anwendungen mit derselben Binärdatei. Durch das Ablegen der Präfixe MonoMac und MonoTouch aus den Namespaces wird die einfachere Freigabe in Xamarin.Mac- und Xamarin.iOS-Anwendungsprojekten erreicht.
Daher müssen wir einen unserer verbindlichen Verträge (und andere .cs
Dateien in unserem verbindlichen Projekt) ändern, um die Präfixe MonoMac und MonoTouch aus unseren using
Erklärungen zu entfernen.
Beispiel: In Anbetracht der folgenden Verwendungsanweisungen in einem verbindlichen Vertrag:
using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.ObjCRuntime;
Wir würden das MonoTouch
Präfix entfernen, was zu folgendem Ergebnis führt:
using System;
using System.Drawing;
using Foundation;
using UIKit;
using ObjCRuntime;
Auch hier müssen wir dies für jede .cs
Datei in unserem Bindungsprojekt tun. Mit dieser Änderung besteht der nächste Schritt darin, unser Bindungsprojekt so zu aktualisieren, dass die neuen nativen Datentypen verwendet werden.
Weitere Informationen zur Unified API finden Sie in der Unified API-Dokumentation . Weitere Hintergrundinformationen zur Unterstützung von 32- und 64-Bit-Anwendungen und Informationen zu Frameworks finden Sie in der Dokumentation zu 32- und 64-Bit-Plattformüberlegungen .
Aktualisieren auf systemeigene Datentypen
Objective-C ordnet den NSInteger
Datentyp int32_t
auf 32-Bit-Systemen und auf 64-Bit-Systemen zu int64_t
. Um diesem Verhalten zu entsprechen, ersetzt die neue Unified-API die vorherigen Verwendungen ( int
die in .NET als immer definiert sind System.Int32
) in einen neuen Datentyp: System.nint
.
Zusammen mit dem neuen nint
Datentyp führt die Unified-API die und nfloat
die nuint
Typen ein, um auch die Zuordnung zu den NSUInteger
Und CGFloat
Typen zu erfahren.
In Anbetracht der oben genannten, müssen wir unsere API überprüfen und sicherstellen, dass jede Instanz von , und die wir zuvor zugeordnet int
haben, uint
und float
auf die neuen nint
Und nfloat
nuint
Typen aktualisiert werden.CGFloat
NSUInteger
NSInteger
Beispiel: Eine Objective-C Methodendefinition von:
-(NSInteger) add:(NSInteger)operandUn and:(NSInteger) operandDeux;
Wenn der vorherige bindungsverbindliche Vertrag die folgende Definition hatte:
[Export("add:and:")]
int Add(int operandUn, int operandDeux);
Wir würden die neue Bindung so aktualisieren, dass:
[Export("add:and:")]
nint Add(nint operandUn, nint operandDeux);
Wenn wir eine neuere Version 3-Drittanbieterbibliothek zuordnen als mit dem, was wir ursprünglich verknüpft hatten, müssen wir die .h
Headerdateien für die Bibliothek überprüfen und überprüfen, ob alle beendenden, expliziten Aufrufe von int
, int32_t
, , oder float
unsigned int
uint32_t
ein Upgrade auf ein NSInteger
, NSUInteger
oder ein CGFloat
Upgrade durchgeführt wurden. Wenn ja, müssen die gleichen Änderungen an den nint
nuint
zugehörigen Zuordnungen vorgenommen werden, und nfloat
die Typen müssen ebenfalls vorgenommen werden.
Weitere Informationen zu diesen Datentypänderungen finden Sie im Dokument " Native Types ".
Aktualisieren der CoreGraphics-Typen
Die Datentypen Punkt, Größe und Rechteck, die je nach Gerät, auf dem sie ausgeführt werden, mit CoreGraphics
32 oder 64 Bit verwendet werden. Wenn Xamarin die iOS- und Mac-APIs ursprünglich gebunden hat, haben wir vorhandene Datenstrukturen verwendet, die mit den Datentypen System.Drawing
übereinstimmen (RectangleF
z. B. ).
Aufgrund der Anforderungen zur Unterstützung von 64 Bits und den neuen systemeigenen Datentypen müssen beim Aufrufen CoreGraphic
von Methoden die folgenden Anpassungen an vorhandenem Code vorgenommen werden:
- CGRect – Verwenden Sie
CGRect
anstelle der Definition rechteckigerRectangleF
Gleitkommabereiche. - CGSize – Verwenden Sie
CGSize
anstelle der Definition vonSizeF
Gleitkommagrößen (Breite und Höhe). - CGPoint – Verwenden Sie
CGPoint
anstelle derPointF
Definition einer Gleitkommaposition (X- und Y-Koordinaten).
Im Vorstehenden müssen wir unsere API überprüfen und sicherstellen, dass jede Instanz von , oder die zuvor an den systemeigenen Typ CGRect
CGSize
CGPoint
gebunden SizeF
RectangleF
oder PointF
direkt geändert wurde.CGPoint
CGSize
CGRect
Beispiel: Initialisierer Objective-C von:
- (id)initWithFrame:(CGRect)frame;
Wenn unsere vorherige Bindung den folgenden Code enthält:
[Export ("initWithFrame:")]
IntPtr Constructor (RectangleF frame);
Wir würden diesen Code aktualisieren auf:
[Export ("initWithFrame:")]
IntPtr Constructor (CGRect frame);
Da jetzt alle Codeänderungen vorgenommen wurden, müssen wir unser Bindungsprojekt ändern oder eine Datei zum Binden an die Unified-APIs vornehmen.
Ändern des Bindungsprojekts
Als letzten Schritt zum Aktualisieren unseres Bindungsprojekts für die Verwendung der Unified-APIs müssen wir entweder das MakeFile
Projekt oder den Xamarin-Projekttyp (wenn wir innerhalb von Visual Studio für Mac binden) ändern und btouch anweisen, eine Bindung an die Unified-APIs anstelle der klassischen APIs auszuführen.
Aktualisieren einer MakeFile-Datei
Wenn wir eine Makefile verwenden, um unser Bindungsprojekt in einem Xamarin-.DLL zu erstellen, müssen wir die --new-style
Befehlszeilenoption und den Aufruf btouch-native
anstelle von btouch
.
In Anbetracht der folgenden Punkte 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
Wir müssen von Anrufen btouch
zu btouch-native
wechseln, damit wir unsere Makrodefinition wie folgt anpassen würden:
BTOUCH=/Developer/MonoTouch/usr/bin/btouch-native
Wir aktualisieren den Aufruf und btouch
fügen die --new-style
Option wie folgt hinzu:
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
Wir können jetzt unsere MakeFile
als normal ausführen, um die neue 64-Bit-Version unserer API zu erstellen.
Aktualisieren eines Bindungsprojekttyps
Wenn wir eine Visual Studio für Mac Bindungsprojektvorlage verwenden, um unsere API zu erstellen, müssen wir auf die neue Unified API-Version der Bindungsprojektvorlage aktualisieren. Die einfachste Möglichkeit besteht darin, ein neues Unified API Binding Project zu starten und den gesamten vorhandenen Code und die vorhandenen Einstellungen zu kopieren.
Gehen Sie folgendermaßen vor:
Starten Sie Visual Studio für Mac.
>Datei neue>Lösung auswählen...
Wählen Sie im Dialogfeld "Neue Lösung" die Option "iOS>Unified API>iOS Binding Project" aus:
Geben Sie im Dialogfeld "Neues Projekt konfigurieren" einen Namen für das neue Bindungsprojekt ein, und klicken Sie auf die Schaltfläche "OK ".
Schließen Sie die 64-Bit-Version der Objective-C Bibliothek ein, für die Sie Bindungen erstellen möchten.
Kopieren Sie den Quellcode aus Ihrem vorhandenen 32-Bit-Klassischen API-Bindungsprojekt (z. B. die
ApiDefinition.cs
dateien).StructsAndEnums.cs
Nehmen Sie die oben genannten Änderungen an den Quellcodedateien vor.
Mit all diesen Änderungen können Sie die neue 64-Bit-Version der API wie die 32-Bit-Version erstellen.
Zusammenfassung
In diesem Artikel haben wir die Änderungen gezeigt, die an einem vorhandenen Xamarin Binding Project vorgenommen werden müssen, um die neuen Unified APIs und 64-Bit-Geräte zu unterstützen, sowie die Schritte, die zum Erstellen der neuen 64-Bit-kompatiblen Version einer API erforderlich sind.