プラットフォーム コードを呼び出す

サンプルを参照します。 サンプルを参照する

.NET マルチプラットフォーム アプリ UI (.NET MAUI) が特定のプラットフォーム API にアクセスするための API を提供していない場合は、必要なプラットフォーム API にアクセスするための独自のコードを記述できます。 これには、Apple の iOS API と MacCatalyst APIGoogle の Android APIMicrosoft の Windows アプリ SDK API に関する知識が必要です。

プラットフォーム コードは、条件付きコンパイルを使用するか、部分クラスと部分メソッドを使用して、クロスプラットフォーム コードから呼び出すことができます。

条件付きコンパイル

プラットフォーム コードは、条件付きコンパイルを使用して異なるプラットフォームを対象とすることで、クロスプラットフォーム コードから呼び出すことができます。

次の例は、デバイスの DeviceOrientation 向きを指定するために使用される列挙体を示しています。

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

デバイスの向きを取得するには、プラットフォーム コードを記述する必要があります。 これを実現するには、条件付きコンパイルを使用してさまざまなプラットフォームを対象とするメソッドを記述します。

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

この例では、Android および iOS 用に GetOrientation メソッドのプラットフォーム実装が提供されています。 他のプラットフォームでは、 DeviceOrientation.Undefined 返されます。 または、返 DeviceOrientation.Undefined す代わりに、実装が提供されるプラットフォームを指定する a をスロー PlatformNotSupportedException することもできます。

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

DeviceOrientationService.GetOrientationその後、オブジェクト インスタンスを作成し、その操作を呼び出すことによって、クロスプラットフォーム コードからメソッドを呼び出すことができます。

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

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

ビルド時に、ビルド システムは条件付きコンパイルを使用して、Android および iOS プラットフォーム コードを適切なプラットフォームにターゲットします。

条件付きコンパイルの詳細については、「 条件付きコンパイル」を参照してください。

部分クラスとメソッド

.NET MAUI アプリ プロジェクトには Platforms フォルダーが含まれています。各子フォルダーは、.NET MAUI がターゲットにできるプラットフォームを表します。

プラットフォーム フォルダーのスクリーンショット。

各ターゲット プラットフォームのフォルダーには、各プラットフォームでアプリを起動するプラットフォーム固有のコードと、追加する追加のプラットフォーム コードが含まれています。 ビルド時に、ビルド システムには、その特定のプラットフォーム用にビルドするときに、各フォルダーのコードのみが含まれます。 たとえば、Android 用にビルドする場合、 Platforms>Android フォルダー内のファイルはアプリ パッケージに組み込まれますが、他の Platforms フォルダー内のファイルは組み込まれません。 このアプローチでは、マルチターゲットと呼ばれる機能を使用して、1 つのプロジェクトから複数のプラットフォームをターゲットにします。

マルチターゲットは、部分クラスと部分メソッドと組み合わせて、クロスプラットフォーム コードからプラットフォーム機能を呼び出すことができます。 これを行うプロセスは次のとおりです。

  1. クロスプラットフォーム API を、各プラットフォームで呼び出す操作の部分的なメソッド シグネチャを定義する部分クラスとして定義します。 詳細については、「 クロスプラットフォーム API の定義」を参照してください。
  2. 同じ部分クラスと同じ部分メソッド シグネチャを定義し、メソッドの実装も提供することで、プラットフォームごとにクロスプラットフォーム API を実装します。 詳細については、「 プラットフォームごとに API を実装する」を参照してください。
  3. 部分クラスのインスタンスを作成し、必要に応じてメソッドを呼び出して、クロスプラットフォーム API を呼び出します。 詳細については、「 クロスプラットフォーム API の呼び出し」を参照してください。

クロスプラットフォーム API を定義する

クロスプラットフォーム コードからプラットフォーム コードを呼び出すには、最初にクロスプラットフォーム API を、各プラットフォームで呼び出す操作の部分メソッド シグネチャを定義する部分クラスとして定義します。

次の例は、デバイスの DeviceOrientation 向きを指定するために使用される列挙体を示しています。

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

次の例は、デバイスの向きを取得するために使用できるクロスプラットフォーム API を示しています。

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

部分クラスの名前は、名前が付けられたDeviceOrientationServiceGetOrientation部分メソッドを含みます。 このクラスのコード ファイルは 、Platforms フォルダーの外部にある必要があります。

Services フォルダーの DeviceOrientationService クラスのスクリーンショット。

プラットフォームごとに API を実装する

クロスプラットフォーム API を定義した後は、同じ部分クラスと同じ部分メソッド シグネチャを定義し、メソッドの実装も提供することで、ターゲットとするすべてのプラットフォームで実装する必要があります。

プラットフォームの実装は、ビルド システムが特定のプラットフォーム用にビルドするときにプラットフォーム コードのビルドのみを試行するように、正しい Platforms 子フォルダーに配置する必要があります。 次の表に、プラットフォーム実装の既定のフォルダーの場所を示します。

プラットフォーム Folder
Android プラットフォーム>Android
iOS プラットフォーム>Ios
MacCatalyst プラットフォーム>MacCatalyst
Tizen プラットフォーム>Tizen
Windows プラットフォーム>Windows

重要

プラットフォームの実装は、クロスプラットフォーム API が定義されたのと同じ名前空間と同じクラスに存在する必要があります。

次のスクリーンショットは、DeviceOrientationServiceAndroid フォルダーと iOS フォルダー内のクラスを示しています。

Platforms フォルダー内の DeviceOrientationService クラスのスクリーンショット。

または、 プラットフォーム フォルダーを使用するのではなく、独自のファイル名とフォルダーの条件に基づいてマルチターゲットを実行することもできます。 詳細については、「 マルチターゲットの構成」を参照してください。

Android

次の例は、Android でのメソッドの実装を 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

次の例は、iOS でのメソッドの実装を 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;
    }
}

クロスプラットフォーム API を呼び出す

プラットフォーム実装を提供した後、オブジェクト インスタンスを作成してその操作を呼び出すことによって、クロスプラットフォーム コードから API を呼び出すことができます。

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

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

ビルド時に、ビルド システムはマルチターゲットを使用してクロスプラットフォーム部分クラスとターゲット プラットフォームの部分クラスを組み合わせ、アプリ パッケージにビルドします。

マルチターゲットの構成

.NET MAUI アプリは、独自のファイル名とフォルダーの条件に基づいて複数ターゲットにすることもできます。 これにより、プラットフォーム コードを Platforms フォルダーの子フォルダーに配置する必要がないように、.NET MAUI アプリ プロジェクトを構築できます。

たとえば、標準のマルチターゲット パターンでは、プラットフォーム コードのファイル名に拡張機能としてプラットフォームを含めます。 このパターンに基づいて、クロスプラットフォーム部分クラスとプラットフォーム部分クラスを組み合わせてビルド システムを構成できます。

ファイル名ベースのマルチターゲットを使用する DeviceOrientationService クラス。

もう 1 つの標準的なマルチターゲット パターンは、プラットフォームをフォルダー名として含める方法です。 このパターンに基づいて、クロスプラットフォーム部分クラスとプラットフォーム部分クラスを組み合わせてビルド システムを構成できます。

フォルダー ベースのマルチターゲットを使用する DeviceOrientationService クラス。

詳細については、「 マルチターゲットの構成」を参照してください。