MAUI 跨平台播客應用程式(Conf 2021)

MAUI 跨平台播客應用程式(Conf 2021)

行動端和桌面:適用於 iOS、Android、macOS 和 Windows 的原生 .NET MAUI 應用程式

最後更新 2021/12/3 下午12:27
微信公众号【痕迹gg CodeShare】
預計閱讀 4 分鐘
分類
MAUI
標籤
.NET C# MAUI 開源 開源MAUI

介紹

在.NET Conf 2021 大會上,微軟展示了基於.NET6 跨平台應用程式,具有 ASP.NET Core、Blazor、.NET MAUI、微服務等功能。 瀏覽由 ASP.NET Core 和 Blazor 提供支援的 .NET Podcasts 應用的即時運作版本:https://dotnetpodcasts.azurewebsites.net/

專案體系

行動端和桌面:適用於 iOS、Android、macOS 和 Windows 的原生 .NET MAUI 應用程式

  • Web:Blazor WebAssembly 應用程式和 ASP.NET Core Blazor 網站
  • API:ASP.NET Core Web API、injestion worker 和 podcast update worker
  • Blazor 混合應用程式:.NET MAUI 與 Blazor 的混合應用程式範例。

MAUI 專案

單一程式碼庫的跨平台專案解決方案,適用於 Android、iOS、macOS 以及 Windows 的原生.NET 應用程式,解決方案如下:

特徵介紹

  • Global Usings

全域參考,只需要在任何 using 陳述式之前添加 Global 關鍵字,即可使該參考成為全域

global using Microsoft.Maui;
  • 內建主題

透過 UserAppTheme 修改基於不同平台的主題設定,Light/Dark

switch (Settings.Theme)
{
    default:
    case OSAppTheme.Light:
        App.Current.UserAppTheme = OSAppTheme.Light;
        break;
    case OSAppTheme.Dark:
        App.Current.UserAppTheme = OSAppTheme.Dark;
        break;
}
  • 訊息中心

使用過類似 mvvmlight 中的 Messenger 類似,可以透過 Subscribe/Send/Unsubscribe 來完成訂閱、發佈、取消訂閱等功能。

//訂閱
MessagingCenter.Instance.Subscribe<string>("","",async (sender) =>
				{
		                    //...
				});

//取消訂閱
MessagingCenter.Instance.Unsubscribe<string>("", "");

//發佈
MessagingCenter.Instance.Send<string>("", "");
  • 內建容器

MAUI 中提供的統一註冊以及容器服務,透過 MauiAppBuilder 添加自訂服務以及透過 MauiWinUIApplication 取得對應服務。

//註冊服務
public static MauiAppBuilder ConfigureServices(this MauiAppBuilder builder)
{
    builder.Services.TryAddSingleton<PlayerService>();
}

//呼叫平台的容器服務
public static class ServicesProvider
{
    public static TService GetService<TService>()
        => Current.GetService<TService>();

    public static IServiceProvider Current
        =>
#if WINDOWS10_0_17763_0_OR_GREATER
        MauiWinUIApplication.Current.Services;
#elif ANDROID
        MauiApplication.Current.Services;
#elif IOS || MACCATALYST
        MauiUIApplicationDelegate.Current.Services;
#else
        null;
#endif
}

統一資源管理

MAUI 中統一了資源的管理以及存取,例如:字型、圖示、樣式、本機資源檔等。

存取字型

<Setter Property="FontFamily" Value="SegoeUiSemibold" />

存取圖片資源

<image Source="xxx.png" />

在地化資源

xmlns:res="clr-namespace:Microsoft.NetConf2021.Maui.Resources.Strings"

<label Text="{x:Static res:AppResource.Categories}" />

平台化

在 XAML 以及程式碼中,你可以透過平台化處理不同的 UI 以及商業邏輯,可以透過 OnPlatform 以及 OnIdiom 來區分平台及類型。

不同平台下的字型設定

<label FontSize="{OnPlatform UWP=24, macOS=24, Android=14,iOS=14}" />

不同裝置的設定

<GridItemsLayout Span="{OnIdiom Phone=2, Tablet=3, Desktop=3}" />

Essentials

內建的 Essentials 提供存取本機網路 WIFI、藍牙等等。

//驗證是否連線
var current = Connectivity.NetworkAccess;
if (current != NetworkAccess.Internet)
{
    //...
}

//驗證是否存在WIFI連線
var profiles = Connectivity.ConnectionProfiles;
var hasWifi = profiles.Contains(ConnectionProfile.WiFi);

if (hasWifi)
{
    //...
}

混合模式

在 XAML 當中,使用 BlazorWebView

xmlns:b="clr-namespace:Microsoft.AspNetCore.Components.WebView.Maui;assembly=Microsoft.AspNetCore.Components.WebView.Maui"

<b:BlazorWebView
  x:Name="MyWebView"
  Margin="10,0"
  HostPage="wwwroot/index.html"
  BackgroundColor="{AppThemeBinding Light={StaticResource Grey1}, Dark={StaticResource Grey9}}"
>
  <b:BlazorWebView.RootComponents>
    <b:RootComponent
      Selector="app"
      ComponentType="{x:Type pages:ListenTogetherComponent}"
    />
  </b:BlazorWebView.RootComponents>
</b:BlazorWebView>

總結

專案已在 GitHub 發佈,https://github.com/microsoft/dotnet-podcasts,更多特性探索原始碼。

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2023/1/12

Maui Blazor 使用攝影機實現

由於 Maui Blazor 中界面是由 WebView 渲染,所以在使用 Android 的攝影機時無法獲取,因為原生的攝影機需要綁定界面元件

繼續閱讀