Condividi tramite


Richiamare il codice della piattaforma

Sfoglia l'esempio. Sfoglia l'esempio

Nelle situazioni in cui l'interfaccia utente dell'app multipiattaforma .NET (.NET MAUI) non fornisce API per l'accesso a API di piattaforma specifiche, è possibile scrivere codice personalizzato per accedere alle API della piattaforma necessarie. Ciò richiede la conoscenza delle API iOS e MacCatalyst di Apple, delle API Android di Google e delle API Di Windows App SDK di Microsoft.

Il codice della piattaforma può essere richiamato dal codice multipiattaforma usando la compilazione condizionale o usando classi parziali e metodi parziali.

Compilazione condizionale

Il codice della piattaforma può essere richiamato dal codice multipiattaforma usando la compilazione condizionale per fare riferimento a piattaforme diverse.

L'esempio seguente mostra l'enumerazione DeviceOrientation , che verrà usata per specificare l'orientamento del dispositivo:

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

Il recupero dell'orientamento del dispositivo richiede la scrittura del codice della piattaforma. A tale scopo, scrivere un metodo che usa la compilazione condizionale per usare piattaforme diverse:

#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
        }
    }
}

In questo esempio, le implementazioni della piattaforma del metodo GetOrientation sono fornite per Android e iOS. In altre piattaforme viene restituito DeviceOrientation.Undefined. In alternativa, invece di DeviceOrientation.Undefined restituire è possibile generare un oggetto PlatformNotSupportedException che specifica le piattaforme per cui vengono fornite le implementazioni:

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

Il DeviceOrientationService.GetOrientation metodo può quindi essere richiamato dal codice multipiattaforma creando un'istanza dell'oggetto e richiamandone l'operazione:

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

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

In fase di compilazione il sistema di compilazione usa la compilazione condizionale per impostare come destinazione il codice della piattaforma Android e iOS nella piattaforma corretta.

Per altre informazioni sulla compilazione condizionale, vedere Compilazione condizionale.

Classi e metodi parziali

Un progetto di app .NET MAUI contiene una cartella Platforms, con ogni sottocartella che rappresenta una piattaforma presa di mira da .NET MAUI.

Screenshot delle cartelle della piattaforma.

Le cartelle per ogni piattaforma di destinazione contengono codice specifico della piattaforma che avvia l'app in ogni piattaforma, oltre a qualsiasi codice aggiuntivo della piattaforma aggiunto. In fase di compilazione, il sistema di compilazione include solo il codice di ogni cartella durante la compilazione per tale piattaforma specifica. Ad esempio, quando si compila per Android i file nella cartella Piattaforme>Android verranno incorporati nel pacchetto dell'app, ma i file nelle altre cartelle Piattaforme non saranno. Questo approccio usa una funzionalità denominata multitargeting per indirizzare più piattaforme da un singolo progetto.

Il multitargeting può essere combinato con classi parziali e metodi parziali per richiamare le funzionalità della piattaforma dal codice multipiattaforma. Il processo per eseguire questa operazione consiste nel:

  1. Definire l'API multipiattaforma come classe parziale che definisce le firme parziali dei metodi per tutte le operazioni che si desidera richiamare su ogni piattaforma. Per altre informazioni, vedere Definire l'API multipiattaforma.
  2. Implementare l'API multipiattaforma per ogni piattaforma definendo la stessa classe parziale e le stesse firme parziali del metodo, fornendo allo stesso tempo le implementazioni del metodo. Per altre informazioni, vedere Implementare l'API per ogni piattaforma.
  3. Richiamare l'API multipiattaforma creando un'istanza della classe parziale e richiamando i relativi metodi in base alle esigenze. Per altre informazioni, vedere Richiamare l'API multipiattaforma.

Definire l'API multipiattaforma

Per richiamare il codice della piattaforma dal codice multipiattaforma, il primo passaggio consiste nel definire l'API multipiattaforma come classe parziale che definisce le firme parziali del metodo per tutte le operazioni che si desidera richiamare su ogni piattaforma.

L'esempio seguente mostra l'enumerazione DeviceOrientation , che verrà usata per specificare l'orientamento del dispositivo:

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

L'esempio seguente mostra un'API multipiattaforma che può essere usata per recuperare l'orientamento di un dispositivo:

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

La classe parziale è denominata DeviceOrientationService, che include un metodo parziale denominato GetOrientation. Il file di codice per questa classe deve essere esterno alla cartella Platforms :

Classe DeviceOrientationService nella schermata della cartella Services.

Implementare l'API per ogni piattaforma

Dopo aver definito l'API multipiattaforma, deve essere implementata in tutte le piattaforme di destinazione definendo la stessa classe parziale e le stesse firme del metodo parziale, fornendo anche le implementazioni del metodo.

Le implementazioni della piattaforma devono essere inserite nelle cartelle figlio Piattaforme corrette per assicurarsi che il sistema di compilazione tenti solo di compilare il codice della piattaforma durante la compilazione per la piattaforma specifica. La tabella seguente elenca i percorsi predefiniti delle cartelle per le implementazioni della piattaforma:

Piattaforma Cartella
Android Piattaforme>Android
iOS Piattaforme>Ios
MacCatalyst Piattaforme>MacCatalyst
Tizen Piattaforme>Tizen
Windows Piattaforme>Windows

Importante

Le implementazioni della piattaforma devono trovarsi nello stesso spazio dei nomi e nella stessa classe in cui è stata definita l'API multipiattaforma.

Lo screenshot seguente mostra le DeviceOrientationService classi nelle cartelle Android e iOS :

Screenshot delle classi DeviceOrientationService nella relativa cartella Platforms.

In alternativa, è possibile eseguire multitargeting in base ai propri criteri di nome file e cartelle, invece di usare le cartelle Piattaforme . Per altre informazioni, vedere Configurare multitargeting.

Android

L'esempio seguente illustra l'implementazione del GetOrientation metodo in 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'esempio seguente illustra l'implementazione del GetOrientation metodo in 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;
    }
}

Invocare l'API multipiattaforma

Dopo aver fornito le implementazioni della piattaforma, l'API può essere richiamata dal codice multipiattaforma creando un'istanza dell'oggetto e richiamandone l'operazione:

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

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

In fase di compilazione il sistema di compilazione userà multitargeting per combinare la classe parziale multipiattaforma con la classe parziale per la piattaforma di destinazione e compilarla nel pacchetto dell'app.

Configurare il multi-targeting

Le app .NET MAUI possono anche essere multitarget in base ai propri criteri di denominazione di file e cartelle. In questo modo è possibile strutturare il progetto di app .NET MAUI in modo che non sia necessario inserire il codice della piattaforma in cartelle figlio della cartella Piattaforme .

Ad esempio, un modello standard multitarget consiste nell'includere la piattaforma come suffisso nel nome file del codice della piattaforma. Il sistema di compilazione può essere configurato per combinare classi parziali multipiattaforma con classi parziali della piattaforma basate su questo modello:

Classi DeviceOrientationService che usano il multitargeting basato su nome file.

Un altro modello standard di multitargeting consiste nell'includere la piattaforma come nome di cartella. Il sistema di compilazione può essere configurato per combinare classi parziali multipiattaforma con classi parziali della piattaforma basate su questo modello:

Classi DeviceOrientationService che usano multitargeting basato su cartelle.

Per altre informazioni, vedere Configurare multitargeting.