API 26.10 为什么会被旧代码判成小于 26.2:多设备能力开关必须先改成 SemVer
同一版本应用在手机上打开新布局,在平板上却进入旧降级路径;日志显示设备版本是26.10.0,代码却判断它小于26.2.0。官方版本号说明明确:从 API 26.0.0 开始统一采用X.Y.Z的语义化格式。继续按字符串比较或只取前两位,会直接把未来小版本排序错。
验证边界:本文核对了华为开发者官网截至 2026-09-24 可访问的资料。官方事实与文中的纯函数示例分开说明:示例逻辑已在 Node.js 宿主环境运行,当前本机仍是 API 24 SDK 且没有连接 HDC 真机,因此不把示例称为 API 26 编译或真机实测;正式交付必须在 API 26 SDK、目标设备或对应模拟器上补齐验证。
旧判断为什么失效
字符串按字符逐位比较,所以26.10.0会在26.2.0前面;parseFloat又会把26.10变成 26.1。多设备环境里不同设备更新节奏不一致,这种错误会变成“某台设备功能消失”,很难从 UI 现场看出是版本比较。
先建立迁移模型
解析主、次、修订三个整数,缺失部分补零,逐段比较。更重要的是:版本只表示最低软件条件,最终能力开关还要结合设备能力查询和接口失败降级,不能把版本号当成唯一事实。
exportfunctioncompareSemVer(a:string,b:string):number{constparse=(v:string)=>v.split('.').map(x=>Number(x||0)).concat(0,0).slice(0,3);constaa=parse(a),bb=parse(b);for(leti=0;i<3;i++)if(aa[i]!==bb[i])returnaa[i]>bb[i]?1:-1;return0;}exportfunctionversionAllows(current:string,min='26.2.0'):boolean{returncompareSemVer(current,min)>=0;}设备案例一:26.10.0 被字符串比较挡住
单元测试应明确覆盖 26.10.0 > 26.2.0、26.2.1 > 26.2.0 和 26.2 = 26.2.0。修复后在日志中同时打印原始版本、解析数组和最终能力决策,避免只看到 false。
设备案例二:版本满足但设备不支持目标能力
即使版本大于最低要求,也要执行能力查询或捕获接口返回。对不支持的设备进入清晰降级路径;版本门禁只负责避免明显不可能的调用,不负责替平台能力检测作结论。
新旧方案怎么选
| 观察项 | 容易误判 | 可复核做法 |
|---|---|---|
| 版本比较 | 字符串或 parseFloat | 三段整数逐级比较 |
| 缺失段 | 26.2 与 26.2.0 不等 | 缺失段补零 |
| 能力判断 | 版本满足就强制开启 | 版本 + 能力查询 + 失败降级 |
| 排查日志 | 只记录 true/false | 记录原值、解析值和决策原因 |
使用小而明确的 SemVer 函数,能避免每个页面重复发明比较规则。能力层再组合设备查询,才能兼顾未来版本和不同硬件。
迁移验收清单
- 没有字符串直接比较版本号。
- 测试覆盖次版本两位数。
- 缺失修订号时按零处理。
- 版本满足后仍查询真实能力。
- 降级路径在不同设备上有可见反馈。
官方资料
- API 版本号格式调整说明
- 设备支持类型
API 26 的版本格式变化看似小,错误比较却会让能力开关在未来版本反向失效。先把版本模型修正,再谈多设备一致性。