iPhone 已经升级到 iOS 26,浏览器检测工具却显示 iOS 18.6,这是怎么回事?数据显示,iOS 26 的使用比例明显偏低,一度被解读为新系统升级缓慢。
随后,Daring Fireball 等技术媒体指出,问题可能并非用户没有升级,而是统计系统未正确处理 Safari 26 的 User-Agent(UA)变化。
对于依赖 UA 识别设备的开发者来说,这次变化值得关注。它不仅影响 iOS 版本统计,也可能导致浏览器兼容性判断和设备分类出现偏差。

先看两组典型的 Safari UA 字符串。
iOS 18.6 Safari:
Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1iOS 26.0 Safari:
Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1最明显的区别是 Version/ 字段从 18.6 变成了 26.0,而 iPhone OS 字段仍然显示 18_6,这不是系统升级失败,而是苹果主动调整了 UA 信息。
需要注意,固定值也可能随 Safari 更新调整。例如,部分后续版本的 UA 已出现 18_7 标识。因此,不能将 18_6 当作永久不变的判断条件。
很多 UA 解析程序通过以下字段提取系统版本:
const ua = navigator.userAgent;
const match = ua.match(/iPhone OS (\d+\_\d+)/);
console.log(match?.[1]);对于上面的 Safari 26 示例,这段代码得到的仍然是 18_6。如果后台直接把这个结果写入设备统计表,就会把部分 iOS 26 用户归入 iOS 18.6,造成新系统占比偏低。
另一种情况是解析程序同时检查系统版本和 Safari 版本。当两个字段不一致时,程序可能返回 Unknown,或者将其标记为需要进一步核实的数据。
因此,Safari 26 的 UA 不能再简单按照传统系统版本字段进行解析。
对于标准 iPhone Safari UA,可以结合浏览器版本进行辅助判断,下面是一段简化的 JavaScript 示例:
function detectIOSVersion(ua) {
const os = ua.match(/iPhone OS (\d+)[\_.]\(\d+)/);
const safari = ua.match(/Version\\/(\d+)(?:\\.(\d+))?/);
if (!os) return null;
if (/Safari\\//.test(ua) && safari &&
Number(safari[1]) >= 26) {
return {
major: safari[1],
source: "Safari version"
};
}
return {
major: os[1],
minor: os[2],
source: "OS token"
};
}对于前面的 Safari 26 示例,这段代码会返回主版本 26,而不是 18。不过,这只是针对典型 Safari UA 的简化判断方法,并不适合直接覆盖所有浏览器环境。
Safari 版本与 iOS 主版本通常具有对应关系,但不代表每个小版本和补丁版本都完全一致。 因此,Version/26.x 可以辅助推断系统主版本,不能作为精确系统版本的唯一依据。
如果只是判断某项网页功能是否可用,更推荐使用 CSS.supports() 或 JavaScript 功能检测,而不是依赖系统版本号。
ua-parser-js 已针对 iOS 26 的 UA 变化增加兼容处理,2.0.6 版本包含相关支持。
但升级不代表所有情况都能自动正确识别。部分版本对 iPhone OS 18_7 等后续 UA 标识仍可能存在解析问题。
开发者应检查实际安装版本的更新记录,并使用不同 Safari 26 UA 样本进行回归测试,确认 getOS() 的输出符合预期。
此外,Safari 不支持 Chromium 使用的 navigator.userAgentData 接口,因此不能把它作为 Safari 获取真实系统版本的通用方案。
除了 iPhone Safari,iPad 和应用内浏览器也可能出现设备类型或系统版本识别偏差。不同浏览器环境的 UA 特征存在差异,不能完全套用相同的解析规则。
| 浏览器环境 | UA 特征 | 常见识别问题 | 建议处理方式 |
|---|---|---|---|
| iPad Safari | iPadOS 13 之后默认采用桌面级 UA,与 macOS Safari 接近 | iPad 被识别为 Mac,影响设备分类统计 | 结合 navigator.platform 和 navigator.maxTouchPoints 辅助判断 |
| iPhone Safari 26 | 系统版本标识可能固定为 18_6 或 18_7 | iOS 26 被误判为旧系统 | 结合 Version/ 字段辅助判断系统主版本 |
| Instagram、Facebook 等应用内浏览器 | 通常基于 WebView,可能包含应用专属标识 | 浏览器类型识别不准确,访问数据与 Safari 混合 | 单独识别 WebView 环境,分类统计访问数据 |
| 其他 iOS WebView | UA 格式可能因应用配置而变化 | 部分字段缺失,导致解析结果不完整 | 保留原始 UA,并结合实际功能检测 |
需要注意,navigator.maxTouchPoints 和 UA 字段只能作为辅助判断依据,不能保证所有设备都能被准确识别。
遇到 iOS 26 版本显示异常时,可以先查看浏览器实际发送的 UA,而不是直接判断设备系统存在问题。
使用 iPhone Safari 打开 ToDetect 的 UA 检测工具,查看原始 User-Agent、浏览器识别信息和设备相关字段。
重点对比 iPhone OS 与 Version/ 两部分。如果前者显示 18_6,后者显示 26.0,就可以结合 WebKit 的 UA 变更说明进一步判断。
同时,语言、时区、屏幕参数和触摸能力等信息也能帮助开发者理解浏览器环境,但这些字段不能单独证明真实系统版本。
对于维护设备统计看板的网站,建议保留原始 UA 样本,并在更新解析逻辑后重新核对历史数据。
• iOS 26 显示 iOS 18.6,是浏览器故障吗?
通常不是。Safari 26 调整了 UA 中的系统版本标识,旧解析程序可能因此显示错误结果。
• Chrome 和 Firefox 在 iOS 26 上也会这样吗?
不同浏览器的 UA 策略可能不同,不能直接套用 Safari 的规则。应分别测试实际 UA。
• 为什么后台的 iOS 26 占比明显偏低?
可能是 UA 解析规则没有及时更新。建议先核对原始数据与解析库版本,再判断真实的系统使用比例。
Safari 26 的 User-Agent 变化说明,浏览器 UA 已经不适合承担精确系统版本识别的全部工作。
对于开发者,重点是更新解析规则、验证真实 UA 样本,并优先采用功能检测;对于网站运营人员,则应重新检查 iOS 版本分布是否受到旧统计逻辑影响。
通过 ToDetect 查看浏览器 UA 与设备环境信息,可以为排查版本识别异常提供更直观的参考。