将Xamarin Forms应用升级至.NET Maui后偏好设置数据丢失求助
Xamarin Forms迁移.NET MAUI后Preferences数据丢失与权限重复请求的解决方法
一、Preferences数据丢失的处理
虽然包名和签名一致,但Xamarin.Essentials.Preferences与MAUI的Microsoft.Maui.Storage.Preferences在Android平台的默认存储位置不同,导致升级后无法读取旧数据,需要手动迁移:
- Android平台上,Xamarin.Essentials的Preferences存储在
/data/data/[你的包名]/shared_prefs/Xamarin.Essentials.Preferences.xml,MAUI的Preferences使用独立的共享偏好文件。 - 实现迁移逻辑,在MAUI应用首次启动时读取旧数据并写入新存储:
#if ANDROID using Android.Preferences; public static void MigrateOldPreferences() { var oldPrefs = PreferenceManager.GetDefaultSharedPreferences(Android.App.Application.Context); var newPrefs = Microsoft.Maui.Storage.Preferences.Default; // 迁移生物识别状态(替换成你实际使用的键名) bool oldBiometricState = oldPrefs.GetBoolean("BiometricEnabled", false); newPrefs.Set("BiometricEnabled", oldBiometricState); // 如需迁移其他配置,添加对应读取和写入逻辑即可 } #endif - 控制迁移只执行一次,避免重复操作:
在App.xaml.cs的启动方法中加入:protected override void OnStart() { if (!Preferences.Default.Get("PreferencesMigrated", false)) { MigrateOldPreferences(); Preferences.Default.Set("PreferencesMigrated", true); } }
二、权限重复请求的解决
MAUI的权限检查逻辑不会自动继承Xamarin应用的已授权状态,即使包名签名一致,也需要手动处理:
- 先检查权限状态,仅当未授权时再发起请求:
using Microsoft.Maui.ApplicationModel; public async Task HandleBiometricPermission() { PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.Biometric>(); if (status != PermissionStatus.Granted) { status = await Permissions.RequestAsync<Permissions.Biometric>(); } } - 确认MAUI项目的
Platforms/Android/AndroidManifest.xml中,生物识别相关权限(如android.permission.USE_BIOMETRIC、android.permission.USE_FINGERPRINT)的声明和原Xamarin应用完全一致,避免因权限缺失导致的重复请求。
内容的提问来源于stack exchange,提问作者helper
相关产品推荐
相关产品推荐

