.NET 11 Preview 7 对 .NET MAUI 的改进不只是一批零散 API:跨平台 Passkey 认证、增量 XAML Hot Reload、Shell 路由模板和更多 AOT 安全绑定,分别触及身份认证、界面调试、导航设计与发布可靠性。与此同时,MAUI 仍在继续从旧式 renderer 迁移到 handler,并改善 Android 与 Apple 平台上的开发流程。
由于这是预览版本,适合用独立分支验证,不宜未经兼容性测试就直接升级生产项目。
Passkey 开始进入跨平台应用的统一工程模型
Passkey 的核心价值,是让应用使用设备支持的公钥凭据完成注册和登录,减少密码输入以及密码被钓鱼、复用或泄露的风险。对 MAUI 团队而言,跨平台支持意味着 Android 和 Apple 平台的认证流程可以逐步收敛到更一致的应用层设计,而不是让业务代码直接散落着各平台调用。
但“跨平台 API”不等于“认证只发生在客户端”。一个完整流程仍然需要后端参与:
- 服务端生成注册或登录 challenge。
- MAUI 应用请求系统凭据界面。
- 系统和认证器创建或使用 Passkey。
- 应用把返回结果提交给服务端。
- 服务端验证 challenge、来源、签名及凭据状态。
因此,迁移时应把 Passkey 看作端到端认证协议,而不是替换一个登录按钮。凭据验证、账户恢复、设备丢失处理以及与现有会话机制的衔接,仍然属于服务端安全边界。
增量 XAML Hot Reload 缩短界面修改回路
新的增量 XAML Hot Reload 实现关注的是修改后的局部更新。对于包含多个页面、资源字典和控件模板的应用,这种方式有望减少每次调整 XAML 后需要处理的工作量,让开发者更快看到布局、颜色和绑定变化。
实际验证时,不要只测试简单标签。更有价值的测试对象包括:
- 合并资源字典中的样式变更;
DataTemplate和ControlTemplate修改;- 页面导航后再执行热重载;
- Android 与 iOS 上的状态保持;
- 同时修改 XAML 和关联代码时的行为。
热重载仍然是开发工具,不是运行时更新机制。构造函数、依赖注入注册、平台清单和原生生命周期代码发生变化时,通常仍应重新构建或重启应用。
Shell 路由模板让导航参数更接近声明式设计
Shell route templates 为参数化导航提供了更清晰的表达方式。订单详情、用户资料和搜索结果这类页面,可以围绕稳定的路由结构组织,而不必为每一个实体实例注册独立路由。
这项能力尤其适合深层链接,但也会扩大输入边界。来自 URI 的标识符、筛选条件和返回地址都应视为不可信数据。页面加载前需要验证参数格式,并在目标不存在或当前用户无权访问时给出明确结果。
由于摘要没有给出 Preview 7 路由模板的最终 API 语法,下面不虚构具体调用。可以先把导航入口封装起来,等目标 SDK 的 API 确认后,只替换这一层:
namespace MauiPreviewLab.Navigation;
public interface IAppNavigator
{
Task OpenOrderAsync(long orderId);
}
public sealed class AppNavigator : IAppNavigator
{
public Task OpenOrderAsync(long orderId)
{
if (orderId <= 0)
throw new ArgumentOutOfRangeException(nameof(orderId));
// Preview 7 路由模板语法确认后,可在此集中切换。
var route = $"orders/details?id={Uri.EscapeDataString(orderId.ToString())}";
return Shell.Current.GoToAsync(route);
}
}
这段代码可直接放入 MAUI 项目改造。它使用现有 Shell 导航作为兼容实现,同时把未来采用路由模板时的改动限制在导航服务内部。
用编译绑定为 AOT 发布减少运行时风险
Preview 7 增加了更多 AOT-safe bindings。其方向很明确:尽量在编译期解析绑定,减少依赖反射和运行时成员发现的路径。这对启用裁剪或 AOT 的移动应用尤其重要,因为只在调试构建中正常工作的反射绑定,可能在发布包中暴露问题。
可以这样实践一个最小的编译绑定页面。先创建视图模型:
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace MauiPreviewLab;
public sealed class ProfileViewModel : INotifyPropertyChanged
{
private string _displayName = "Ada Lovelace";
public string DisplayName
{
get => _displayName;
set
{
if (_displayName == value)
return;
_displayName = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs());
}
}
public event PropertyChangedEventHandler? PropertyChanged;
}
随后在页面中通过 x:DataType 指定绑定类型:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
x:Class="MauiPreviewLab.ProfilePage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MauiPreviewLab"
x:DataType="local:ProfileViewModel">
<VerticalStackLayout Padding="24" Spacing="12">
<Label Text="Profile" FontSize="24" />
<Entry Text="{Binding DisplayName}" />
<Label Text="{Binding DisplayName}" />
</VerticalStackLayout>
</ContentPage>
页面构造函数需要提供对应的 BindingContext:
namespace MauiPreviewLab;
public partial class ProfilePage : ContentPage
{
public ProfilePage()
{
InitializeComponent();
BindingContext = new ProfileViewModel();
}
}
x:DataType 能让绑定错误更早暴露,并为编译绑定和 AOT 兼容性提供基础。升级后仍应分别执行调试构建和真实发布构建,因为 linker、AOT 编译器与平台打包器只会在发布链路中覆盖完整路径。
在隔离环境中验证 Preview 7
下面命令适合作为试验项目的起点。需要先安装与 Preview 7 对应的 .NET 11 SDK;具体 SDK 版本号应以团队实际安装版本替换:
mkdir MauiPreviewLab
cd MauiPreviewLab
dotnet new globaljson --sdk-version 11.0.100-preview.7.000000 --roll-forward latestPatch
dotnet workload install maui
dotnet new maui -n MauiPreviewLab
cd MauiPreviewLab
dotnet workload list
dotnet build
其中 11.0.100-preview.7.000000 是需要替换的占位版本,不应直接假定为正式 SDK 版本号。可先运行 dotnet --list-sdks,再把 global.json 固定到机器或 CI 中实际存在的 Preview 7 SDK。
验证时建议记录四类结果:Passkey 在各平台的成功、取消和失败流程;复杂 XAML 的热重载表现;深层链接与非法路由参数;启用裁剪或 AOT 后的发布包行为。handler 迁移还可能影响自定义控件,因此依赖旧 renderer 的代码也应单独盘点。
升级决策:按风险拆分,而不是一次性迁移
这批更新可以分层采用。增量 XAML Hot Reload 主要影响开发体验,适合率先试用;AOT-safe bindings 可以按页面逐步引入;Shell 路由模板需要导航和深层链接测试;Passkey 则必须连同后端验证、账户恢复和安全审计一起设计。
进入生产升级计划前,至少确认以下事项:
- CI、开发机和构建代理固定到同一 Preview SDK 与 MAUI workload;
- Android 和 Apple 平台分别完成真机测试;
- 自定义 renderer 已识别并评估 handler 迁移成本;
- 所有外部路由参数都经过格式与授权校验;
- AOT 或裁剪发布包通过关键业务流程回归;
- Passkey 保留明确的失败处理和账户恢复路径。
Preview 7 展示了 MAUI 的演进方向:认证能力向现代凭据靠拢,XAML 调试更加增量化,Shell 导航表达力增强,运行时代码则继续向 AOT 友好模式收敛。真正的收益取决于团队是否把这些能力放进完整的构建、测试和安全链路中验证。