.NET MAUI 8.0.70中CultureInfo.InstalledUICulture在iOS17.6崩溃?
iOS 17.6下CultureInfo.InstalledUICulture崩溃问题及替代方案
一、iOS 17.6相关变更说明
iOS 17.6对系统文化信息的底层访问逻辑做了调整,导致.NET MAUI 8.0.70版本中调用CultureInfo.InstalledUICulture时出现崩溃。该API在iOS 17.6及后续版本的托管代码环境中已无法正常工作,属于平台兼容性问题。
二、替代方案
1. 获取设备当前区域/文化设置
通过iOS原生API直接获取系统区域信息,再转换为.NET的CultureInfo对象,避免调用问题API。可通过条件编译实现跨平台兼容:
#if IOS using Foundation; #endif public CultureInfo GetDeviceCurrentCulture() { #if IOS // 调用iOS原生Locale API获取区域标识 var localeIdentifier = NSLocale.CurrentLocale.LocaleIdentifier; return new CultureInfo(localeIdentifier); #else // 其他平台继续使用原API return CultureInfo.InstalledUICulture; #endif }
2. 应用内区域切换实现
维护全局文化信息实例,替代系统默认的InstalledUICulture作为应用本地化的数据源:
public partial class App : Application { // 全局当前文化信息 public static CultureInfo CurrentCulture { get; set; } public App() { InitializeComponent(); // 初始化时加载设备当前文化 CurrentCulture = GetDeviceCurrentCulture(); // 设置线程默认文化 SetThreadCulture(CurrentCulture); MainPage = new MainPage(); } // 设置线程文化的辅助方法 private void SetThreadCulture(CultureInfo culture) { CultureInfo.DefaultThreadCurrentCulture = culture; CultureInfo.DefaultThreadCurrentUICulture = culture; } // 提供外部调用的切换方法 public static void SwitchCulture(CultureInfo newCulture) { CurrentCulture = newCulture; var app = Current as App; app?.SetThreadCulture(newCulture); // 刷新界面(示例:重置MainPage触发页面重建) Current.MainPage = new MainPage(); } }
使用时,所有依赖本地化的逻辑直接引用App.CurrentCulture即可,切换时调用App.SwitchCulture()方法即可完成全局文化更新。
内容的提问来源于stack exchange,提问作者OXO
相关产品推荐
相关产品推荐

