Invocar código de plataforma

Procurar exemplo. Procurar o exemplo

Em situações em que a interface do usuário do aplicativo de várias plataformas do .NET (.NET MAUI) não fornece APIs para acessar APIs de plataforma específicas, você pode escrever seu próprio código para acessar as APIs de plataforma necessárias. Isso requer conhecimento das APIs iOS e MacCatalyst da Apple, das APIs android do Google e das APIs de SDK do Aplicativo Windows da Microsoft.

O código da plataforma pode ser invocado do código entre plataformas usando a compilação condicional ou usando classes parciais e métodos parciais.

Compilação condicional

O código da plataforma pode ser invocado do código multiplataforma usando a compilação condicional para direcionar diferentes plataformas.

O exemplo a seguir mostra a DeviceOrientation enumeração, que será usada para especificar a orientação do dispositivo:

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

Recuperar a orientação do dispositivo requer a gravação do código da plataforma. Isso pode ser feito escrevendo um método que usa a compilação condicional para direcionar diferentes plataformas:

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

Neste exemplo, as implementações de plataforma do GetOrientation método são fornecidas para Android e iOS. Em outras plataformas, DeviceOrientation.Undefined é retornado. Como alternativa, em vez de DeviceOrientation.Undefined retornar, você pode lançar um PlatformNotSupportedException que especifique as plataformas para as quais as implementações são fornecidas:

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

Em DeviceOrientationService.GetOrientation seguida, o método pode ser invocado do código multiplataforma criando uma instância de objeto e invocando sua operação:

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

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

No momento da compilação, o sistema de build usa a compilação condicional para direcionar o código da plataforma Android e iOS para a plataforma correta.

Para obter mais informações sobre a compilação condicional, consulte a compilação condicional.

Classes e métodos parciais

Um projeto de aplicativo .NET MAUI contém uma pasta Plataformas , com cada pasta filho representando uma plataforma que o MAUI do .NET pode direcionar:

Captura de tela de pastas da plataforma.

As pastas para cada plataforma de destino contêm código específico da plataforma que inicia o aplicativo em cada plataforma, além de qualquer código de plataforma adicional que você adicionar. No tempo de compilação, o sistema de build inclui apenas o código de cada pasta ao criar para essa plataforma específica. Por exemplo, quando você compilar para Android, os arquivos na pasta PlataformasAndroid serão incorporados> ao pacote do aplicativo, mas os arquivos nas outras pastas plataformas não serão. Essa abordagem usa um recurso chamado multi-direcionamento para direcionar várias plataformas de um único projeto.

A multiplataforma pode ser combinada com classes parciais e métodos parciais para invocar a funcionalidade da plataforma do código multiplataforma. O processo para fazer isso é:

  1. Defina a API multiplataforma como uma classe parcial que define assinaturas parciais de método para todas as operações que você deseja invocar em cada plataforma. Para obter mais informações, consulte Definir a API multiplataforma.
  2. Implemente a API multiplataforma por plataforma, definindo a mesma classe parcial e as mesmas assinaturas de método parciais, ao mesmo tempo em que fornece as implementações do método. Para obter mais informações, consulte Implementar a API por plataforma.
  3. Invoque a API multiplataforma criando uma instância da classe parcial e invocando seus métodos conforme necessário. Para obter mais informações, consulte Invocar a API multiplataforma.

Definir a API multiplataforma

Para invocar o código de plataforma do código multiplataforma, a primeira etapa é definir a API multiplataforma como uma classe parcial que define assinaturas parciais de método para todas as operações que você deseja invocar em cada plataforma.

O exemplo a seguir mostra a DeviceOrientation enumeração, que será usada para especificar a orientação do dispositivo:

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

O exemplo a seguir mostra uma API multiplataforma que pode ser usada para recuperar a orientação de um dispositivo:

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

A classe parcial é nomeada DeviceOrientationService, que inclui um método parcial chamado GetOrientation. O arquivo de código dessa classe deve estar fora da pasta Plataformas :

Classe DeviceOrientationService na captura de tela da pasta Serviços.

Implementar a API por plataforma

Depois de definir a API multiplataforma, ela deve ser implementada em todas as plataformas que você está direcionando definindo a mesma classe parcial e as mesmas assinaturas de método parciais, ao mesmo tempo em que fornece as implementações do método.

As implementações de plataforma devem ser colocadas nas pastas filho das Plataformas corretas para garantir que o sistema de build tente criar apenas o código da plataforma ao criar para a plataforma específica. A tabela a seguir lista os locais de pasta padrão para implementações de plataforma:

Plataforma Pasta
Android Plataformas>Android
iOS Plataformas>Ios
MacCatalyst Plataformas>MacCatalyst
Tizen Plataformas>Tizen
Windows Plataformas>Windows

Importante

As implementações de plataforma devem estar no mesmo namespace e na mesma classe em que a API multiplataforma foi definida.

A captura de tela a seguir mostra as DeviceOrientationService classes nas pastas Android e iOS :

Classes DeviceOrientationService na captura de tela da pasta Plataformas.

Como alternativa, o direcionamento múltiplo pode ser executado com base em seu próprio nome de arquivo e critérios de pasta, em vez de usar as pastas Plataformas . Para obter mais informações, consulte Configurar vários destinos.

Android

O exemplo a seguir mostra a implementação do GetOrientation método no 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

O exemplo a seguir mostra a implementação do GetOrientation método no 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;
    }
}

Invocar a API multiplataforma

Depois de fornecer as implementações da plataforma, a API pode ser invocada do código multiplataforma criando uma instância de objeto e invocando sua operação:

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

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

No momento do build, o sistema de build usará vários direcionamentos para combinar a classe parcial entre plataformas com a classe parcial da plataforma de destino e compilá-la no pacote do aplicativo.

Configurar vários direcionamentos

Os aplicativos .NET MAUI também podem ser multilocatários com base em seus próprios critérios de nome de arquivo e pasta. Isso permite estruturar seu projeto de aplicativo .NET MAUI para que você não precise colocar o código da plataforma em pastas filho da pasta Plataformas .

Por exemplo, um padrão padrão de vários destinos é incluir a plataforma como uma extensão no nome do arquivo para o código da plataforma. O sistema de build pode ser configurado para combinar classes parciais multiplataforma com classes parciais de plataforma com base nesse padrão:

Classes DeviceOrientationService usando vários destinos baseados em nome de arquivo.

Outro padrão padrão de vários destinos é incluir a plataforma como um nome de pasta. O sistema de build pode ser configurado para combinar classes parciais multiplataforma com classes parciais de plataforma com base nesse padrão:

Classes DeviceOrientationService usando vários destinos baseados em pasta.

Para obter mais informações, consulte Configurar vários destinos.