Migrer une liaison vers l’API unifiée
Cet article décrit les étapes requises pour mettre à jour un projet de liaison Xamarin existant pour prendre en charge les API unifiées pour les applications Xamarin.IOS et Xamarin.Mac.
Vue d’ensemble
À compter du 1er février 2015, Apple exige que toutes les nouvelles soumissions à iTunes et au Mac App Store doivent être des applications 64 bits. Par conséquent, toute nouvelle application Xamarin.iOS ou Xamarin.Mac doit utiliser la nouvelle API unifiée au lieu des API MonoTouch et MonoMac classiques existantes pour prendre en charge 64 bits.
En outre, tout projet de liaison Xamarin doit également prendre en charge les nouvelles API unifiées à inclure dans un projet Xamarin.iOS ou Xamarin.Mac 64 bits. Cet article décrit les étapes requises pour mettre à jour un projet de liaison existant afin d’utiliser l’API unifiée.
Spécifications
Voici les étapes décrites dans cet article :
- Visual Studio pour Mac : la dernière version de Visual Studio pour Mac installée et configurée sur l’ordinateur de développement.
- Apple Mac - Un mac Apple est requis pour générer des projets de liaison pour iOS et Mac.
Les projets de liaison ne sont pas pris en charge dans Visual Studio sur un ordinateur Windows.
Modifier les instructions Using
Les API unifiées facilitent le partage de code entre Mac et iOS, ainsi que la prise en charge des applications 32 et 64 bits avec le même binaire. En supprimant les préfixes MonoMac et MonoTouch des espaces de noms, le partage plus simple est obtenu dans les projets d’application Xamarin.Mac et Xamarin.iOS.
Par conséquent, nous devons modifier l’un de nos contrats de liaison (et d’autres .cs
fichiers dans notre projet de liaison) pour supprimer les préfixes MonoMac et MonoTouch de nos using
instructions.
Par exemple, étant donné les instructions using suivantes dans un contrat de liaison :
using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.ObjCRuntime;
Nous supprimerions le MonoTouch
préfixe résultant des opérations suivantes :
using System;
using System.Drawing;
using Foundation;
using UIKit;
using ObjCRuntime;
Là encore, nous devons effectuer cette opération pour n’importe quel .cs
fichier dans notre projet de liaison. Avec cette modification en place, l’étape suivante consiste à mettre à jour notre projet de liaison pour utiliser les nouveaux types de données natifs.
Pour plus d’informations sur l’API unifiée, consultez la documentation de l’API unifiée. Pour plus d’informations sur la prise en charge des applications 32 et 64 bits et des informations sur les infrastructures, consultez la documentation sur les considérations relatives à la plateforme 32 et 64 bits.
Mettre à jour vers des types de données natifs
Objective-C mappe le NSInteger
type de données aux int32_t
systèmes 32 bits et aux int64_t
systèmes 64 bits. Pour correspondre à ce comportement, la nouvelle API unifiée remplace les utilisations précédentes de (qui dans .NET est définie comme étant toujours System.Int32
) à un nouveau type de int
données : System.nint
.
Outre le nouveau nint
type de données, l’API unifiée introduit également les types et nfloat
les nuint
types pour le mappage aux types et CGFloat
aux NSUInteger
types.
Étant donné les éléments ci-dessus, nous devons passer en revue notre API et vérifier que n’importe quelle instance de , et que nous avons précédemment mappé à int
, uint
et float
obtenir la mise à jour vers les nouveaux nint
et nfloat
nuint
types.CGFloat
NSUInteger
NSInteger
Par exemple, en fonction d’une Objective-C définition de méthode de :
-(NSInteger) add:(NSInteger)operandUn and:(NSInteger) operandDeux;
Si le contrat de liaison précédent avait la définition suivante :
[Export("add:and:")]
int Add(int operandUn, int operandDeux);
Nous allons mettre à jour la nouvelle liaison pour qu’elle soit :
[Export("add:and:")]
nint Add(nint operandUn, nint operandDeux);
Si nous mappons à une bibliothèque tierce de version plus récente que ce à quoi nous avions initialement lié, nous devons examiner les .h
fichiers d’en-tête de la bibliothèque et voir si des appels sortants, explicites à , ou int32_t
uint32_t
float
unsigned int
ont été mis à int
niveau pour être un NSInteger
, NSUInteger
ou un .CGFloat
Si c’est le cas, les mêmes modifications apportées aux nint
nuint
nfloat
types doivent également être apportées à leurs mappages.
Pour en savoir plus sur ces modifications de type de données, consultez le document Types natifs .
Mettre à jour les types CoreGraphics
Les types de données point, taille et rectangle utilisés avec CoreGraphics
32 ou 64 bits en fonction de l’appareil sur lequel ils s’exécutent. Lorsque Xamarin a initialement lié les API iOS et Mac, nous avons utilisé des structures de données existantes qui correspondent aux types de données dans System.Drawing
(RectangleF
par exemple).
En raison des exigences de prise en charge de 64 bits et des nouveaux types de données natifs, les ajustements suivants doivent être apportés au code existant lors de l’appel CoreGraphic
de méthodes :
- CGRect - Utiliser
CGRect
au lieu deRectangleF
définir des régions rectangulaires à virgule flottante. - CGSize - Utilisez
CGSize
plutôtSizeF
que lorsque vous définissez des tailles à virgule flottante (largeur et hauteur). - CGPoint : utilisez
CGPoint
plutôt que lors dePointF
la définition d’un emplacement à virgule flottante (coordonnées X et Y).
Étant donné les éléments ci-dessus, nous devons passer en revue notre API et vérifier que n’importe quelle instance de , ou qui était précédemment liée RectangleF
à , SizeF
ou PointF
être remplacée par le type CGRect
natif , CGSize
ou CGPoint
directement.CGPoint
CGSize
CGRect
Par exemple, en fonction d’un Objective-C initialiseur de :
- (id)initWithFrame:(CGRect)frame;
Si notre liaison précédente incluait le code suivant :
[Export ("initWithFrame:")]
IntPtr Constructor (RectangleF frame);
Nous allons mettre à jour ce code pour :
[Export ("initWithFrame:")]
IntPtr Constructor (CGRect frame);
Avec toutes les modifications de code maintenant en place, nous devons modifier notre projet de liaison ou créer un fichier à lier aux API unifiées.
Modifier le projet de liaison
Comme dernière étape de mise à jour de notre projet de liaison pour utiliser les API unifiées, nous devons modifier le MakeFile
projet que nous utilisons pour générer le projet ou le type de projet Xamarin (si nous sommes liés à partir de Visual Studio pour Mac) et demander à btouch de se lier aux API unifiées au lieu des API classiques.
Mise à jour d’un MakeFile
Si nous utilisons un makefile pour générer notre projet de liaison dans un .DLL Xamarin, nous devons inclure l’option --new-style
de ligne de commande et appeler btouch-native
au lieu de btouch
.
Ainsi, étant donné les éléments suivants 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
Nous devons passer de l’appel btouch
à btouch-native
, nous allons donc ajuster notre définition de macro comme suit :
BTOUCH=/Developer/MonoTouch/usr/bin/btouch-native
Nous allons mettre à jour l’appel et btouch
ajouter l’option --new-style
comme suit :
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
Nous pouvons maintenant exécuter notre MakeFile
version normale pour générer la nouvelle version 64 bits de notre API.
Mise à jour d’un type de projet de liaison
Si nous utilisons un modèle de projet de liaison Visual Studio pour Mac pour générer notre API, nous devons effectuer une mise à jour vers la nouvelle version de l’API unifiée du modèle de projet de liaison. La méthode la plus simple consiste à démarrer un nouveau projet de liaison d’API unifiée et à copier sur l’ensemble du code et des paramètres existants.
Effectuez les actions suivantes :
Démarrez Visual Studio pour Mac.
Sélectionnez Nouvelle >solution de fichier...>
Dans la boîte de dialogue Nouvelle solution, sélectionnez Projet de liaison iOS>d’API>unifiée iOS :
Dans la boîte de dialogue « Configurer votre nouveau projet », entrez un nom pour le nouveau projet de liaison, puis cliquez sur le bouton OK .
Incluez la version 64 bits de Objective-C la bibliothèque pour laquelle vous allez créer des liaisons.
Copiez le code source à partir de votre projet de liaison d’API classique 32 bits existant (par exemple, les fichiers et
StructsAndEnums.cs
lesApiDefinition.cs
fichiers).Apportez les modifications indiquées ci-dessus aux fichiers de code source.
Avec toutes ces modifications en place, vous pouvez générer la nouvelle version 64 bits de l’API comme vous le feriez pour la version 32 bits.
Résumé
Dans cet article, nous avons montré les modifications qui doivent être apportées à un projet de liaison Xamarin existant pour prendre en charge les nouvelles API unifiées et les nouveaux appareils 64 bits et les étapes nécessaires pour générer la nouvelle version compatible 64 bits d’une API.