Platformkód meghívása

Minták böngészése. Minták böngészése

Olyan helyzetekben, amikor a .NET többplatformos alkalmazás felhasználói felülete (.NET MAUI) nem biztosít API-kat adott platform API-k eléréséhez, saját kódot írhat a szükséges platform API-k eléréséhez. Ehhez ismernie kell az Apple iOS- és MacCatalyst API-jait, a Google Android API-jait és a Microsoft Windows App SDK API-jait.

A platformkód platformfüggetlen kódból feltételes fordítással vagy részleges osztályok és részleges metódusok használatával hívható meg.

Feltételes összeállítás

A platformkód platformfüggetlen kódból feltételes fordítás használatával hívható meg különböző platformokra.

Az alábbi példa az DeviceOrientation eszköz tájolásának megadására szolgáló enumerálást mutatja be:

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

Az eszköz tájolásának lekéréséhez platformkódot kell írni. Ez egy olyan módszer megírásával érhető el, amely feltételes fordítást használ a különböző platformok megcélzásához:

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

Ebben a példában a GetOrientation módszer platformmegvalósításait androidos és iOS-hez biztosítjuk. Más platformokon a DeviceOrientation.Undefined érték kerül visszaadásra. Alternatív megoldásként, a DeviceOrientation.Undefined visszatérése helyett dobhat olyan PlatformNotSupportedException-t, amely meghatározza, hogy mely platformokhoz biztosítanak implementációkat:

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

A DeviceOrientationService.GetOrientation metódus ezután meghívható platformfüggetlen kódból egy objektumpéldány létrehozásával és a művelet meghívásával:

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

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

A buildeléskor a buildelési rendszer feltételes fordítást használ az Android- és iOS-platform kódjának megfelelő platformra való célzásához.

A feltételes fordítással kapcsolatos további információkért lásd a feltételes fordítást.

Részleges osztályok és metódusok

A .NET MAUI-alkalmazásprojektek egy Platform mappát tartalmaznak, amelyben minden gyermekmappa egy olyan platformot jelöl, amelyet a .NET MAUI megcélzhat:

Platform mappák képernyőképe.

Az egyes célplatformok mappái platformspecifikus kódot tartalmaznak, amely elindítja az alkalmazást az egyes platformokon, valamint a hozzáadott további platformkódot. Összeállításkor a buildelési rendszer csak az egyes mappákból származó kódot tartalmazza az adott platform létrehozásakor. Ha például androidos buildeléskor az Android-platformok> mappájában lévő fájlok be lesznek építve az alkalmazáscsomagba, a többi platformmappában lévő fájlok azonban nem lesznek. Ez a megközelítés egy multi-targeting nevű funkciót használ több platform megcélzására egyetlen projektből.

A többplatformos célozás kombinálható részleges osztályokkal és részleges módszerekkel a platformfüggetlen kódból történő platformfüggő funkciók meghívásához. Ennek folyamata a következő:

  1. Definiálja a platformfüggetlen API-t részleges osztályként, amely részleges metódus-aláírásokat határoz meg az egyes platformokon meghívni kívánt műveletekhez. További információ: A platformfüggetlen API definiálása.
  2. Platformonként implementálja a platformfüggetlen API-t ugyanazzal a részleges osztálysal és ugyanazokkal a részleges metódus-aláírásokkal, miközben a metódus implementációit is biztosítja. További információ: Az API platformonkénti implementálása.
  3. A platformfüggetlen API meghívása a részleges osztály egy példányának létrehozásával és a metódusok igény szerinti meghívásával. További információ: A platformfüggetlen API meghívása.

Platformfüggetlen API definiálása

A platformkód platformfüggetlen kódból való meghívásához az első lépés a platformfüggetlen API részleges osztályként való definiálása, amely részleges metódus-aláírásokat határoz meg az egyes platformokon meghívni kívánt műveletekhez.

Az alábbi példa az DeviceOrientation eszköz tájolásának megadására szolgáló enumerálást mutatja be:

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

Az alábbi példa egy platformfüggetlen API-t mutat be, amely egy eszköz tájolásának lekérésére használható:

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

A részleges osztály neve DeviceOrientationServiceegy részleges metódust GetOrientationtartalmaz. Az osztály kódfájljának a Platformok mappán kívül kell lennie:

DeviceOrientationService osztály a Szolgáltatások mappa képernyőképén.

Az API implementálása platformonként

A platformfüggetlen API definiálása után az összes megcélzott platformon implementálva kell lennie ugyanazzal a részleges osztálysal és ugyanazokkal a részleges metódus-aláírásokkal, miközben a metódus implementációit is biztosítja.

A platform implementációit a megfelelő platformok gyermekmappáiba kell helyezni, hogy a buildelési rendszer csak az adott platform létrehozásakor próbálja meg a platformkódot létrehozni. Az alábbi táblázat a platform-implementációk alapértelmezett mappahelyeit sorolja fel:

Platform Mappa
Android Platformok>Android
iOS Platformok>iOS
MacCatalyst Platformok>MacCatalyst
Tizen Platformok>Tizen
Windows Platformok>Windows

Fontos

A platform implementációinak ugyanabban a névtérben és osztályban kell lenniük, amelyben a platformfüggetlen API-t definiálták.

A következő képernyőképen az DeviceOrientationService osztályok láthatók az Android és iOS mappákban.

DeviceOrientationService-osztályok a Platform mappájuk képernyőképén.

Másik lehetőségként több célzás is elvégezhető a saját fájlnév és mappafeltételek alapján a Platformok mappák használata helyett. További információ: Többhelyes célzás konfigurálása.

Android

Az alábbi példa az GetOrientation metódus Androidos implementálását mutatja be:

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

Az alábbi példa mutatja be a metódus GetOrientation iOS-en való implementálását.

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

Platformfüggetlen API meghívása

A platform implementációinak megadása után az API meghívható platformfüggetlen kódból egy objektumpéldány létrehozásával és a művelet meghívásával:

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

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

A buildeléskor a buildelési rendszer több célzást használ a platformfüggetlen osztály és a célplatform részleges osztályának kombinálásához, majd az alkalmazáscsomagba való beépítéséhez.

Többhelyes célzás konfigurálása

A .NET MAUI alkalmazások saját fájlnév- és mappakritériumok alapján több célplatformra irányulhatnak is. Ez lehetővé teszi a .NET MAUI-alkalmazásprojekt strukturálását, hogy ne kelljen a platformkódot a Platformok mappa gyermekmappáiba helyeznie.

Egy szabványos többcélzási minta például az, hogy a platform kiterjesztésként szerepel a platform kód fájlnevében. A buildrendszer úgy konfigurálható, hogy platformfüggetlen részleges osztályokat egyesítsen a platform részleges osztályaival az alábbi minta alapján:

DeviceOrientationService osztályok fájlnév alapú többcélzás használatával.

Egy másik szabványos, több célra irányuló minta a platform mappanévként való belefoglalása. A buildrendszer úgy konfigurálható, hogy platformfüggetlen részleges osztályokat egyesítsen a platform részleges osztályaival az alábbi minta alapján:

DeviceOrientationService-osztályok mappaalapú több-célzás használatával.

További információ: Többhelyes célzás konfigurálása.