这里每天分享一个 iOS 的新知识,快来关注我吧
前言
Xcode 26 出来之后,用新工具链构建的 app 默认就会启用 Liquid Glass。这事儿对老项目来说不一定都是好消息 —— 适配需要时间,全量切过去心里没底。苹果给了个 UIDesignRequiresCompatibility Info.plist key 让你 opt out,可它是静态的,改一次得重新构建,没法灰度。
最近有人发现一个苹果私有的 UserDefaults 开关,能动态切 Liquid Glass 的开关,今天聊聊这个藏得挺深的小技巧。
默认行为和那个 Info.plist 开关
先把基础铺垫一下。Xcode 26 构建的 app,Liquid Glass 默认是开的。如果你暂时不想适配,可以在 Info.plist 里加:
<key>UIDesignRequiresCompatibility</key>
<true/>
设成 true,app 就退回老外观,不蹭 Liquid Glass。
问题在于,Info.plist 是编译期定的。要么全开,要么全关,没法做"10% 用户先试"这种灰度,也没法在内部构建里快速切来切去对比效果。
私有 UserDefaults 开关
有人在私有 Slack 群里提到,苹果其实留了个私有的 UserDefaults key:
com.apple.SwiftUI.IgnoreSolariumOptOut
名字里的 Solarium 是 Liquid Glass 的内部代号。这个 key 的作用是:设为 true,就算你 Info.plist 里写了 UIDesignRequiresCompatibility,也会被忽略,Liquid Glass 照常启用;设为 false,又退回兼容模式。
代码就两行:
// 启用 Liquid Glass
UserDefaults.standard.set(true, forKey: "com.apple.SwiftUI.IgnoreSolariumOptOut")
// 禁用 Liquid Glass
UserDefaults.standard.set(false, forKey: "com.apple.SwiftUI.IgnoreSolariumOptOut")
这玩意儿有啥用
它比 Info.plist 灵活在哪儿?UserDefaults 的值是运行时可设的,不用重新构建。你可以拿来做两件事:
一是内部测试。给测试版本配个开关,今天想看 Liquid Glass 效果就开,明天想对比老外观就关,不用切分支重打包。
二是渐进式推出。配合远程配置或者 A/B 框架,按用户比例下发这个值,逐步把 Liquid Glass 铺开,出问题随时回滚,比 Info.plist 全量切换稳得多。
几个坑要注意
第一,改完得重启 app 才生效。SwiftUI 在启动时读这个值,运行中改不会立即反映到当前界面,启用和禁用都一样。
第二,这是个私有 key —— 名字里带 com.apple.SwiftUI 前缀就说明它是苹果内部用的,没公开文档,未来版本随时可能改名字或者直接砍掉。上线别依赖它做生产逻辑,灰度测试可以,正式发布该走 UIDesignRequiresCompatibility 还是走它。
第三,App Store 审核这块目前没明确说不能用私有 UserDefaults key,但这种带苹果前缀的私有值,用之前自己心里要有数,风险自担。
最后
你在 Xcode 26 上适配 Liquid Glass 了吗?评论区聊聊你用没用过这种私有开关做灰度~
这里每天分享一个 iOS 的新知识,快来关注我吧