Vyvolání kódu platformy
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:
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:
- 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.
- 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.
- 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 :
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 :
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:
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:
Další informace najdete v tématu Konfigurace cílení na více verzí.