Share via


Appeler du code de plateforme

Parcourir l’exemple. Parcourir l’exemple

Dans les situations où l’interface utilisateur d’application multiplateforme .NET (.NET MAUI) ne fournit aucune API pour accéder à des API de plateforme spécifiques, vous pouvez écrire votre propre code pour accéder aux API de plateforme requises. Cela nécessite une connaissance des API iOS et MacCatalyst d’Apple, des API Android de Google et des API SDK d'application Windows microsoft.

Le code de plateforme peut être appelé à partir de code multiplateforme à l’aide de la compilation conditionnelle ou à l’aide de classes partielles et de méthodes partielles.

Compilation conditionnelle

Le code de plateforme peut être appelé à partir de code multiplateforme à l’aide de la compilation conditionnelle pour cibler différentes plateformes.

L’exemple suivant montre l’énumération DeviceOrientation , qui sera utilisée pour spécifier l’orientation de votre appareil :

namespace InvokePlatformCodeDemos.Services
{
    public enum DeviceOrientation
    {
        Undefined,
        Landscape,
        Portrait
    }
}

La récupération de l’orientation de votre appareil nécessite l’écriture de code de plateforme. Cela peut être accompli en écrivant une méthode qui utilise la compilation conditionnelle pour cibler différentes plateformes :

#if ANDROID
using Android.Content;
using Android.Views;
using Android.Runtime;
#elif IOS
using UIKit;
#endif

using InvokePlatformCodeDemos.Services;

namespace InvokePlatformCodeDemos.Services.ConditionalCompilation
{
    public class DeviceOrientationService
    {
        public DeviceOrientation GetOrientation()
        {
#if ANDROID
            IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
            SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
            bool isLandscape = orientation == SurfaceOrientation.Rotation90 || orientation == SurfaceOrientation.Rotation270;
            return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
#elif IOS
            UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
            bool isPortrait = orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown;
            return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
#else
            return DeviceOrientation.Undefined;
#endif
        }
    }
}

Dans cet exemple, les implémentations de plateforme de la GetOrientation méthode sont fournies pour Android et iOS. Sur d’autres plateformes, DeviceOrientation.Undefined elle est retournée. Sinon, plutôt que de retourner DeviceOrientation.Undefined , vous pouvez lever un PlatformNotSupportedException qui spécifie les plateformes fournies pour les implémentations :

throw new PlatformNotSupportedException("GetOrientation is only supported on Android and iOS.");

La DeviceOrientationService.GetOrientation méthode peut ensuite être appelée à partir du code multiplateforme en créant une instance d’objet et en appelant son opération :

using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.ConditionalCompilation;
...

DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();

Au moment de la génération, le système de build utilise la compilation conditionnelle pour cibler le code de plateforme Android et iOS sur la plateforme appropriée.

Pour plus d’informations sur la compilation conditionnelle, consultez compilation conditionnelle.

Classes et méthodes partielles

Un projet d’application .NET MAUI contient un dossier Plateformes , avec chaque dossier enfant représentant une plateforme que .NET MAUI peut cibler :

Capture d’écran des dossiers de plateforme.

Les dossiers de chaque plateforme cible contiennent du code spécifique à la plateforme qui démarre l’application sur chaque plateforme, ainsi que tout code de plateforme supplémentaire que vous ajoutez. Au moment de la génération, le système de génération inclut uniquement le code de chaque dossier lors de la génération de cette plateforme spécifique. Par exemple, lorsque vous générez des fichiers Android dans le dossier Plateformes>Android sera intégré au package d’application, mais les fichiers des autres dossiers Plateformes ne seront pas. Cette approche utilise une fonctionnalité appelée multi-ciblage pour cibler plusieurs plateformes à partir d’un seul projet.

Le multi-ciblage peut être combiné avec des classes partielles et des méthodes partielles pour appeler des fonctionnalités de plateforme à partir de code multiplateforme. Le processus d’exécution de cette opération consiste à :

  1. Définissez l’API multiplateforme en tant que classe partielle qui définit les signatures de méthode partielles pour toutes les opérations que vous souhaitez appeler sur chaque plateforme. Pour plus d’informations, consultez Définir l’API multiplateforme.
  2. Implémentez l’API multiplateforme par plateforme, en définissant la même classe partielle et les mêmes signatures de méthode partielles, tout en fournissant également les implémentations de méthode. Pour plus d’informations, consultez Implémenter l’API par plateforme.
  3. Appelez l’API multiplateforme en créant une instance de la classe partielle et en appelant ses méthodes selon les besoins. Pour plus d’informations, consultez Appeler l’API multiplateforme.

Définir l’API multiplateforme

