访问 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

如果应用程序需要检测设备上是否有 Internet 接入,它可以使用 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 应用项目包含一个 Platforms 文件夹,其中每个子文件夹表示一个 .NET MAUI 可以面向的平台。 每个目标平台文件夹包含在该平台上启动应用的特定于平台的代码,以及你添加的任何其他平台代码。 在生成时,生成系统仅包含为该特定平台生成时每个文件夹中的代码。 例如,当你为 Android 构建应用时,“Platforms”>“Android”文件夹中的文件内置于应用包中,但其他 Platforms 文件夹中的文件则不会。 此方法使用了一种称为“多定向”的功能,可使单个项目面向多个平台。 可以将多定向与分部类和分部方法结合使用,通过跨平台代码调用平台功能。

在下一个练习中,我们将结合使用 .NET API 和 .NET MAUI API 来保存和加载待办事项列表。