Invocar código de plataforma
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:
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 é:
- 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.
- 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.
- 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 :
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 :
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:
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:
Para obter mais informações, consulte Configurar vários destinos.