Flutter三方库适配OpenHarmony【apple_product_name】华为Pura系列设备映射表

前言

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


华为 Pura 系列(原 P 系列)是华为主打影像能力 的旗舰产品线,在移动摄影领域长期占据行业领先地位。从早期的 P 系列到如今的 Pura 系列,这条产品线始终代表着华为在计算摄影光学设计 方面的最高技术成就。本文将结合 apple_product_name 库的实际源码,详细介绍 Pura/P 系列设备的映射表结构、查询方法和实战应用。

先给出结论式摘要:

  • Pura/P 系列共 12 个型号标识符:覆盖 Pura 70(7个)和 P60(5个)两代产品
  • 品牌更名历史:2024 年华为将 P 系列正式更名为 Pura 系列,映射表需同时兼容
  • AL80 后缀规律:Pro+ 和 Art 版本均使用 AL80 后缀,与 Pro 版共享产品代号

提示:本文所有映射数据来源于 apple_product_name 库的 HUAWEI_DEVICE_MAP,建议对照源码阅读。

目录

  1. [Pura 70 系列映射表](#Pura 70 系列映射表)
  2. [P60 系列映射表](#P60 系列映射表)
  3. [插件如何查找 Pura 设备名称](#插件如何查找 Pura 设备名称)
  4. [Flutter 端调用 Pura 设备查询](#Flutter 端调用 Pura 设备查询)
  5. [通过 lookup 方法查询指定 Pura 型号](#通过 lookup 方法查询指定 Pura 型号)
  6. [判断设备是否属于 Pura/P 系列](#判断设备是否属于 Pura/P 系列)
  7. 品牌更名背景与兼容策略
  8. 型号命名规则详解
  9. 产品代号与后缀编码体系
  10. [AL80 后缀共用问题](#AL80 后缀共用问题)
  11. 影像能力差异化检测
  12. [完整 Pura/P 系列映射汇总](#完整 Pura/P 系列映射汇总)
  13. [Ultra 版本专属功能处理](#Ultra 版本专属功能处理)
  14. [Art 版本识别与个性化](#Art 版本识别与个性化)
  15. [Pura 系列设备统计分析](#Pura 系列设备统计分析)
  16. [getMachineId 在 Pura 设备上的表现](#getMachineId 在 Pura 设备上的表现)
  17. 映射表维护与新设备更新
  18. 常见问题与排查
  19. 总结

一、Pura 70 系列映射表

1.1 Pura 70 系列概览

Pura 70 系列是华为 2024 年发布的首代 Pura 品牌旗舰,包含标准版、Pro、Pro+ 和 Ultra 四个定位。

产品名称 产品代号 型号数量 定位
HUAWEI Pura 70 HBN 2 标准影像旗舰
HUAWEI Pura 70 Pro DUA 2 专业影像旗舰
HUAWEI Pura 70 Pro+ DUA 1 高端影像旗舰
HUAWEI Pura 70 Ultra HBK 2 顶级影像旗舰

1.2 完整型号映射

typescript 复制代码
// Pura 70 系列 --- 2024年发布
"HBN-AL00": "HUAWEI Pura 70",
"HBN-LX9":  "HUAWEI Pura 70",
"DUA-AL00": "HUAWEI Pura 70 Pro",
"DUA-LX9":  "HUAWEI Pura 70 Pro",
"DUA-AL80": "HUAWEI Pura 70 Pro+",
"HBK-AL00": "HUAWEI Pura 70 Ultra",
"HBK-LX9":  "HUAWEI Pura 70 Ultra",

Pura 70 系列的产品代号分布在 HBN (标准版)、DUA (Pro/Pro+)、HBK (Ultra)三个前缀上。注意 Pura 70 Pro+ 使用了与 Pro 版相同的 DUA 产品代号,仅通过 AL80 后缀区分------这意味着开发者不能仅靠前缀判断,必须使用完整型号标识符。

1.3 Dart 侧验证

dart 复制代码
final ohos = OhosProductName();

// 查询 Pura 70 标准版
final pura70 = await ohos.lookup('HBN-AL00');
print(pura70); // HUAWEI Pura 70

// 查询 Pura 70 Ultra
final pura70ultra = await ohos.lookup('HBK-AL00');
print(pura70ultra); // HUAWEI Pura 70 Ultra

提示:Pura 70 Pro+ 是唯一只有 1 个型号标识符(DUA-AL80)的 Pura 产品,没有国际版 LX9 变体。这可能意味着 Pro+ 仅在国内市场销售。

二、P60 系列映射表(Pura 前身)

2.1 P60 系列概览

P60 系列是华为 P 系列命名体系下的最后一代产品,于 2023 年发布,是 Pura 系列的直接前身。

产品名称 产品代号 型号数量 特点
HUAWEI P60 MNA 2 标准影像旗舰
HUAWEI P60 Pro LNA 2 专业影像旗舰
HUAWEI P60 Art LNA 1 艺术设计版

2.2 完整型号映射

typescript 复制代码
// P60 系列 --- 2023年发布(Pura 前身)
"MNA-AL00": "HUAWEI P60",
"MNA-LX9":  "HUAWEI P60",
"LNA-AL00": "HUAWEI P60 Pro",
"LNA-LX9":  "HUAWEI P60 Pro",
"LNA-AL80": "HUAWEI P60 Art",

2.3 P60 与 Pura 70 的编码对比

对比维度 P60 系列 Pura 70 系列
标准版代号 MNA HBN
Pro 版代号 LNA DUA
高端版代号 LNA(Art) DUA(Pro+)/ HBK(Ultra)
高端版后缀 AL80 AL80 / AL00
国际版后缀 LX9 LX9
总型号数 5 7

P60 Art 同样通过 AL80 后缀与 Pro 版区分,这种编码策略与 Pura 70 Pro+ 完全一致。市场上仍有大量 P60 系列设备活跃使用,开发者在维护映射表时需要同时覆盖 P 系列和 Pura 系列。

注意:P60 Art 和 Pura 70 Pro+ 都使用 AL80 后缀来区分同代号的高端变体,这是华为型号编码中的一个固定模式。开发者在解析型号时应特别关注 AL80 后缀。

三、插件如何查找 Pura 设备名称

3.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);
  }
}

3.2 两级查找策略

这段代码展示了一个两级查找策略

  1. 通过 deviceInfo.productModel 获取当前设备的型号标识符(如 "HBK-AL00"
  2. HUAWEI_DEVICE_MAP 中查找对应的友好名称
  3. 如果映射表中没有收录该型号,回退到系统提供的 marketName 字段
  4. 最后兜底返回原始的 productModel

提示:这种设计确保了即使遇到映射表尚未收录的新 Pura 设备,也不会返回空值。降级顺序为:映射表 → marketName → productModel。

3.3 查找流程图解

复制代码
Flutter 调用 getProductName()
        │
        ▼
获取 deviceInfo.productModel
        │ (例如: "HBK-AL00")
        ▼
查询 HUAWEI_DEVICE_MAP[model]
        │
    ┌───┴───┐
    │ 命中   │ 未命中
    ▼       ▼
返回映射名称  读取 marketName
              │
          ┌───┴───┐
          │ 有值   │ 无值
          ▼       ▼
        返回     返回 productModel
      marketName

四、Flutter 端调用 Pura 设备查询

4.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 Pura 70 Ultra"
  Future<String> getProductName() async {
    final String? productName = await _channel.invokeMethod('getProductName');
    return productName ?? 'Unknown';
  }

  /// 获取设备型号标识符
  /// 例如: "HBK-AL00"
  Future<String> getMachineId() async {
    final String? machineId = await _channel.invokeMethod('getMachineId');
    return machineId ?? 'Unknown';
  }
}

4.2 关键设计要点

OhosProductName 采用单例模式 ,内部持有一个名为 apple_product_name 的 MethodChannel。核心特点:

  • 调用 getProductName() 会触发原生层的 getProductName 方法
  • 最终返回如 "HUAWEI Pura 70 Ultra" 这样的友好名称
  • 如果通信失败或返回 null,Dart 层会兜底返回 'Unknown' 字符串

注意:MethodChannel 的通信是异步的,所有方法都返回 Future。在 UI 层使用时建议配合 FutureBuilder 或在 initState 中预加载。详见 Flutter Platform channels 官方文档

五、通过 lookup 方法查询指定 Pura 型号

5.1 Dart 侧 lookup 方法

除了获取当前设备信息,库还提供了 lookup 方法用于查询任意型号标识符:

dart 复制代码
/// 根据型号标识符查找产品名称
Future<String> lookup(String machineId) async {
  final String? productName = await _channel.invokeMethod('lookup', {
    'machineId': machineId,
  });
  return productName ?? machineId;
}

5.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);
  }
}

5.3 Pura 系列 lookup 示例

dart 复制代码
final ohos = OhosProductName();

// 查询 Pura 70 全系列
final pura70 = await ohos.lookup('HBN-AL00');
final pura70Pro = await ohos.lookup('DUA-AL00');
final pura70ProPlus = await ohos.lookup('DUA-AL80');
final pura70Ultra = await ohos.lookup('HBK-AL00');

print('HBN-AL00 → $pura70');         // HUAWEI Pura 70
print('DUA-AL00 → $pura70Pro');       // HUAWEI Pura 70 Pro
print('DUA-AL80 → $pura70ProPlus');   // HUAWEI Pura 70 Pro+
print('HBK-AL00 → $pura70Ultra');     // HUAWEI Pura 70 Ultra

lookup 方法直接在 HUAWEI_DEVICE_MAP 中做键值查找,时间复杂度为 O(1)。如果传入未收录的型号,原生层返回 null,Dart 层则兜底返回原始的 machineId 字符串。

提示:lookup 方法非常适合在后端数据分析场景中批量解析设备型号。详见 apple_product_name API 文档

六、判断设备是否属于 Pura/P 系列

6.1 系列判断逻辑

利用上述 API,可以编写 Pura 系列的设备判断逻辑:

dart 复制代码
Future<void> checkPuraDevice() async {
  final ohos = OhosProductName();
  final productName = await ohos.getProductName();

  // 同时匹配 Pura 和 P60,覆盖品牌更名前后的设备
  if (productName.contains('Pura') || productName.contains(' P6')) {
    print('华为影像旗舰: $productName');

    // 注意匹配顺序:Pro+ 包含 Pro 子串,必须优先匹配
    if (productName.contains('Ultra')) {
      print('Ultra版 - 顶级影像配置');
    } else if (productName.contains('Pro+')) {
      print('Pro+版 - 高端影像配置');
    } else if (productName.contains('Pro')) {
      print('Pro版 - 专业影像配置');
    } else if (productName.contains('Art')) {
      print('Art版 - 艺术设计版');
    }
  }
}

6.2 匹配优先级说明

这里有两个关键细节:

  1. 由于品牌更名的历史原因,判断条件同时包含 "Pura"" P6" 两个关键词
  2. 版本匹配采用从高到低的优先级顺序
匹配顺序 关键词 原因
1 Ultra 最高端,无歧义
2 Pro+ 包含 "Pro" 子串,必须优先
3 Pro 排除 Pro+ 后匹配
4 Art P60 专属版本

注意:如果不按此顺序匹配,"HUAWEI Pura 70 Pro+" 会被 contains('Pro') 错误捕获为 Pro 版本。这是字符串匹配中常见的子串陷阱。

七、品牌更名背景与兼容策略

7.1 更名历史

2024 年,华为将沿用十余年的 P 系列正式更名为 Pura 系列。"Pura" 源自多种欧洲语言,在西班牙语、意大利语中均有"纯净"之意,传达了华为对影像品质纯粹追求的品牌理念。

从产品线演变来看,P 系列自 2012 年诞生以来经历了多代迭代:

  1. P6 → P7 → P8 → P9 → P10(早期阶段)
  2. P20 → P30 → P40 → P50(成熟阶段)
  3. P60(最后一代 P 系列)
  4. Pura 70(首代 Pura 系列)

7.2 兼容策略

对开发者而言,这意味着设备识别逻辑中需要同时兼容 "Pura""P" 两种命名格式:

dart 复制代码
bool isPuraOrPSeries(String productName) {
  return productName.contains('Pura') || 
         productName.contains('HUAWEI P6');
}

在映射表 HUAWEI_DEVICE_MAP 中,两代产品的数据并列存放,查询时无需关心命名差异,直接通过型号标识符即可获取正确的产品名称。

提示:未来华为可能发布 Pura 80 系列,届时映射表只需新增 Pura 条目,P 系列的兼容逻辑无需修改。更多信息参见 华为开发者联盟

八、型号命名规则详解

8.1 型号标识符结构

以 HBN-AL00 为例拆解 Pura 系列的型号结构:

复制代码
HBN-AL00
 │    │
 │    └── 后缀编码(网络制式 + 版本号)
 └─────── 产品代号(唯一标识一款产品)

8.2 各组成部分含义

组成部分 示例 含义
产品代号 HBN Pura 70 标准版的唯一标识
分隔符 - 固定连字符
网络制式 AL 国内全网通版本
版本号 00 标准版本

8.3 Pura/P 系列产品代号一览

代号 产品 发布年份
HBN Pura 70 2024
DUA Pura 70 Pro / Pro+ 2024
HBK Pura 70 Ultra 2024
MNA P60 2023
LNA P60 Pro / Art 2023

注意:与 Mate 70 系列的 CF 前缀递增规律不同,Pura 系列的产品代号没有明显的字母递增规律。准确的设备识别应始终依赖映射表查询,而非推测代号含义。

九、产品代号与后缀编码体系

9.1 后缀编码规则

后缀前缀 含义 示例
AL 全网通(国内) HBN-AL00, DUA-AL00
LX 国际版 HBN-LX9, DUA-LX9

9.2 版本号含义

后缀中的数字部分也承载信息:

  • 00:标准版本(最常见)
  • 80:同代号的高端变体(Pro+ 或 Art)
  • 9(如 LX9):国际版本的版本号
typescript 复制代码
// 同一产品代号的不同后缀示例
"DUA-AL00": "HUAWEI Pura 70 Pro",   // 国内标准版
"DUA-LX9":  "HUAWEI Pura 70 Pro",   // 国际版
"DUA-AL80": "HUAWEI Pura 70 Pro+",  // 国内高端变体

9.3 为什么 Pura 系列后缀比 Mate 系列少

对比 Mate 60 Pro 的 4 个变体(AL00/AL10/AL80/LX9),Pura 70 Pro 只有 2 个变体(AL00/LX9)。可能的原因:

  1. 运营商定制减少:Pura 系列更多通过公开渠道销售
  2. 市场策略调整:减少 SKU 数量简化供应链管理
  3. 产品定位差异:影像旗舰的用户群体更集中

提示:变体数量少意味着映射表维护成本更低,但也意味着开发者在做设备统计时需要注意样本覆盖率。详见 OpenHarmony 设备信息 API

十、AL80 后缀共用问题

10.1 问题描述

AL80 是 Pura/P 系列中一个特殊的后缀------它被用于标识同代号下的高端变体

typescript 复制代码
// AL80 后缀的所有型号
"DUA-AL80": "HUAWEI Pura 70 Pro+",  // DUA 代号的高端变体
"LNA-AL80": "HUAWEI P60 Art",       // LNA 代号的高端变体

10.2 AL80 模式总结

产品代号 AL00 对应产品 AL80 对应产品
DUA Pura 70 Pro Pura 70 Pro+
LNA P60 Pro P60 Art

10.3 代码中的正确处理

dart 复制代码
Future<String> identifyAL80Device(String machineId) async {
  final name = await OhosProductName().lookup(machineId);

  // 映射表已经处理了 AL80 的区分逻辑
  // DUA-AL00 → Pura 70 Pro
  // DUA-AL80 → Pura 70 Pro+
  // LNA-AL00 → P60 Pro
  // LNA-AL80 → P60 Art
  print('AL80 设备识别: $machineId → $name');

  return name;
}

实际上 apple_product_name 的映射表已经正确处理了 AL80 后缀的区分------每个完整的型号标识符都有唯一的映射。开发者只需要使用 lookup() 传入完整型号即可,不需要自己实现后缀判断逻辑

注意:这与 Mate 系列中 GGK 前缀共用的问题类似(GGK 同时对应 Mate 60 Pro+ 和 Mate X5)。核心原则是:始终使用完整型号标识符查询,不要依赖前缀或后缀做推断。

十一、影像能力差异化检测

11.1 Pura 系列影像配置矩阵

Pura 系列不同版本的影像配置差异显著:

能力维度 Pura 70 Pura 70 Pro Pura 70 Pro+ Pura 70 Ultra
XMAGE 影像
潜望式长焦 ---
可变光圈 --- --- ---
1英寸大底 --- --- ---
AI 摄影

11.2 基于产品名称的能力映射

dart 复制代码
class PuraCameraCapabilities {
  static Future<Map<String, bool>> getCameraFeatures() async {
    final productName = await OhosProductName().getProductName();

    final isPura = productName.contains('Pura') || productName.contains(' P6');
    final isUltra = productName.contains('Ultra');
    final isProPlus = productName.contains('Pro+');
    final isPro = productName.contains('Pro') && !isProPlus;

    return {
      'hasXMAGE': isPura,
      'hasPeriscope': isUltra || isProPlus || isPro,
      'hasVariableAperture': isUltra,
      'has1InchSensor': isUltra,
      'hasAIPhotography': isPura,
    };
  }
}

11.3 应用场景

相机类应用可以根据这些信息动态调整拍摄模式选项和图像处理参数:

  • Ultra 用户:开放专业 RAW 拍摄、手动光圈控制
  • Pro/Pro+ 用户:启用长焦模式、超级变焦
  • 标准版用户:提供 AI 增强拍摄、XMAGE 风格滤镜

提示:影像能力检测只是功能开关的参考依据,实际的相机功能调用需要通过 OpenHarmony 的 Camera API 实现。apple_product_name 负责设备识别,不涉及相机控制。

十二、完整 Pura/P 系列映射汇总

12.1 全量映射表

typescript 复制代码
// ========== Pura/P 系列完整映射表 ==========

// Pura 70 系列(7个型号)
"HBN-AL00": "HUAWEI Pura 70",
"HBN-LX9":  "HUAWEI Pura 70",
"DUA-AL00": "HUAWEI Pura 70 Pro",
"DUA-LX9":  "HUAWEI Pura 70 Pro",
"DUA-AL80": "HUAWEI Pura 70 Pro+",
"HBK-AL00": "HUAWEI Pura 70 Ultra",
"HBK-LX9":  "HUAWEI Pura 70 Ultra",

// P60 系列(5个型号)
"MNA-AL00": "HUAWEI P60",
"MNA-LX9":  "HUAWEI P60",
"LNA-AL00": "HUAWEI P60 Pro",
"LNA-LX9":  "HUAWEI P60 Pro",
"LNA-AL80": "HUAWEI P60 Art",

12.2 统计汇总

系列 产品数 型号数 占映射表比例
Pura 70 4 7 约 6%
P60 3 5 约 4%
Pura/P 合计 7 12 约 10%

Pura/P 系列共 7 款产品、12 个型号标识符,占整个 HUAWEI_DEVICE_MAP 映射表约 10% 的条目。随着华为后续可能发布 Pura 80 系列,映射表需要相应扩展。

十三、Ultra 版本专属功能处理

13.1 Ultra 版本检测

Pura 70 Ultra 搭载了 1 英寸大底主摄和可变光圈技术,可以针对性地解锁专业影像功能:

dart 复制代码
class UltraEditionHandler {
  static Future<bool> isUltraEdition() async {
    final productName = await OhosProductName().getProductName();
    return productName.contains('Ultra');
  }

  static Future<void> enableUltraFeatures() async {
    if (await isUltraEdition()) {
      // 启用1英寸大底专属功能
      // 启用可变光圈控制
      // 启用专业RAW拍摄
      print('Pura 70 Ultra - 已启用专业影像模式');
    }
  }
}

13.2 Ultra 专属功能清单

Ultra 版本的硬件优势使其能够支持以下专属功能:

  1. 专业 RAW 格式拍摄
  2. 手动光圈控制(f/1.4 - f/4.0)
  3. 超高分辨率输出(5000 万像素+)
  4. 长曝光夜景模式增强

注意:高分辨率图像处理和 RAW 文件操作对计算资源要求较高,开发者在实现这些功能时需要注意内存管理和异步处理,避免 UI 卡顿。

十四、Art 版本识别与个性化

14.1 Art 版本检测

P60 Art 是一个极具特色的版本,融入了艺术设计语言:

dart 复制代码
class ArtEditionDetector {
  static Future<bool> isArtEdition() async {
    final productName = await OhosProductName().getProductName();
    return productName.contains('Art');
  }

  static Future<String?> getArtDesignInfo() async {
    if (await isArtEdition()) {
      return 'P60 Art - 洛可可白/翡冷翠设计';
    }
    return null;
  }
}

14.2 Art 版本的差异化策略

P60 Art 采用了不规则形状的后置摄像头模组和独特配色方案。通过识别 Art 版本,应用可以:

  • 推荐与设备设计风格匹配的艺术风格滤镜
  • 提供独家壁纸或主题资源
  • 在关于页面展示设备的设计故事
dart 复制代码
Future<void> applyArtTheme() async {
  if (await ArtEditionDetector.isArtEdition()) {
    // 应用艺术版专属主题
    print('P60 Art 用户 - 启用艺术风格主题');
  }
}

提示:Art 版本目前仅存在于 P60 系列,Pura 70 系列没有 Art 变体。如果未来 Pura 系列推出 Art 版本,判断逻辑无需修改,因为 contains('Art') 可以匹配任意系列。

十五、Pura 系列设备统计分析

15.1 分层统计

在产品运营场景中,可以对 Pura/P 系列设备进行分层统计:

dart 复制代码
Future<Map<String, int>> getPuraStatistics(List<String> machineIds) async {
  final ohos = OhosProductName();
  final stats = <String, int>{
    'Pura 70 Ultra': 0,
    'Pura 70 Pro/Pro+': 0,
    'Pura 70': 0,
    'P60 Series': 0,
  };

  for (final id in machineIds) {
    final name = await ohos.lookup(id);
    if (name.contains('Pura 70 Ultra')) {
      stats['Pura 70 Ultra'] = stats['Pura 70 Ultra']! + 1;
    } else if (name.contains('Pura 70 Pro')) {
      stats['Pura 70 Pro/Pro+'] = stats['Pura 70 Pro/Pro+']! + 1;
    } else if (name.contains('Pura 70')) {
      stats['Pura 70'] = stats['Pura 70']! + 1;
    } else if (name.contains('P60')) {
      stats['P60 Series'] = stats['P60 Series']! + 1;
    }
  }

  return stats;
}

15.2 用户价值分层

用户层级 对应产品 特征
超高端 Pura 70 Ultra 影像发烧友,消费力强
高端 Pura 70 Pro/Pro+ 专业用户,注重品质
主流 Pura 70 大众市场,性价比导向
存量 P60 系列 老用户,需要兼容维护

提示:Ultra 用户虽然数量较少但通常是最具消费力的高端群体,标准版用户则代表更广泛的大众市场。这些数据可以直接指导功能开发优先级和营销资源分配。

十六、getMachineId 在 Pura 设备上的表现

16.1 原生层实现

getMachineId 方法在原生层直接读取系统的 productModel 属性:

typescript 复制代码
private getMachineId(result: MethodResult): void {
  try {
    result.success(deviceInfo.productModel);
  } catch (e) {
    const errorMsg = e instanceof Error ? e.message : String(e);
    result.error("GET_MACHINE_ID_ERROR", errorMsg, null);
  }
}

16.2 Pura 设备返回值示例

设备 getMachineId 返回值 getProductName 返回值
Pura 70(国内版) HBN-AL00 HUAWEI Pura 70
Pura 70(国际版) HBN-LX9 HUAWEI Pura 70
Pura 70 Pro+ DUA-AL80 HUAWEI Pura 70 Pro+
Pura 70 Ultra(国内版) HBK-AL00 HUAWEI Pura 70 Ultra
P60 Art LNA-AL80 HUAWEI P60 Art

这个原始标识符是所有设备识别逻辑的起点------插件内部用它查映射表得到友好名称,开发者也可以直接使用它做更精细的版本区分,比如区分同一产品的不同销售渠道版本。

注意:getMachineId() 返回的是硬件层面的型号标识符,不受系统语言设置影响。而 marketName 可能因语言环境不同而返回不同的字符串。详见 MethodChannel class API

十七、映射表维护与新设备更新

17.1 更新流程

当华为发布新的 Pura 系列产品时,映射表需要及时更新:

  1. 获取新设备的型号标识符(通过华为官方文档或真机读取 deviceInfo.productModel
  2. HUAWEI_DEVICE_MAP 中添加新条目
  3. 提交 Pull Request 到 apple_product_name 仓库
  4. 发布新版本

17.2 如何获取新设备的型号标识符

dart 复制代码
// 在新设备上运行以下代码获取型号
final machineId = await OhosProductName().getMachineId();
print('新设备型号: $machineId');
// 将输出的型号标识符提交到映射表

17.3 版本管理建议

  • 映射表更新应遵循语义化版本:新增设备 → minor 版本号递增
  • 每次更新记录 changelog,注明新增了哪些设备
  • 确保向后兼容------只增不删,已有映射不修改

提示:欢迎社区开发者通过 GitCode 提交 Pull Request 贡献新设备映射,共同维护一个完整准确的设备数据库。

十八、常见问题与排查

18.1 FAQ

问题 原因 解决方案
lookup 返回原始 machineId 映射表中没有该型号 检查是否为新设备,提交 PR 补充
Pro+ 被识别为 Pro 字符串匹配顺序错误 优先匹配 Pro+ 再匹配 Pro
P60 设备未被识别为影像旗舰 判断条件缺少 P 系列 同时匹配 Pura 和 P6 关键词
getProductName 返回 Unknown 非华为设备或插件未注册 检查设备品牌和插件配置

18.2 调试技巧

dart 复制代码
Future<void> debugPuraDevice() 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 的降级逻辑是:

  1. lookup(machineId) → 返回原始 machineId(如 "HBN-AL00"
  2. lookupOrNull(machineId) → 返回 null
  3. getProductName() → 尝试读取系统 marketName,如果也为空则返回 productModel

注意:降级策略保证了即使映射表不完整,应用也不会崩溃。但降级后的显示效果不够友好,所以及时更新映射表仍然很重要。详见 PlatformException API 文档

总结

华为 Pura/P 系列在 apple_product_name 映射表中共有 12 个型号标识符,覆盖 Pura 70 和 P60 两代产品线。核心要点:品牌更名需同时兼容 Pura 和 P 系列关键词、AL80 后缀用于标识同代号的高端变体(Pro+ 和 Art)、版本匹配必须按 Ultra → Pro+ → Pro → Art 的优先级顺序。开发者应使用 getProductName() 返回的友好名称做系列判断,而非直接比对 machineId。

下一篇文章将介绍华为 nova 系列设备映射表,敬请期待。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

相关推荐
空白诗3 小时前
基础入门 Flutter for OpenHarmony:Divider 分割线组件详解
flutter
木斯佳3 小时前
HarmonyOS实战(解决方案篇)—深色模式适配完全指南:从原理到实践
华为·harmonyos
阿林来了5 小时前
Flutter三方库适配OpenHarmony【flutter_speech】— 语音识别停止与取消
flutter·语音识别·harmonyos
哈__5 小时前
基础入门 Flutter for OpenHarmony:flutter_slidable 列表滑动操作详解
flutter
哈__5 小时前
基础入门 Flutter for OpenHarmony:mobile_device_identifier 设备唯一标识详解
flutter
松叶似针6 小时前
Flutter三方库适配OpenHarmony【secure_application】— 应用生命周期回调注册
flutter·harmonyos
无巧不成书02186 小时前
【RN鸿蒙教学|第12课时】进阶实战+全流程复盘:痛点攻坚与实战项目初始化
react native·华为·开源·交互·harmonyos
哈__7 小时前
基础入门 Flutter for OpenHarmony:battery_plus 电池状态监控详解
flutter
键盘鼓手苏苏7 小时前
Flutter for OpenHarmony 实战:flutter_redux 全局状态机与单向数据流
flutter·华为·harmonyos