HarmonyOS 7 API 版本判断还在比字符串?26.10 会被误判小于 26.2
HarmonyOS 7 API 版本判断还在比字符串?26.10 会被误判小于 26.2
从 API 26.0.0 开始,HarmonyOS 开发套件版本统一采用 X.Y.Z 语义化格式。真正容易出问题的不是多了两个点,而是旧代码仍按字符串排序,或者只会解析 5.0.0(12) 这种带括号的旧值。

先确认 API 26 的能力边界
官方 2026-08-29 的版本号说明明确了 SemVer 三段含义。X、Y、Z 都必须按数字比较;旧 API Level 与新 SemVer 不是一个数值空间,迁移期应在边界层分流。
- 字符串比较会把 26.10.0 判成小于 26.2.0。
- 缺少任意一段的值不能静默补成 0。
- 数据库按 TEXT 排序同样会得到错误顺序。
案例一:能力开关在 26.10.0 上反而被关闭
逐字符比较看到 minor 的第一个字符 1 小于 2,于是把更高版本送入低版本分支。修复应先解析三段,再逐段进行数值比较。
interface SemVer { major: number; minor: number; patch: number }
function parseSemVer(input: string): SemVer {
const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(input.trim())
if (!m) throw new Error('非法版本号: ' + input)
return { major: Number(m[1]), minor: Number(m[2]), patch: Number(m[3]) }
}
function compare(aText: string, bText: string): number {
const a = parseSemVer(aText); const b = parseSemVer(bText)
for (const k of ['major', 'minor', 'patch'] as const) {
if (a[k] !== b[k]) return a[k] > b[k] ? 1 : -1
}
return 0
}
console.assert(compare('26.10.0', '26.2.0') > 0)
数值比较覆盖 minor 超过 9、主版本跨越和完全相等三种边界,不再依赖字符串字典序。
案例二:旧解析器只认括号,26.0.0 被当成未知版本
一些代码只提取旧值末尾括号中的 API Level。遇到新格式时返回 undefined,再被默认成 0,所有 API 26 设备都会走兼容分支。
type Identity = { kind: 'semver'; value: SemVer } | { kind: 'legacy'; apiLevel: number }
function parseIdentity(input: string): Identity {
if (/^\d+\.\d+\.\d+$/.test(input.trim())) return { kind: 'semver', value: parseSemVer(input) }
const legacy = /\((\d+)\)$/.exec(input.trim())
if (legacy) return { kind: 'legacy', apiLevel: Number(legacy[1]) }
throw new Error('无法识别版本号: ' + input)
}
console.assert(parseIdentity('26.0.0').kind === 'semver')
console.assert(parseIdentity('5.0.0(12)').kind === 'legacy')
新旧值被明确标记,业务层不能再把两套格式塞进同一个整数比较。
现象与判断对照
| 现象 | 优先检查 | 处理原则 |
|---|---|---|
| 26.10.0 与 26.2.0 顺序错误 | 是否直接比较字符串 | 解析后三段数值比较 |
| 26.0.0 被识别成 0 | 旧括号正则 | 分流新旧格式 |
| 数据库排序异常 | 版本列是否为 TEXT | 拆分三列或生成固定宽度键 |
| 灰度开关偶发错分 | 解析失败是否静默兜底 | 失败必须记录并阻断 |
为什么选择这个实现
把解析和比较放在配置入口,比在每个页面 split 更可靠。页面只询问“当前版本是否至少为某版本”,不重复解释格式。
可复用边界
解析器、比较器和数据库排序键可以组成独立版本模块,并用表驱动测试覆盖每次 SDK 升级。
验证记录
已执行 26.10.0>26.2.0、26.1.9<26.2.0、27.0.0>26.99.99、新旧格式识别和非法输入拒绝。
本文的策略代码已在宿主 JavaScript 环境执行断言,用来验证状态、排序、去重或边界计算。它不等同于 HarmonyOS 7 API 26 工程编译,也不等同于真机系统能力验证;涉及系统回调、设备能力、窗口形态或跨应用 IPC 的部分,仍应在对应 SDK 与设备上完成端到端验收。
上线前检查清单
- 只接受三段数字的新格式
- 禁止字符串直接比较
- 旧格式与新格式分流
- 数据库排序不使用原始 TEXT
- 解析失败记录原始值
- API Change Assistant 与兼容测试已执行
官方资料
版本号能显示出来不等于能正确比较。API 26 之后,所有能力开关、缓存键和升级判断都应该先通过同一个 SemVer 边界层。
更多推荐



所有评论(0)