C# MAUI-Blazor混合应用跨平台适配与异常处理咨询
一、Android/iOS平台差异化文件夹创建逻辑
MAUI提供了跨平台封装的FileSystem类,同时也支持直接调用平台特定API处理特殊需求,针对文件夹创建可以按以下方式区分平台逻辑:
Android平台
Android存储分私有目录和公共目录,私有目录无需权限即可使用,适合存储应用专属数据:if (DeviceInfo.Platform == DevicePlatform.Android) { // 应用私有数据目录(路径类似/data/data/[包名]/files) string privateDirPath = Path.Combine(FileSystem.AppDataDirectory, "MyAppFolder"); Directory.CreateDirectory(privateDirPath); // 若需写入公共Downloads目录(Android 10及以下需申请WRITE_EXTERNAL_STORAGE权限) // string publicDownloadDir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath; // string publicFolderPath = Path.Combine(publicDownloadDir, "MyPublicFolder"); // Directory.CreateDirectory(publicFolderPath); }iOS平台
iOS遵循沙箱机制,常用存储目录包括Documents(可被iCloud同步)和Library/Application Support(应用专属非同步数据):if (DeviceInfo.Platform == DevicePlatform.iOS) { // Documents目录(路径类似/var/mobile/Containers/Data/Application/[UUID]/Documents) string documentsDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string docFolderPath = Path.Combine(documentsDir, "MyDocumentsFolder"); Directory.CreateDirectory(docFolderPath); // MAUI封装的AppData目录(对应Library/Application Support) // string appDataDir = FileSystem.AppDataDirectory; // string appFolderPath = Path.Combine(appDataDir, "MyAppDataFolder"); // Directory.CreateDirectory(appFolderPath); }
日常开发优先使用FileSystem封装的跨平台API,仅在需要访问平台特有存储位置时,再通过DeviceInfo.Platform判断后调用原生API。
二、Android模拟器崩溃无异常提示的处理方案
针对Android模拟器无提示崩溃的问题,可通过以下方式排查和处理:
全局异常捕获
在MauiProgram.cs中配置全局异常监听,捕获未处理的原生和任务异常,将日志存储到本地方便排查:builder.ConfigureMauiHandlers(handlers => { // 捕获AppDomain未处理异常 AppDomain.CurrentDomain.UnhandledException += (sender, args) => { var exception = args.ExceptionObject as Exception; Preferences.Set("CrashLog", exception?.ToString() ?? "未知崩溃"); }; // 捕获未观察到的任务异常 TaskScheduler.UnobservedTaskException += (sender, args) => { Preferences.Set("TaskCrashLog", args.Exception.ToString()); args.SetObserved(); }; });若涉及Blazor页面的异常,可在
wwwroot/index.html中添加JS错误监听:<script> window.addEventListener('error', (e) => { console.error("JS异常:", e.message, "文件:", e.filename, "行号:", e.lineno); // 调用.NET方法记录日志 DotNet.invokeMethodAsync('你的应用程序集名称', 'LogJSError', e.message); }); </script>查看Android Logcat日志
在Visual Studio中打开输出窗口,筛选器选择「Android Logcat」,搜索你的应用包名(如com.yourcompany.yourapp),崩溃时会输出详细的调用栈信息,通常能定位到原生层异常、权限缺失或资源访问错误。检查权限配置
崩溃常因权限未配置导致,若涉及外部存储访问,需在Platforms/Android/AndroidManifest.xml中添加对应权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />Android 11+访问公共存储需动态申请
MANAGE_EXTERNAL_STORAGE权限。断点调试
在newDir方法的关键代码行添加断点,逐行执行排查哪一步触发崩溃,重点关注平台特定API调用、路径拼接和权限申请逻辑。
内容的提问来源于stack exchange,提问作者BMET1

