Vyvolání kódu platformy

Projděte si ukázku. Procházení ukázky

V situacích, kdy rozhraní .NET Multi-Platform App UI (.NET MAUI) neposkytuje žádná rozhraní API pro přístup k určitým rozhraním API platformy, můžete napsat vlastní kód pro přístup k požadovaným rozhraním API platformy. To vyžaduje znalosti rozhraní API apple pro iOS a MacCatalyst, rozhraní API Google pro Android a rozhraní API microsoftu Windows App SDK.

Kód platformy lze vyvolat z kódu pro různé platformy pomocí podmíněné kompilace nebo pomocí částečných tříd a částečných metod.

Podmíněná kompilace

Kód platformy lze vyvolat z kódu pro různé platformy pomocí podmíněné kompilace pro cílení na různé platformy.

Následující příklad ukazuje DeviceOrientation výčet, který se použije k určení orientace vašeho zařízení:

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

Načtení orientace zařízení vyžaduje psaní kódu platformy. Toho lze dosáhnout zápisem metody, která používá podmíněnou kompilaci k cílení na různé platformy:

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

V tomto příkladu GetOrientation jsou implementace platformy metody poskytovány pro Android a iOS. Na jiných platformách DeviceOrientation.Undefined se vrátí. Alternativně můžete místo vrácení DeviceOrientation.Undefined vyvolat PlatformNotSupportedException , které určuje platformy, pro které jsou k dispozici implementace:

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

Metodu DeviceOrientationService.GetOrientation pak můžete vyvolat z kódu pro různé platformy vytvořením instance objektu a vyvoláním její operace:

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

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

V době sestavení systém sestavení používá podmíněnou kompilaci k cílení kódu platformy Android a iOS na správnou platformu.

Další informace o podmíněné kompilaci najdete v tématu Podmíněná kompilace.

Částečné třídy a metody

Projekt aplikace .NET MAUI obsahuje složku Platformy s každou podřízenou složkou představující platformu, na kterou může .NET MAUI cílit:

Snímek obrazovky s složkami platformy

Složky pro každou cílovou platformu obsahují kód specifický pro platformu, který spouští aplikaci na každé platformě a veškerý další kód platformy, který přidáte. V době sestavení systém sestavení zahrnuje pouze kód z každé složky při sestavování pro danou konkrétní platformu. Když například sestavíte soubory pro Android ve složce Platformy>pro Android , budou součástí balíčku aplikace, ale soubory v jiných složkách Platformy nebudou. Tento přístup používá funkci označovanou jako cílení na více platforem z jednoho projektu.

Cílení na více platforem je možné kombinovat s částečnými třídami a částečnými metodami pro vyvolání funkcí platformy z kódu napříč platformami. Proces, jak to udělat, je:

  1. Definujte rozhraní API pro různé platformy jako částečnou třídu, která definuje podpisy částečných metod pro všechny operace, které chcete vyvolat na každé platformě. Další informace najdete v tématu Definování rozhraní API pro různé platformy.
  2. Implementujte rozhraní API pro různé platformy tak, že definujete stejnou částečnou třídu a stejné podpisy částečných metod a zároveň poskytuje implementace metod. Další informace najdete v tématu Implementace rozhraní API na platformu.
  3. Vyvolání rozhraní API pro různé platformy vytvořením instance částečné třídy a vyvoláním metod podle potřeby. Další informace najdete v tématu Vyvolání rozhraní API pro různé platformy.

Definování rozhraní API pro různé platformy

Pokud chcete vyvolat kód platformy z kódu pro různé platformy, je prvním krokem definování rozhraní API pro různé platformy jako částečná třída , která definuje částečné podpisy metod pro všechny operace, které chcete vyvolat na každé platformě.

Následující příklad ukazuje DeviceOrientation výčet, který se použije k určení orientace vašeho zařízení:

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

Následující příklad ukazuje rozhraní API pro různé platformy, které lze použít k načtení orientace zařízení:

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

Částečná třída má název DeviceOrientationService, která obsahuje částečnou metodu pojmenovanou GetOrientation. Soubor kódu pro tuto třídu musí být mimo složku Platformy :

DeviceOrientationService – třída na snímku obrazovky složky Services

Implementace rozhraní API na platformu

Po definování rozhraní API pro různé platformy se musí implementovat na všech platformách, na které cílíte, definováním stejné částečné třídy a stejných podpisů částečných metod a zároveň poskytnutím implementací metod.

Implementace platformy by se měly umístit do správných podřízených složek Platformy , aby se zajistilo, že se systém sestavení pokusí sestavit kód platformy pouze při sestavování pro konkrétní platformu. Následující tabulka uvádí výchozí umístění složek pro implementace platformy:

Platforma Složka
Android Platformy>Android
iOS Platformy>Ios
MacCatalyst Platformy>MacCatalyst
Tizen Platformy>Tizen
Windows Platformy>Windows

Důležité

Implementace platformy musí být ve stejném oboru názvů a stejné třídě, ve které bylo definováno rozhraní API pro různé platformy.

Následující snímek obrazovky ukazuje DeviceOrientationService třídy ve složkách s Androidem a iOSem :

Třídy DeviceOrientationService na snímku obrazovky se složkou Platformy

Alternativně je možné provádět více cílení na základě vlastních kritérií názvů souborů a složek, nikoli pomocí složek Platformy . Další informace najdete v tématu Konfigurace cílení na více verzí.

Android

Následující příklad ukazuje implementaci metody v Androidu GetOrientation :

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

Následující příklad ukazuje implementaci metody v iOSu GetOrientation :

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

Vyvolání rozhraní API pro různé platformy

Po poskytnutí implementací platformy je možné rozhraní API vyvolat z kódu napříč platformami vytvořením instance objektu a vyvoláním jeho operace:

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

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

V době sestavení bude systém sestavení používat cílení na více platforem ke kombinování částečné třídy napříč platformami s částečnou třídou cílové platformy a jeho sestavení do balíčku aplikace.

Konfigurace cílení na více verzí

Aplikace .NET MAUI můžou být také více cílené na základě vlastních kritérií názvu souboru a složky. To umožňuje strukturovat projekt aplikace .NET MAUI tak, abyste nemuseli kód platformy umístit do podřízených složek platformy .

Standardním vzorem cílení na více cílů je například zahrnutí platformy jako rozšíření do názvu souboru kódu platformy. Systém sestavení lze nakonfigurovat tak, aby zkombinoval částečné třídy napříč platformami s částečnými třídami platformy na základě tohoto vzoru:

Třídy DeviceOrientationService využívající více cílení na názvy souborů.

Dalším standardním vzorem cílení na více platforem je zahrnout platformu jako název složky. Systém sestavení lze nakonfigurovat tak, aby zkombinoval částečné třídy napříč platformami s částečnými třídami platformy na základě tohoto vzoru:

Třídy DeviceOrientationService využívající více cílení na složky

Další informace najdete v tématu Konfigurace cílení na více verzí.