Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
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ő:
- 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.
- 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.
- 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:
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.
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:
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:
További információ: Többhelyes célzás konfigurálása.
Minták böngészése