Wywoływanie kodu platformy
W sytuacjach, w których interfejs użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) nie udostępnia żadnych interfejsów API na potrzeby uzyskiwania dostępu do określonych interfejsów API platformy, możesz napisać własny kod w celu uzyskania dostępu do wymaganych interfejsów API platformy. Wymaga to znajomości interfejsów API systemów iOS i MacCatalyst firmy Apple, interfejsów API systemu Android firmy Google i interfejsów API Windows App SDK firmy Microsoft.
Kod platformy może być wywoływany z kodu międzyplatformowego przy użyciu kompilacji warunkowej lub przy użyciu klas częściowych i metod częściowych.
Kompilacja warunkowa
Kod platformy można wywołać z kodu międzyplatformowego przy użyciu kompilacji warunkowej w celu kierowania na różne platformy.
W poniższym przykładzie pokazano DeviceOrientation
wyliczenie, które będzie używane do określania orientacji urządzenia:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
Pobieranie orientacji urządzenia wymaga pisania kodu platformy. Można to osiągnąć, pisząc metodę, która używa kompilacji warunkowej do określania celu na różnych platformach:
#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
}
}
}
W tym przykładzie GetOrientation
implementacje platformy metody są udostępniane dla systemów Android i iOS. Zwracana jest wartość na innych platformach DeviceOrientation.Undefined
. Alternatywnie zamiast zwracać DeviceOrientation.Undefined
można zgłosić element PlatformNotSupportedException
określający platformy, dla których podano implementacje:
throw new PlatformNotSupportedException("GetOrientation is only supported on Android and iOS.");
DeviceOrientationService.GetOrientation
Następnie można wywołać metodę na podstawie kodu międzyplatformowego, tworząc wystąpienie obiektu i wywołując jego operację:
using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.ConditionalCompilation;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
W czasie kompilacji system kompilacji używa kompilacji warunkowej, aby kierować kod platformy Android i iOS do właściwej platformy.
Aby uzyskać więcej informacji na temat kompilacji warunkowej, zobacz Kompilacja warunkowa.
Klasy częściowe i metody
Projekt aplikacji MAUI platformy .NET zawiera folder Platformy z każdym folderem podrzędnym reprezentującym platformę docelową programu .NET MAUI:
Foldery dla każdej platformy docelowej zawierają kod specyficzny dla platformy, który uruchamia aplikację na każdej platformie oraz dodatkowy kod platformy, który dodajesz. W czasie kompilacji system kompilacji zawiera tylko kod z każdego folderu podczas kompilowania dla tej konkretnej platformy. Na przykład podczas kompilowania dla systemu Android pliki w folderze Platformy>systemu Android zostaną wbudowane w pakiet aplikacji, ale pliki w innych folderach Platformy nie będą. To podejście korzysta z funkcji o nazwie wielowersyjność w celu kierowania wielu platform z jednego projektu.
Wielowersyjność może być łączona z klasami częściowymi i metodami częściowymi w celu wywoływania funkcji platformy z kodu międzyplatformowego. W tym celu należy wykonać następujące czynności:
- Zdefiniuj międzyplatformowy interfejs API jako klasę częściową, która definiuje częściowe sygnatury metod dla wszystkich operacji, które mają być wywoływane na każdej platformie. Aby uzyskać więcej informacji, zobacz Definiowanie międzyplatformowego interfejsu API.
- Zaimplementuj międzyplatformowy interfejs API dla każdej platformy, definiując tę samą klasę częściową i te same podpisy metody częściowej, a także udostępniając implementacje metod. Aby uzyskać więcej informacji, zobacz Implementowanie interfejsu API na platformę.
- Wywołaj międzyplatformowy interfejs API, tworząc wystąpienie klasy częściowej i wywołując jego metody zgodnie z potrzebami. Aby uzyskać więcej informacji, zobacz Wywoływanie międzyplatformowego interfejsu API.
Definiowanie międzyplatformowego interfejsu API
Aby wywołać kod platformy z kodu międzyplatformowego, pierwszym krokiem jest zdefiniowanie międzyplatformowego interfejsu API jako klasy częściowej definiującej częściowe sygnatury metod dla wszystkich operacji, które mają być wywoływane na każdej platformie.
W poniższym przykładzie pokazano DeviceOrientation
wyliczenie, które będzie używane do określania orientacji urządzenia:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
Poniższy przykład przedstawia międzyplatformowy interfejs API, którego można użyć do pobrania orientacji urządzenia:
namespace InvokePlatformCodeDemos.Services.PartialMethods
{
public partial class DeviceOrientationService
{
public partial DeviceOrientation GetOrientation();
}
}
Klasa częściowa nosi nazwę DeviceOrientationService
, która zawiera metodę częściową o nazwie GetOrientation
. Plik kodu dla tej klasy musi znajdować się poza folderem Platformy :
Implementowanie interfejsu API na platformę
Po zdefiniowaniu międzyplatformowego interfejsu API należy zaimplementować go na wszystkich platformach docelowych przez zdefiniowanie tej samej klasy częściowej i tych samych podpisów metody częściowej, a także zapewnienie implementacji metod.
Implementacje platformy należy umieścić w odpowiednich folderach podrzędnych Platformy , aby upewnić się, że system kompilacji próbuje skompilować kod platformy tylko podczas kompilowania dla określonej platformy. W poniższej tabeli wymieniono domyślne lokalizacje folderów dla implementacji platformy:
Platforma | Folder |
---|---|
Android | Platformy>Android |
iOS | Platformy>Ios |
MacCatalyst | Platformy>MacCatalyst |
Tizen | Platformy>Tizen |
Windows | Platformy>Windows |
Ważne
Implementacje platformy muszą znajdować się w tej samej przestrzeni nazw i tej samej klasie, w których zdefiniowano międzyplatformowy interfejs API.
Poniższy zrzut ekranu przedstawia DeviceOrientationService
klasy w folderach android i iOS :
Alternatywnie wielowersyjność może być wykonywana na podstawie własnych kryteriów nazwy pliku i folderu, zamiast używania folderów Platformy . Aby uzyskać więcej informacji, zobacz Konfigurowanie wielowersyjność.
Android
W poniższym przykładzie pokazano implementację GetOrientation
metody w systemie 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
Poniższy przykład przedstawia implementację GetOrientation
metody w systemie 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;
}
}
Wywoływanie międzyplatformowego interfejsu API
Po podaniu implementacji platformy interfejs API można wywołać z kodu międzyplatformowego, tworząc wystąpienie obiektu i wywołując jego operację:
using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.PartialMethods;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
W czasie kompilacji system kompilacji będzie używać wielowersyjność, aby połączyć międzyplatformową klasę częściową z klasą częściową dla platformy docelowej i skompilować ją w pakiecie aplikacji.
Konfigurowanie wielowersyjność
Aplikacje .NET MAUI mogą być również wielowersyjne na podstawie własnych kryteriów nazwy pliku i folderu. Dzięki temu można strukturę projektu aplikacji .NET MAUI, aby nie trzeba było umieszczać kodu platformy w folderach podrzędnych folderu Platformy .
Na przykład standardowy wzorzec wielowersyjny polega na dołączeniu platformy jako rozszerzenia w nazwie pliku dla kodu platformy. System kompilacji można skonfigurować do łączenia międzyplatformowych klas częściowych z klasami częściowymi platformy na podstawie tego wzorca:
Innym standardowym wzorcem wielowersyjnym jest dołączenie platformy jako nazwy folderu. System kompilacji można skonfigurować do łączenia międzyplatformowych klas częściowych z klasami częściowymi platformy na podstawie tego wzorca:
Aby uzyskać więcej informacji, zobacz Konfigurowanie wielowersyjność.