存取 Blazor Hybrid 中的平台功能

已完成

我們正在使用 .NET 建置混合式應用程式,這表示我們可以存取所有 .NET 類別庫。 除了這些 API 之外,使用 .NET MAUI 建置 Blazor Hybrid 應用程式不僅可讓您部署至多個平台,還可讓您存取每個平台的原生 API。 這表示,如果需要整合 iOS、Android、macOS 或 Windows 的平台功能,您可以在 C# 中完成這一切。 您可以直接從 Blazor 元件存取這些 API,或建立共用的 .NET MAUI 類別庫。

平台整合

.NET MAUI 支援的每個平台都提供您可以從 C# 存取的獨特作業系統和平台 API。 .NET MAUI 提供跨平台 API 來存取此平台的大部分功能,包括存取感應器、存取應用程式執行所在裝置的相關資訊、檢查網路連線能力、安全地儲存資料,以及起始瀏覽器型驗證流程。

.NET MAUI 會將這些跨平台 API 分成不同的功能區域:

  • 應用程式模型:應用程式功能,包括應用程式動作、應用程式資訊、開啟瀏覽器、開啟 URI、開啟地圖、處理權限,以及版本追蹤
  • 通訊:存取連絡人、電子郵件、網路、電話撥號程式、簡訊和 Web 驗證
  • 裝置功能:電池、顯示資訊、裝置資訊、感應器、手電筒、地理編碼、地理位置、觸覺回饋和震動的資訊和存取
  • 媒體:包括媒體選擇器、螢幕擷取畫面、文字轉換語音和單位轉換器
  • 共用:包括存取剪貼簿,以及共用其他應用程式的檔案或文字
  • 存放裝置:用於挑選檔案、檔案系統協助程式、喜好設定和安全儲存體的 API

如果應用程式需要偵測是否可在裝置上存取網際網路,可以使用 Microsoft.Maui.Networking 中的 Connectivity API:

var accessType = Connectivity.Current.NetworkAccess;
if (accessType is NetworkAccess.Internet)
{
    // Connection to internet is available
}

存取平台 API

.NET MAUI 平台特有可讓您取用只能在特定平台使用的特定功能。 如需詳細資訊,請參考 Android 平台特有iOS 平台特有Windows 平台特有

在 .NET MAUI 不提供任何 API 以存取特定平台 API 的 的情況下,您可以撰寫自己的程式碼來存取所需的平台 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
        }
    }
}

.NET MAUI 應用程式專案包含 [平台] 資料夾,其中每個子資料夾代表 .NET MAUI 可以將其設為目標的平台。 每個目標平台資料夾都包含平台特定程式碼,這些程式碼會在該平台上啟動應用程式,以及包含您新增的任何其他平台程式碼。 建置時,建置系統只會在針對該特定平台建置時,包含來自每個資料夾的程式碼。 例如,當您針對 Android 建置時,Platform>Android 資料夾中的檔案會內建至應用程式套件中,但其他 Platforms 資料夾中的檔案則不會內建至其中。 此方法會使用稱為多重目標的功能,以來自單一專案的多個平台為目標。 您可以結合多重目標部分類別和部分方法,從跨平台程式碼叫用平台功能。

在下一個練習中,我們將使用 .NET API 和 .NET MAUI API 的組合,來儲存並載入待辦事項清單。