Pour appeler du code de plateforme à partir de code multiplateforme, la première étape consiste à définir l’API multiplateforme en tant que classe partielle qui définit des signatures de méthode partielles pour toutes les opérations que vous souhaitez appeler sur chaque plateforme.

L’exemple suivant montre l’énumération DeviceOrientation , qui sera utilisée pour spécifier l’orientation de votre appareil :

namespace InvokePlatformCodeDemos.Services
{
    public enum DeviceOrientation
    {
        Undefined,
        Landscape,
        Portrait
    }
}

L’exemple suivant montre une API multiplateforme qui peut être utilisée pour récupérer l’orientation d’un appareil :

namespace InvokePlatformCodeDemos.Services.PartialMethods
{
    public partial class DeviceOrientationService
    {
        public partial DeviceOrientation GetOrientation();
    }
}

La classe partielle est nommée DeviceOrientationService, qui inclut une méthode partielle nommée GetOrientation. Le fichier de code de cette classe doit être en dehors du dossier Plateformes :

Classe DeviceOrientationService dans la capture d’écran du dossier Services.

Implémenter l’API par plateforme

Après avoir défini l’API multiplateforme, elle doit être implémentée sur toutes les plateformes que vous ciblez en définissant la même classe partielle et les mêmes signatures de méthode partielles, tout en fournissant également les implémentations de méthode.

Les implémentations de plateforme doivent être placées dans les dossiers enfants plateformes appropriés pour s’assurer que le système de génération tente uniquement de générer du code de plateforme lors de la génération de la plateforme spécifique. Le tableau suivant répertorie les emplacements de dossier par défaut pour les implémentations de plateforme :

Plateforme Dossier
Android Plates-formes>Android
iOS Plates-formes>Ios
MacCatalyst Plates-formes>MacCatalyst
Tizen Plates-formes>Tizen
Windows Plates-formes>Windows

Important

Les implémentations de plateforme doivent se trouver dans le même espace de noms et dans la même classe que l’API multiplateforme dans laquelle l’API multiplateforme a été définie.

La capture d’écran suivante montre les classes dans les DeviceOrientationService dossiers Android et iOS :

Classes DeviceOrientationService dans leur capture d’écran du dossier Plateformes.

Vous pouvez également effectuer le multi-ciblage en fonction de vos propres critères de nom de fichier et de dossier, plutôt que d’utiliser les dossiers Plateformes . Pour plus d’informations, consultez Configurer le multi-ciblage.

Android

L’exemple suivant montre l’implémentation de la GetOrientation méthode sur Android :

using Android.Content;
using Android.Runtime;
using Android.Views;

namespace InvokePlatformCodeDemos.Services.PartialMethods;

public partial class DeviceOrientationService
{
    public partial DeviceOrientation GetOrientation()
    {
        IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
        SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
        bool isLandscape = orientation == SurfaceOrientation.Rotation90 || orientation == SurfaceOrientation.Rotation270;
        return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
    }
}

iOS

L’exemple suivant montre l’implémentation de la GetOrientation méthode sur iOS :

using UIKit;

namespace InvokePlatformCodeDemos.Services.PartialMethods;

public partial class DeviceOrientationService
{
    public partial DeviceOrientation GetOrientation()
    {
        UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
        bool isPortrait = orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown;
        return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
    }
}

Appeler l’API multiplateforme

Après avoir fourni les implémentations de la plateforme, l’API peut être appelée à partir du code multiplateforme en créant une instance d’objet et en appelant son opération :

using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.PartialMethods;
...

DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();

Au moment de la génération, le système de génération utilise le multi-ciblage pour combiner la classe partielle multiplateforme avec la classe partielle pour la plateforme cible et la générer dans le package d’application.

Configurer le multi-ciblage

Les applications .NET MAUI peuvent également être multi-ciblées en fonction de vos propres critères de nom de fichier et de dossier. Cela vous permet de structurer votre projet d’application .NET MAUI afin que vous n’ayez pas à placer votre code de plateforme dans des dossiers enfants du dossier Plateformes .

Par exemple, un modèle multi-ciblage standard consiste à inclure la plateforme en tant qu’extension dans le nom de fichier du code de la plateforme. Le système de build peut être configuré pour combiner des classes partielles multiplateformes avec des classes partielles de plateforme en fonction de ce modèle :

Classes DeviceOrientationService à l’aide d’un multi-ciblage basé sur un nom de fichier.

Un autre modèle de multi-ciblage standard consiste à inclure la plateforme en tant que nom de dossier. Le système de build peut être configuré pour combiner des classes partielles multiplateformes avec des classes partielles de plateforme en fonction de ce modèle :

Classes DeviceOrientationService à l’aide du multi-ciblage basé sur des dossiers.

Pour plus d’informations, consultez Configurer le multi-ciblage.