iOS判断设备12/24小时制时切换系统设置后首次进前台取值错误问题
问题根因
- iOS系统对
NSLocale(Swift中对应Locale)存在全局缓存机制,App运行过程中修改系统时间格式配置时,系统不会立刻刷新App进程内的NSLocale.current缓存,你第一次进入前台读取到的仍是修改前的旧缓存值。 - 系统自带的日期选择器会直接监听系统的
NSLocaleDidChangeNotification通知,且读取配置时跳过了进程缓存,所以会先于你手动读取的NSLocale.current生效。 - 第一次将App退到后台时,系统才会触发App内的locale缓存更新,因此第二次进入前台才能读到正确的格式值。
修复方案
你可以通过以下方式规避缓存问题:
- 先调用
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 }
- 也可以监听系统的
NSLocaleDidChangeNotification通知,收到通知时直接更新你的时间格式标识,不需要等到进入前台再校验。 NSLocale.reset()为iOS 10+就支持的系统API,无版本兼容问题。
内容的提问来源于stack exchange,提问作者tech_human
相关产品推荐
相关产品推荐

