Udostępnij za pośrednictwem


Wywoływanie kodu platformy

Przeglądaj przykład. Przeglądanie przykładu

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:

Zrzut ekranu folderów platformy.

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:

  1. 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.
  2. 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ę.
  3. 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 :

DeviceOrientationService, klasa na zrzucie ekranu folderu Usługi.

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 :

Zrzut ekranu przedstawiający klasy DeviceOrientationService na zrzucie ekranu folderu Platformy.

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:

Klasy DeviceOrientationService korzystające z wielowersyjność nazw plików.

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:

Klasy DeviceOrientationService używające wielowersyjnych elementów docelowych opartych na folderach.

Aby uzyskać więcej informacji, zobacz Konfigurowanie wielowersyjność.