You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS判断设备12/24小时制时切换系统设置后首次进前台取值错误问题

问题根因

  • iOS系统对NSLocale(Swift中对应Locale)存在全局缓存机制,App运行过程中修改系统时间格式配置时,系统不会立刻刷新App进程内的NSLocale.current缓存,你第一次进入前台读取到的仍是修改前的旧缓存值。
  • 系统自带的日期选择器会直接监听系统的NSLocaleDidChangeNotification通知,且读取配置时跳过了进程缓存,所以会先于你手动读取的NSLocale.current生效。
  • 第一次将App退到后台时,系统才会触发App内的locale缓存更新,因此第二次进入前台才能读到正确的格式值。

修复方案

你可以通过以下方式规避缓存问题:

  1. 先调用NSLocale.reset()清空缓存,再读取最新的locale配置,修改后的代码如下:
func applicationWillEnterForeground(_ application: UIApplication) {
    // 清空locale缓存,强制拉取最新系统配置
    NSLocale.reset()
    let formatter: String? = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: NSLocale.current)
    Utils.isDeviceFormat24Hours = ((formatter as NSString?)?.range(of: "a"))?.location == NSNotFound
}
  1. 也可以监听系统的NSLocaleDidChangeNotification通知,收到通知时直接更新你的时间格式标识,不需要等到进入前台再校验。
  2. NSLocale.reset()为iOS 10+就支持的系统API,无版本兼容问题。

内容的提问来源于stack exchange,提问作者tech_human

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:48:04