前言
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

华为 nova 系列是面向年轻用户群体 的时尚手机产品线,以出色的自拍能力、潮流的外观设计和亲民的价格定位赢得了广大年轻消费者的喜爱。本文将结合 apple_product_name 库的实际源码,详细介绍 nova 系列设备的映射表结构、查询方法和实战应用,帮助开发者在 OpenHarmony 跨平台应用中精准识别这些时尚自拍旗舰设备。
先给出结论式摘要:
- nova 系列共 14 个型号标识符:覆盖 nova 13(5个)、nova 12(5个)、nova 11(4个)三代产品
- FOA 代号跨代复用:FOA-AL00/LX9 对应 nova 13,FOA-LX1/LX2 对应 nova 11 Pro/Ultra,必须完整匹配
- AL80 后缀规律延续:nova 13 Ultra 和 nova 12 Ultra 均使用 AL80 后缀,与 Pura 系列编码策略一致
提示:本文所有映射数据来源于 apple_product_name 库的
HUAWEI_DEVICE_MAP,建议对照源码阅读。
目录
- [nova 13 系列映射表](#nova 13 系列映射表)
- [nova 12 系列映射表](#nova 12 系列映射表)
- [nova 11 系列映射表](#nova 11 系列映射表)
- [插件如何查找 nova 设备名称](#插件如何查找 nova 设备名称)
- [Flutter 端调用 nova 设备查询](#Flutter 端调用 nova 设备查询)
- [通过 lookup 方法查询指定 nova 型号](#通过 lookup 方法查询指定 nova 型号)
- [FOA 代号跨代复用问题](#FOA 代号跨代复用问题)
- 型号命名规则详解
- 产品代号与后缀编码体系
- [判断设备是否属于 nova 系列](#判断设备是否属于 nova 系列)
- 自拍功能差异化检测
- [完整 nova 系列映射汇总](#完整 nova 系列映射汇总)
- [Ultra 版本专属功能处理](#Ultra 版本专属功能处理)
- 年轻用户功能适配
- [nova 系列设备统计分析](#nova 系列设备统计分析)
- 配色主题适配
- 映射表维护与新设备更新
- 常见问题与排查
- 总结
一、nova 13 系列映射表
1.1 nova 13 系列概览
nova 13 系列是华为 2024 年发布的最新一代 nova 产品,首次引入了 Ultra 版本,标志着 nova 产品线向更高端市场延伸。
| 产品名称 | 产品代号 | 型号数量 | 定位 |
|---|---|---|---|
| HUAWEI nova 13 | FOA | 2 | 时尚自拍 |
| HUAWEI nova 13 Pro | FNA | 2 | 影像升级 |
| HUAWEI nova 13 Ultra | FNA | 1 | 旗舰配置 |
1.2 完整型号映射
typescript
// nova 13 系列 --- 2024年发布
"FOA-AL00": "HUAWEI nova 13",
"FOA-LX9": "HUAWEI nova 13",
"FNA-AL00": "HUAWEI nova 13 Pro",
"FNA-LX9": "HUAWEI nova 13 Pro",
"FNA-AL80": "HUAWEI nova 13 Ultra",
nova 13 系列的产品代号分布在 FOA (标准版)和 FNA (Pro/Ultra)两个前缀上。Ultra 版本与 Pro 版共享 FNA 产品代号,通过 AL80 后缀区分------这与 Pura 系列中 Pro+ 版本的编码策略如出一辙。
1.3 Dart 侧验证
dart
final ohos = OhosProductName();
// 查询 nova 13 标准版
final nova13 = await ohos.lookup('FOA-AL00');
print(nova13); // HUAWEI nova 13
// 查询 nova 13 Ultra
final nova13ultra = await ohos.lookup('FNA-AL80');
print(nova13ultra); // HUAWEI nova 13 Ultra
提示:nova 13 Ultra 是 nova 系列首款 Ultra 版本,仅有 1 个型号标识符(FNA-AL80),没有国际版 LX9 变体。这可能意味着 Ultra 版仅在国内市场销售。
二、nova 12 系列映射表
2.1 nova 12 系列概览
nova 12 系列于 2023 年发布,延续了 nova 产品线的时尚定位,在自拍影像和外观设计方面进行了全面升级。
| 产品名称 | 产品代号 | 型号数量 | 定位 |
|---|---|---|---|
| HUAWEI nova 12 | CTR | 2 | 时尚自拍 |
| HUAWEI nova 12 Pro | DTR | 2 | 影像升级 |
| HUAWEI nova 12 Ultra | DTR | 1 | 旗舰配置 |
2.2 完整型号映射
typescript
// nova 12 系列 --- 2023年发布
"CTR-AL00": "HUAWEI nova 12",
"CTR-LX9": "HUAWEI nova 12",
"DTR-AL00": "HUAWEI nova 12 Pro",
"DTR-LX9": "HUAWEI nova 12 Pro",
"DTR-AL80": "HUAWEI nova 12 Ultra",
2.3 nova 12 与 nova 13 的编码对比
| 对比维度 | nova 12 系列 | nova 13 系列 |
|---|---|---|
| 标准版代号 | CTR | FOA |
| Pro 版代号 | DTR | FNA |
| Ultra 版代号 | DTR(AL80) | FNA(AL80) |
| 国际版后缀 | LX9 | LX9 |
| 总型号数 | 5 | 5 |
两代产品的命名结构保持了高度一致性,同样采用标准版、Pro 版和 Ultra 版的三级产品矩阵。这种一致的命名规则使得开发者可以用统一的逻辑来处理不同代际的 nova 产品。
注意:nova 12 系列在市场上仍有大量活跃用户,开发者在进行设备适配时不应忽视这一代产品。
三、nova 11 系列映射表
3.1 nova 11 系列概览
nova 11 系列是 nova 产品线中的重要迭代版本,但其编码方式与后续两代有显著差异。
| 产品名称 | 产品代号 | 型号数量 | 特点 |
|---|---|---|---|
| HUAWEI nova 11 | BNE | 2 | 标准自拍 |
| HUAWEI nova 11 Pro | FOA | 1 | 与 nova 13 共用代号 |
| HUAWEI nova 11 Ultra | FOA | 1 | 与 nova 13 共用代号 |
3.2 完整型号映射
typescript
// nova 11 系列 --- 2023年发布
"BNE-AL00": "HUAWEI nova 11",
"BNE-LX9": "HUAWEI nova 11",
"FOA-LX1": "HUAWEI nova 11 Pro",
"FOA-LX2": "HUAWEI nova 11 Ultra",
3.3 FOA 代号复用警告
nova 11 的 Pro 版和 Ultra 版使用了 FOA 作为产品代号前缀,这与 nova 13 标准版的产品代号完全相同:
| 完整型号 | 对应产品 | 代号 |
|---|---|---|
| FOA-AL00 | HUAWEI nova 13 | FOA |
| FOA-LX9 | HUAWEI nova 13 | FOA |
| FOA-LX1 | HUAWEI nova 11 Pro | FOA |
| FOA-LX2 | HUAWEI nova 11 Ultra | FOA |
注意:这是 nova 系列映射表中最危险的陷阱。开发者在实现设备识别逻辑时必须使用完整的型号标识符进行匹配,而不能仅依赖产品代号前缀来判断设备型号,否则可能会将 nova 11 Pro 误判为 nova 13。
四、插件如何查找 nova 设备名称
4.1 原生层查找逻辑
当 Flutter 端调用 getProductName() 时,插件原生层的处理逻辑如下:
typescript
private getProductName(result: MethodResult): void {
try {
const model = deviceInfo.productModel;
// 先从映射表查找
let productName = HUAWEI_DEVICE_MAP[model];
// 如果映射表没有,使用系统的 marketName
if (!productName) {
productName = deviceInfo.marketName || model;
}
result.success(productName);
} catch (e) {
const errorMsg = e instanceof Error ? e.message : String(e);
result.error("GET_PRODUCT_NAME_ERROR", errorMsg, null);
}
}
4.2 两级查找策略
这段代码展示了一个两级查找策略:
- 通过
deviceInfo.productModel获取当前设备的型号标识符(如"FOA-AL00") - 在
HUAWEI_DEVICE_MAP中查找对应的友好名称 - 如果映射表中没有收录该型号,回退到系统提供的
marketName字段 - 最后兜底返回原始的
productModel
提示:由于 FOA 代号的跨代复用,映射表的精确匹配机制在 nova 系列中尤为重要。
HUAWEI_DEVICE_MAP使用完整型号作为键,确保 FOA-AL00 和 FOA-LX1 能正确映射到不同的产品。
4.3 查找流程图解
Flutter 调用 getProductName()
│
▼
获取 deviceInfo.productModel
│ (例如: "FOA-AL00")
▼
查询 HUAWEI_DEVICE_MAP[model]
│
┌───┴───┐
│ 命中 │ 未命中
▼ ▼
返回映射名称 读取 marketName
"nova 13" │
┌───┴───┐
│ 有值 │ 无值
▼ ▼
返回 返回 productModel
marketName "FOA-AL00"
五、Flutter 端调用 nova 设备查询
5.1 OhosProductName 类核心方法
在 Dart 层,OhosProductName 类通过 MethodChannel 与原生插件通信:
dart
class OhosProductName {
static const MethodChannel _channel = MethodChannel('apple_product_name');
static final _instance = OhosProductName._();
OhosProductName._();
factory OhosProductName() => _instance;
/// 获取设备产品名称
/// 例如: "HUAWEI nova 13 Pro"
Future<String> getProductName() async {
final String? productName = await _channel.invokeMethod('getProductName');
return productName ?? 'Unknown';
}
/// 获取设备型号标识符
/// 例如: "FNA-AL00"
Future<String> getMachineId() async {
final String? machineId = await _channel.invokeMethod('getMachineId');
return machineId ?? 'Unknown';
}
}
5.2 关键设计要点
OhosProductName 采用单例模式,核心特点:
- 调用
getProductName()返回如"HUAWEI nova 13 Pro"的友好名称 - 调用
getMachineId()返回如"FNA-AL00"的原始型号标识符 - 通信失败时兜底返回
'Unknown',保证调用方始终拿到非空结果
注意:MethodChannel 的通信是异步的,所有方法都返回
Future。在 UI 层使用时建议配合FutureBuilder或在initState中预加载。详见 Flutter Platform channels 官方文档。
六、通过 lookup 方法查询指定 nova 型号
6.1 Dart 侧 lookup 方法
库提供了 lookup 方法用于查询任意型号标识符:
dart
/// 根据型号标识符查找产品名称
Future<String> lookup(String machineId) async {
final String? productName = await _channel.invokeMethod('lookup', {
'machineId': machineId,
});
return productName ?? machineId;
}
6.2 原生层 lookup 实现
typescript
private lookup(call: MethodCall, result: MethodResult): void {
try {
const machineId = call.argument("machineId") as string;
if (!machineId) {
result.error("INVALID_ARGUMENT", "machineId is required", null);
return;
}
const productName = HUAWEI_DEVICE_MAP[machineId];
result.success(productName);
} catch (e) {
const errorMsg = e instanceof Error ? e.message : String(e);
result.error("LOOKUP_ERROR", errorMsg, null);
}
}
6.3 nova 系列 lookup 示例
dart
final ohos = OhosProductName();
// 查询 nova 13 全系列
final nova13 = await ohos.lookup('FOA-AL00');
final nova13pro = await ohos.lookup('FNA-AL00');
final nova13ultra = await ohos.lookup('FNA-AL80');
print('FOA-AL00 → $nova13'); // HUAWEI nova 13
print('FNA-AL00 → $nova13pro'); // HUAWEI nova 13 Pro
print('FNA-AL80 → $nova13ultra'); // HUAWEI nova 13 Ultra
lookup 方法直接在 HUAWEI_DEVICE_MAP 中做键值查找,时间复杂度为 O(1)。如果传入未收录的型号,原生层返回 null,Dart 层则兜底返回原始的 machineId 字符串。
提示:
lookup方法非常适合在后端数据分析场景中批量解析设备型号。详见 apple_product_name API 文档。
七、FOA 代号跨代复用问题
7.1 问题描述
FOA 是 nova 系列映射表中最特殊的产品代号------它同时被 nova 13 标准版 和 nova 11 Pro/Ultra 两代不同产品使用:
typescript
// FOA 代号的所有型号
"FOA-AL00": "HUAWEI nova 13", // nova 13 标准版
"FOA-LX9": "HUAWEI nova 13", // nova 13 国际版
"FOA-LX1": "HUAWEI nova 11 Pro", // nova 11 Pro
"FOA-LX2": "HUAWEI nova 11 Ultra", // nova 11 Ultra
7.2 区分规则
区分这些产品的关键在于后缀:
| 后缀 | 产品 | 代际 |
|---|---|---|
| AL00 | nova 13 | 2024 |
| LX9 | nova 13(国际版) | 2024 |
| LX1 | nova 11 Pro | 2023 |
| LX2 | nova 11 Ultra | 2023 |
7.3 代码中的正确处理
dart
Future<String> identifyFOADevice(String machineId) async {
if (!machineId.startsWith('FOA')) {
return await OhosProductName().lookup(machineId);
}
// FOA 代号需要特别注意
final name = await OhosProductName().lookup(machineId);
print('FOA 设备识别: $machineId → $name');
// 映射表已经处理了区分逻辑,直接使用即可
// FOA-AL00 → nova 13
// FOA-LX9 → nova 13(国际版)
// FOA-LX1 → nova 11 Pro
// FOA-LX2 → nova 11 Ultra
return name;
}
实际上 apple_product_name 的映射表已经正确处理了 FOA 代号的区分------每个完整的型号标识符都有唯一的映射。开发者只需要使用 lookup() 传入完整型号即可,不需要自己实现前缀判断逻辑。
注意:这与 Mate 系列中 GGK 前缀共用的问题类似(GGK 同时对应 Mate 60 Pro+ 和 Mate X5)。核心原则是:始终使用完整型号标识符查询,不要依赖前缀做推断。详见 第11篇 华为Mate系列设备映射表 中的 GGK 问题分析。
八、型号命名规则详解
8.1 型号标识符结构
以 FOA-AL00 为例拆解 nova 系列的型号结构:
FOA-AL00
│ │
│ └── 后缀编码(网络制式 + 版本号)
└─────── 产品代号(标识产品线)
8.2 各组成部分含义
| 组成部分 | 示例 | 含义 |
|---|---|---|
| 产品代号 | FOA | nova 13 标准版的标识 |
| 分隔符 | - | 固定连字符 |
| 网络制式 | AL | 国内全网通版本 |
| 版本号 | 00 | 标准版本 |
8.3 nova 系列产品代号一览
| 代号 | 产品 | 发布年份 |
|---|---|---|
| FOA | nova 13 / nova 11 Pro / nova 11 Ultra | 2024 / 2023 |
| FNA | nova 13 Pro / nova 13 Ultra | 2024 |
| CTR | nova 12 | 2023 |
| DTR | nova 12 Pro / nova 12 Ultra | 2023 |
| BNE | nova 11 | 2023 |
注意:FOA 代号的跨代复用使得 nova 系列的代号表比 Mate 和 Pura 系列更复杂。开发者在做代号分析时必须结合后缀一起判断。
九、产品代号与后缀编码体系
9.1 后缀编码规则
| 后缀前缀 | 含义 | 示例 |
|---|---|---|
| AL | 全网通(国内) | FOA-AL00, FNA-AL00 |
| LX | 国际版 | FOA-LX9, CTR-LX9 |
9.2 版本号含义
后缀中的数字部分承载信息:
- 00:标准版本(最常见)
- 80:同代号的高端变体(Ultra 版)
- 9(如 LX9):国际版本的标准版本号
- 1/2(如 LX1/LX2):国际版本的特殊变体
typescript
// 同一产品代号的不同后缀示例
"FNA-AL00": "HUAWEI nova 13 Pro", // 国内标准版
"FNA-LX9": "HUAWEI nova 13 Pro", // 国际版
"FNA-AL80": "HUAWEI nova 13 Ultra", // 国内高端变体
9.3 三代 nova 的编码模式对比
| 编码模式 | nova 11 | nova 12 | nova 13 |
|---|---|---|---|
| 标准版代号 | BNE | CTR | FOA |
| Pro 代号 | FOA(复用) | DTR | FNA |
| Ultra 代号 | FOA(复用) | DTR | FNA |
| Ultra 后缀 | LX2 | AL80 | AL80 |
| 编码规范性 | 较混乱 | 规范 | 规范 |
可以看到 nova 12 和 nova 13 的编码模式已经趋于规范化,而 nova 11 的编码相对混乱(代号复用、后缀不统一)。
提示:从 nova 12 开始,华为统一了 nova 系列的编码规范------标准版和 Pro/Ultra 使用不同代号,Ultra 统一使用 AL80 后缀。开发者在处理 nova 11 时需要额外注意。详见 OpenHarmony 设备信息 API。
十、判断设备是否属于 nova 系列
10.1 系列判断逻辑
dart
Future<void> checkNovaDevice() async {
final ohos = OhosProductName();
final productName = await ohos.getProductName();
if (productName.contains('nova')) {
print('华为nova系列: $productName');
// 注意匹配顺序:Ultra 包含特殊处理
if (productName.contains('Ultra')) {
print('Ultra版 - 旗舰配置');
} else if (productName.contains('Pro')) {
print('Pro版 - 影像升级');
} else {
print('标准版 - 时尚之选');
}
// 提取代数
final match = RegExp(r'nova (\d+)').firstMatch(productName);
if (match != null) {
print('nova第${match.group(1)}代');
}
}
}
10.2 正则提取的优势
代码中使用了正则表达式 r'nova (\d+)' 来提取代数数字,这比硬编码每一代产品名称更加灵活:
| 产品名称 | 正则匹配结果 |
|---|---|
| HUAWEI nova 13 Pro | 13 |
| HUAWEI nova 12 Ultra | 12 |
| HUAWEI nova 11 | 11 |
当华为发布 nova 14、nova 15 等新一代产品时,这段代码无需修改即可自动提取正确的代数信息。
提示:在版本判断的优先级上,同样采用了从高到低的匹配顺序(Ultra → Pro → 标准版),确保包含关系不会导致误判。详见 Dart 正则表达式文档。
十一、自拍功能差异化检测
11.1 nova 系列自拍配置矩阵
nova 系列不同版本的自拍配置差异显著:
| 能力维度 | 标准版 | Pro 版 | Ultra 版 |
|---|---|---|---|
| 美颜模式 | ✓ | ✓ | ✓ |
| 人像模式 | ✓ | ✓ | ✓ |
| 前置双摄 | --- | ✓ | ✓ |
| 夜景自拍 | --- | ✓ | ✓ |
| 4K 自拍视频 | --- | --- | ✓ |
| 前置像素 | 32MP | 50MP | 60MP |
11.2 基于产品名称的能力映射
dart
class NovaSelfieCapabilities {
static Future<Map<String, dynamic>> getSelfieFeatures() async {
final productName = await OhosProductName().getProductName();
final isNova = productName.contains('nova');
final isUltra = productName.contains('Ultra');
final isPro = productName.contains('Pro') && !isUltra;
return {
'hasFrontDualCamera': isNova && (isUltra || isPro),
'frontCameraMP': isUltra ? 60 : (isPro ? 50 : 32),
'hasBeautyMode': isNova,
'hasPortraitMode': isNova,
'hasNightSelfie': isUltra || isPro,
'has4KSelfieVideo': isUltra,
};
}
}
11.3 应用场景
自拍功能检测是 nova 系列设备适配中最核心的应用场景:
- 所有 nova 设备:开启美颜模式和人像模式
- Pro/Ultra 用户:启用前置双摄、夜景自拍
- Ultra 用户:解锁 4K 自拍视频录制
注意:影像能力检测只是功能开关的参考依据,实际的相机功能调用需要通过 OpenHarmony 的 Camera API 实现。
apple_product_name负责设备识别,不涉及相机控制。
十二、完整 nova 系列映射汇总
12.1 全量映射表
typescript
// ========== nova 系列完整映射表 ==========
// nova 13 系列(5个型号)
"FOA-AL00": "HUAWEI nova 13",
"FOA-LX9": "HUAWEI nova 13",
"FNA-AL00": "HUAWEI nova 13 Pro",
"FNA-LX9": "HUAWEI nova 13 Pro",
"FNA-AL80": "HUAWEI nova 13 Ultra",
// nova 12 系列(5个型号)
"CTR-AL00": "HUAWEI nova 12",
"CTR-LX9": "HUAWEI nova 12",
"DTR-AL00": "HUAWEI nova 12 Pro",
"DTR-LX9": "HUAWEI nova 12 Pro",
"DTR-AL80": "HUAWEI nova 12 Ultra",
// nova 11 系列(4个型号)
"BNE-AL00": "HUAWEI nova 11",
"BNE-LX9": "HUAWEI nova 11",
"FOA-LX1": "HUAWEI nova 11 Pro",
"FOA-LX2": "HUAWEI nova 11 Ultra",
12.2 统计汇总
| 系列 | 产品数 | 型号数 | 占映射表比例 |
|---|---|---|---|
| nova 13 | 3 | 5 | 约 4% |
| nova 12 | 3 | 5 | 约 4% |
| nova 11 | 3 | 4 | 约 3% |
| nova 合计 | 9 | 14 | 约 11% |
nova 系列共 9 款产品、14 个型号标识符,占整个 HUAWEI_DEVICE_MAP 映射表约 11% 的条目。随着华为后续可能发布 nova 14 系列,映射表需要相应扩展。
十三、Ultra 版本专属功能处理
13.1 Ultra 版本检测
nova 系列的 Ultra 版本从 nova 12 开始引入,代表 nova 产品线的最高配置:
dart
class NovaUltraHandler {
static Future<bool> isNovaUltra() async {
final productName = await OhosProductName().getProductName();
return productName.contains('nova') && productName.contains('Ultra');
}
static Future<void> enableUltraFeatures() async {
if (await isNovaUltra()) {
// 启用 4K 自拍视频
// 启用 60MP 前置高像素模式
// 启用专业人像光效
print('nova Ultra - 已启用旗舰自拍模式');
}
}
}
13.2 Ultra 专属功能清单
Ultra 版本的硬件优势使其能够支持以下专属功能:
- 4K 分辨率自拍视频录制
- 60MP 超高像素前置拍摄
- 专业人像光效(多种光效模式)
- AI 视频美颜增强
提示:nova Ultra 的定位介于 nova Pro 和 Pura 标准版之间,在自拍能力上甚至超越了部分 Pura 系列产品。开发者在做影像功能适配时可以参考这一定位关系。
十四、年轻用户功能适配
14.1 功能推荐策略
针对 nova 系列年轻用户群体的功能推荐:
dart
class YouthFeatureAdapter {
static Future<List<String>> getRecommendedFeatures() async {
final productName = await OhosProductName().getProductName();
final features = <String>[];
if (productName.contains('nova')) {
// nova 系列核心推荐
features.addAll([
'美颜自拍',
'潮流滤镜',
'短视频创作',
'社交分享',
]);
if (productName.contains('Pro') || productName.contains('Ultra')) {
features.addAll([
'人像模式',
'夜景自拍',
'Vlog拍摄',
]);
}
}
return features;
}
}
14.2 社交应用优化
dart
class SocialAppOptimizer {
static Future<Map<String, dynamic>> getOptimalSettings() async {
final productName = await OhosProductName().getProductName();
if (productName.contains('nova')) {
return {
'enableBeautyFilter': true,
'defaultCameraFacing': 'front', // nova 用户偏好前置
'enableQuickShare': true,
'suggestSelfieMode': true,
'videoQuality': productName.contains('Ultra') ? '4K' : '1080p',
};
}
return {
'enableBeautyFilter': false,
'defaultCameraFacing': 'back',
'enableQuickShare': false,
'suggestSelfieMode': false,
'videoQuality': '1080p',
};
}
}
14.3 nova 用户行为特征
| 行为维度 | nova 用户特征 | 适配建议 |
|---|---|---|
| 相机偏好 | 偏好前置自拍 | 默认打开前置摄像头 |
| 内容类型 | 短视频、照片分享 | 优先展示创作工具 |
| 社交习惯 | 高频分享 | 简化分享流程 |
| 审美偏好 | 潮流、年轻化 | 提供时尚主题和滤镜 |
提示:基于设备型号的用户画像是一种高效且低成本的用户细分方法,不需要收集用户个人信息,仅通过设备选择就能推断出用户的大致偏好。详见 Flutter 插件开发指南。
十五、nova 系列设备统计分析
15.1 分代统计
在产品运营场景中,可以对 nova 系列设备进行分代统计:
dart
Future<Map<String, int>> getNovaStatistics(List<String> machineIds) async {
final ohos = OhosProductName();
final stats = <String, int>{
'nova 13': 0,
'nova 12': 0,
'nova 11': 0,
'Other nova': 0,
};
for (final id in machineIds) {
final name = await ohos.lookup(id);
if (name.contains('nova 13')) {
stats['nova 13'] = stats['nova 13']! + 1;
} else if (name.contains('nova 12')) {
stats['nova 12'] = stats['nova 12']! + 1;
} else if (name.contains('nova 11')) {
stats['nova 11'] = stats['nova 11']! + 1;
} else if (name.contains('nova')) {
stats['Other nova'] = stats['Other nova']! + 1;
}
}
return stats;
}
15.2 用户价值分层
| 用户层级 | 对应产品 | 特征 |
|---|---|---|
| 高端 | nova Ultra 系列 | 追求极致自拍,消费力较强 |
| 中高端 | nova Pro 系列 | 注重影像品质,愿意为体验付费 |
| 主流 | nova 标准版 | 大众市场,性价比导向 |
| 存量 | nova 11 系列 | 老用户,需要兼容维护 |
注意:批量查询时每次
lookup都会触发一次 MethodChannel 通信。如果数据量大,建议在原生侧实现批量查询接口,减少跨平台通信次数。详见 MethodChannel class API。
十六、配色主题适配
16.1 基于代际的主题色推荐
nova 系列以其丰富多彩的时尚配色方案而著称:
dart
class NovaThemeAdapter {
static Future<Color?> getDeviceAccentColor() async {
final productName = await OhosProductName().getProductName();
if (!productName.contains('nova')) return null;
// nova 系列通常有多种时尚配色
if (productName.contains('nova 13')) {
return const Color(0xFF7B68EE); // 星耀紫
} else if (productName.contains('nova 12')) {
return const Color(0xFF00CED1); // 青屿蓝
} else if (productName.contains('nova 11')) {
return const Color(0xFFFF6347); // 曜金黑
}
return const Color(0xFFFF69B4); // 默认粉色
}
}
16.2 配色方案对照表
| 代际 | 推荐主题色 | 色值 | 灵感来源 |
|---|---|---|---|
| nova 13 | 星耀紫 | #7B68EE | 主打配色 |
| nova 12 | 青屿蓝 | #00CED1 | 主打配色 |
| nova 11 | 曜金黑 | #FF6347 | 主打配色 |
| 默认 | 粉色 | #FF69B4 | nova 品牌色 |
这种细致的视觉适配能够显著提升用户对应用的好感度和品牌认同感。
提示:配色主题适配是一种"锦上添花"的功能,不应影响应用的核心体验。建议将其作为可选的个性化设置,让用户自行选择是否启用。
十七、映射表维护与新设备更新
17.1 更新流程
当华为发布新的 nova 系列产品时,映射表需要及时更新:
- 获取新设备的型号标识符(通过华为官方文档或真机读取
deviceInfo.productModel) - 在
HUAWEI_DEVICE_MAP中添加新条目 - 提交 Pull Request 到 apple_product_name 仓库
- 发布新版本
17.2 如何获取新设备的型号标识符
dart
// 在新设备上运行以下代码获取型号
final machineId = await OhosProductName().getMachineId();
print('新设备型号: $machineId');
// 将输出的型号标识符提交到映射表
17.3 版本管理建议
- 映射表更新应遵循语义化版本:新增设备 → minor 版本号递增
- 每次更新记录 changelog,注明新增了哪些设备
- 确保向后兼容------只增不删,已有映射不修改
提示:欢迎社区开发者通过 GitCode 提交 Pull Request 贡献新设备映射,共同维护一个完整准确的设备数据库。
十八、常见问题与排查
18.1 FAQ
| 问题 | 原因 | 解决方案 |
|---|---|---|
| FOA-LX1 被识别为 nova 13 | 使用了前缀匹配而非完整型号 | 使用 lookup 传入完整型号 |
| lookup 返回原始 machineId | 映射表中没有该型号 | 检查是否为新设备,提交 PR 补充 |
| Ultra 被识别为 Pro | 字符串匹配顺序错误 | 优先匹配 Ultra 再匹配 Pro |
| getProductName 返回 Unknown | 非华为设备或插件未注册 | 检查设备品牌和插件配置 |
18.2 调试技巧
dart
Future<void> debugNovaDevice() async {
final ohos = OhosProductName();
// 1. 先获取原始型号
final machineId = await ohos.getMachineId();
print('原始型号: $machineId');
// 2. 查映射表
final productName = await ohos.lookup(machineId);
print('映射结果: $productName');
// 3. 对比 getProductName
final directName = await ohos.getProductName();
print('直接获取: $directName');
// 4. 检查是否命中
final orNull = await ohos.lookupOrNull(machineId);
print('是否命中映射表: ${orNull != null}');
}
18.3 映射表未命中的降级策略
当遇到映射表中没有的新型号时,apple_product_name 的降级逻辑是:
lookup(machineId)→ 返回原始 machineId(如"FOA-AL00")lookupOrNull(machineId)→ 返回nullgetProductName()→ 尝试读取系统marketName,如果也为空则返回productModel
注意:降级策略保证了即使映射表不完整,应用也不会崩溃。但降级后的显示效果不够友好,所以及时更新映射表仍然很重要。详见 PlatformException API 文档。
总结
华为 nova 系列在 apple_product_name 映射表中共有 14 个型号标识符,覆盖 nova 13、nova 12、nova 11 三代产品线。核心要点:FOA 代号被 nova 13 标准版和 nova 11 Pro/Ultra 跨代复用,必须使用完整型号匹配;AL80 后缀从 nova 12 开始统一用于标识 Ultra 变体;nova 系列的年轻用户画像可用于自拍功能适配和社交应用优化。开发者应使用 getProductName() 返回的友好名称做系列判断,而非直接比对 machineId。
下一篇文章将介绍华为 MatePad 平板设备映射表,敬请期待。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
- OpenHarmony适配仓库:flutter_apple_product_name
- 开源鸿蒙跨平台社区:openharmonycrossplatform
- Flutter Platform channels:官方文档
- Flutter MethodChannel API:MethodChannel class
- PlatformException:API 文档
- Dart async/await:Dart asynchronous programming
- Flutter 插件开发指南:Developing packages & plugins
- OpenHarmony 设备信息 API:deviceInfo 文档
- 华为开发者联盟:官方网站
- Flutter 测试文档:Testing Flutter apps