MAUI 解决什么问题

过去做跨平台,Windows 一套 WPF、安卓一套 Kotlin、苹果一套 SwiftUI,三套代码三个团队。.NET MAUI 的思路是:用一套 C# 和 XAML,编译到 Windows、安卓、苹果、macOS 多个目标。业务逻辑共享,UI 尽量共享,平台差异用少量代码补上。

跨平台的本质不是「一套代码」,而是「尽量共享、差异可控」。
MAUI 四个目标
  • WindowsWinAppSDK 宿主。
  • 安卓原生控件映射。
  • 苹果 iOSiOS 原生控件。
  • macOSMac Catalyst 形态。
MAUI 配图:左侧一部发光的手机轮廓,右侧一台发光的电脑屏幕轮廓,两者之间用发光光路和同步箭头连接
手机与桌面并排,光路把同一份代码同步到两端。

单项目多目标

MAUI 一个项目文件里声明多个 TargetFramework,一次构建产出各平台包。共享的页面、视图模型、网络层、数据库访问都放在核心项目,平台专属代码放平台目录。开发时在 Windows 上快速迭代,再切到安卓、苹果真机调试。

<!-- 伪代码:多目标项目片段 -->
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-windows10</TargetFrameworks>

共享 UI 与原生能力

MAUI 的控件不是 WebView 套壳,而是映射到各平台原生控件。列表在安卓用 RecyclerView、在苹果用 UITableView。共享 UI 层能拿到接近原生的性能和手感。设备传感器、相机、定位这些原生能力,通过 .NET 封装好的 API 调用。

平台差异化处理

没有哪个平台能 100% 一致。导航手势、安全区域、返回键行为都不同。MAUI 用条件编译、平台定制页面、以及按需调用平台特定 API 来处理差异。把差异收拢在小范围,别让核心逻辑被平台代码污染。

Blazor Hybrid 这条路

如果你已经有 Web 前端经验,Blazor Hybrid 是另一条路:用 Razor 组件写 UI,跑在原生壳里。它和 MAUI 共享同一套 .NET 运行时,适合本来就是 Web 思维的团队。但它是 WebView 渲染,性能和原生控件方案要按场景权衡。

落地清单
  • 核心共享逻辑、网络、数据层。
  • UI 映射用原生控件,不用 WebView。
  • 差异收拢平台代码隔离。
  • 真机测每个目标都要跑真机。