在这里插入图片描述

1 -> 引言:从手机到大屏,匿名标识的“最后一公里”打通了

在移动互联网时代,开放匿名设备标识符早已不是新鲜词。它作为 IMEI 等永久性设备标识的替代者,既支撑着广告主关心的精准投放与归因分析,又兼顾了用户对隐私保护的诉求。对于搭载 HarmonyOS 的手机、平板和 PC,OAID 服务已经稳定运行了多个版本。然而,大屏设备(智慧屏、TV 盒子) 一直是这块拼图中缺失的一块——直到 HarmonyOS 6.0.0(20)版本出现。

根据华为开发者联盟官方文档的最新更新,开放匿名设备标识服务从该版本开始,正式新增支持 TV 设备。这意味着,无论是运行在手机上的短视频 App,还是运行在智慧屏上的视频应用,都可以用同一套 API、同一套权限模型来获取设备的匿名标识。本文将从技术背景、隐私设计、集成实践三个维度,深入拆解这次更新的细节,并探讨它对开发者、广告生态以及用户隐私的深远影响。

2 -> 重新认识 OAID:它到底是什么?解决了什么问题?

2.1 -> 从设备指纹到匿名标识的演进

在广告技术领域,识别一个“设备”是投放与归因的基础。早期开发者习惯使用 IMEI、MAC 地址等硬件标识,但这些标识一旦泄露,用户将永久失去匿名性。随着各国隐私法规(如 GDPR、CCPA)的出台,以及操作系统对权限的收紧,永久性设备标识的获取路径基本被堵死

OAID(Open Anonymous Device Identifier) 正是在这种背景下诞生的。它是由华为定义的设备级标识符,具备以下核心特征:

  • 非永久性:用户可以通过“重置 OAID”或在恢复出厂设置时使其变化。
  • 设备级一致性:同一台设备上,所有遵守权限规则的应用获取到的 OAID 值完全相同,这为跨应用频控和归因提供了可能。
  • 隐私友好:它的生成与使用受系统权限严格控制,应用必须向用户申请“跨应用关联访问权限”(旧称“应用跟踪访问权限”)才能获取有效值,否则返回全 0 UUID。

2.2 -> OAID 的生成与格式

官方文档指出,OAID 是基于华为自有算法生成的 32 位 UUID,格式形如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。这种格式既保证了全球唯一性,又避免了通过简单自增序列猜测设备数量的风险。

值得注意的是,OAID 的生成时机:并非设备出厂时预置,而是在同一台设备上第一个应用开启“跨应用关联访问权限”时动态生成。这种“按需生成”机制进一步减少了不必要的标识暴露。

3 -> TV 设备支持:为什么这是一次重要更新?

3.1 -> 大屏广告归因的“黑盒”困境

在过去,TV 端(特别是传统电视)的广告效果衡量几乎是一片盲区。广告主只能依赖抽样收视率,无法知道某个用户是否看到广告后通过手机购买了商品。随着智慧屏的普及,TV 设备具备了应用安装、内容点播、电商下单等能力,但缺乏统一的匿名标识导致跨屏追踪(手机 → TV → 手机)无法落地。

3.2 -> 鸿蒙生态的“全场景”补完

HarmonyOS 的设计理念是“一次开发,多端部署”。此前,手机、平板、PC 已经可以通过 OAID 实现广告标识的统一,但 TV 作为家庭场景的核心入口,长期游离于这套体系之外。此次更新意味着:

  • 技术栈统一:TV 应用开发者无需引入第三方 SDK 或自建设备指纹方案,直接使用系统级 @ohos.identifier.oaid 模块即可。
  • 跨端归因成为可能:广告监测平台现在可以在 TV 端获取 OAID,并将其与手机端的 OAID 进行匹配(前提是同一鸿蒙账号且用户允许关联),从而分析“大屏曝光 → 小屏转化”的路径。

3.3 -> 隐私保护的一致体验

新增 TV 支持并非简单地将接口复制过去,而是将手机端的权限管控模型完整平移到了大屏。用户在 TV 上同样可以:

  • 在设置中查看哪些应用申请了“跨应用关联访问权限”。
  • 对每个应用单独选择“允许”或“禁止”。
  • 重置 OAID,让所有应用重新获取新值。

这种一致性保障了用户在家庭场景下的隐私控制权,避免了“大屏无隐私”的尴尬。

4 -> 深度剖析:OAID 的权限机制与返回值逻辑

理解 OAID 的正确使用,必须深入它的权限模型。很多开发者容易混淆“权限配置”与“用户授权”的关系,下面结合文档详细拆解。

4.1 -> 权限名称的演变

在 HarmonyOS NEXT Developer Beta5 及更早版本中,该权限名为 ohos.permission.APP_TRACKING,对应设置项“应用跟踪访问权限”。从某个版本开始,它更名为 ohos.permission.APP_TRACKING_CONSENT,设置项也变为“跨应用关联访问权限”。名称变化反映了系统对权限用途的重新定位——强调的是“跨应用关联”这一具体行为,而非宽泛的“跟踪”,这有助于用户更准确地理解授权含义。

4.2 -> 权限配置与用户授权的联动

开发者在 module.json5 中配置权限只是第一步,真正决定 OAID 返回值的是用户最终的授权状态。文档给出了三种情况的返回值规则:

情况 权限配置 用户授权状态 OAID 返回值
1 已配置 允许 有效的 32 位 UUID
2 已配置 禁止 全 0 UUID (00000000-0000-0000-0000-000000000000)
3 未配置 (无授权弹窗) 全 0 UUID

关键理解点

  • 全 0 UUID 不是错误,而是设计使然。当用户拒绝或应用未申请权限时,系统返回全 0 值,应用应像处理普通字符串一样对待它,不能因为返回全 0 就重复弹窗或认为系统出错
  • 授权状态是持久的。用户一旦选择“禁止”,除非用户主动去设置中修改,否则后续调用一直返回全 0。这要求应用必须尊重用户的选择,不能频繁诱导授权。

4.3 -> 动态请求的时机与方式

官方推荐在需要用到 OAID 时才发起权限请求,而不是在应用启动时一股脑全要。例如,一个视频 App 可以在用户首次点击“个性化推荐”开关时触发授权弹窗。示例代码中使用了 AtManager.requestPermissionsFromUser 并检查结果,这正是符合预期的做法。

// 注意:context 必须是当前 Ability 的上下文
const atManager = abilityAccessCtrl.createAtManager();
const result = await atManager.requestPermissionsFromUser(context, ['ohos.permission.APP_TRACKING_CONSENT']);
const granted = result.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;

这段代码需要放在 UI 线程的合适位置,例如按钮的点击回调中,避免在页面启动时无交互弹窗(可能被系统拦截或用户反感)。

5 -> TV 设备集成 OAID 的完整实践指南

5.1 -> 环境确认

  • 设备要求:HarmonyOS 6.0.0(20)及以上版本的智慧屏、TV 盒子。
  • IDE 配置:DevEco Studio 中确保 compileSdkVersiontargetSdkVersion 不低于 6.0.0(对应 API version 12+?需要查证,但文档未明确,一般建议使用最新版本)。
  • 模块导入:统一使用 import { identifier } from '@kit.AdsKit';,TV、手机、平板代码完全一致。

5.2 -> 分步代码详解

下面给出一个更贴近实际场景的代码片段,它包含了权限请求、结果处理、OAID 获取、业务逻辑降级四个部分。

// OaidHelper.ets
import { abilityAccessCtrl, Context } from '@kit.AbilityKit';
import { identifier } from '@kit.AdsKit';
import { BusinessError } from '@kit.BasicServicesKit';

export class OaidHelper {
  /**
   * 尝试获取有效的 OAID
   * @param context 页面或 Ability 的上下文
   * @returns 如果用户授权,返回 OAID 字符串;否则返回 undefined,调用方需处理降级逻辑
   */
  static async tryGetValidOaid(context: Context): Promise<string | undefined> {
    // 1. 检查是否已经授权(可选步骤,避免重复弹窗)
    const atManager = abilityAccessCtrl.createAtManager();
    const isGranted = await atManager.checkPermissions(
      context, 
      ['ohos.permission.APP_TRACKING_CONSENT']
    );
    
    if (!isGranted) {
      // 2. 未授权,发起动态请求
      try {
        const result = await atManager.requestPermissionsFromUser(
          context,
          ['ohos.permission.APP_TRACKING_CONSENT']
        );
        const authResult = result.authResults[0];
        if (authResult !== abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
          console.info('User denied tracking permission');
          return undefined; // 用户拒绝,返回 undefined
        }
      } catch (err) {
        console.error(`Request permission failed: ${err.message}`);
        return undefined; // 请求过程异常,返回 undefined
      }
    }

    // 3. 已授权(或刚刚授权成功),获取 OAID
    try {
      const oaid = await identifier.getOAID();
      // 注意:即使授权了,仍可能返回全0,比如用户在授权后又去设置中关闭了权限
      // 但这种情况不会走到这里,因为上面的 check 会失败。但为了健壮,可以加一个判断
      if (oaid === '00000000-0000-0000-0000-000000000000') {
        console.info('OAID is all-zero, maybe permission turned off later');
        return undefined;
      }
      return oaid;
    } catch (error) {
      let bizErr = error as BusinessError;
      console.error(`getOAID failed, code: ${bizErr.code}, msg: ${bizErr.message}`);
      return undefined;
    }
  }
}

代码中的思考

  • 为什么先 checkPermissions?避免每次都弹出系统弹窗,如果用户之前已经拒绝,我们不应再次骚扰,而是直接走降级逻辑。
  • 为什么返回 undefined 而非全 0?全 0 在业务上代表“无有效标识”,但调用方可能需要区分“用户拒绝”和“系统错误”。此处用 undefined 表示“不可用”,调用方可以展示非个性化广告或使用备用标识(如会话 ID)。
  • 错误码处理BusinessError 包含 code 和 message,应至少记录日志,方便排查。

5.3 -> TV 特有场景的注意事项

  • 遥控器交互:权限弹窗必须适配焦点移动。确保弹窗上的“允许”和“禁止”按钮可以被方向键选中并确认。
  • 无屏设备? 部分 TV 盒子可能连接的是传统电视,没有触摸屏,但系统 UI 仍然会渲染,所以弹窗仍然会显示在屏幕上,用户可用遥控器操作,无特殊处理。
  • 多用户切换:TV 设备常有多用户(家庭成员),OAID 是设备级,与用户账号无关。切换用户不会重置 OAID,除非恢复出厂设置。
  • 性能考虑getOAID() 是轻量级调用,但权限请求涉及跨进程通信,应避免在 UI 渲染关键路径上同步等待。

6 -> 对开发者与广告生态的深远影响

6.1 -> 开发者的收益:少写代码,多份保障

过去,TV 应用若要实现广告归因,往往需要:

  • 自己生成设备指纹(易冲突、易被清理)。
  • 集成第三方 SDK(增加包体积、隐私合规风险)。

现在,系统级 OAID 提供了官方背书的能力:

  • 稳定:不会因为应用被卸载而改变。
  • 合规:权限模型与鸿蒙隐私框架深度整合,开发者无需自行设计隐私弹窗逻辑。
  • 统一:手机和 TV 代码复用,降低维护成本。

6.2 -> 广告监测的升级:跨屏归因不再是梦

对于广告平台和监测公司,TV 端 OAID 的加入补齐了最后一块拼图。一个典型的跨屏路径可能是:

  1. 用户在智慧屏上观看爱奇艺,看到某汽车广告(TV 端记录 OAID_A)。
  2. 用户随后在手机上打开淘宝(手机端记录 OAID_B)。
  3. 监测平台通过某种映射关系(如同一个鸿蒙账号、同 WiFi 下的设备聚类)将 OAID_A 与 OAID_B 关联,从而得出“该 TV 广告带来了手机端转化”的结论。

虽然这需要额外的技术方案(如 Device Mapping),但 OAID 提供了最基础的稳定锚点,让跨屏归因从“玄学”变成“可工程化实现”。

6.3 -> 用户隐私的再思考:大屏更需要“看得见的控制”

大屏通常摆放在家庭公共区域,隐私问题容易被忽视。OAID 的权限机制将控制权交还给用户:家庭成员可以清楚知道哪些应用在申请跟踪权限,并随时在设置中关闭。这种设计不仅符合 GDPR 等法规精神,也有助于培养用户对大屏应用的信任感。

7 -> 总结与展望

开放匿名设备标识服务新增支持 TV 设备,是 HarmonyOS 6.0 广告服务的一次低调但重要的升级。它没有炫酷的 UI 变化,却为整个鸿蒙生态的广告技术基础设施补齐了关键一环。

  • 对技术人而言,它意味着多端开发体验的进一步统一,以及跨屏技术探索的更多可能性。
  • 对产品经理而言,TV 端的用户行为终于有了一个可与手机联动的标识,未来可以设计更连贯的跨屏体验。
  • 对用户而言,大屏应用的行为将变得更加透明,隐私控制权不再缺席。

随着越来越多的 TV 应用适配 OAID,我们有望看到更精准的大屏广告投放、更科学的跨屏归因报告,以及一个更健康、更可持续的大屏应用生态。而这一切,都始于开发者的一次 identifier.getOAID() 调用。


感谢各位大佬支持!!!

互三啦!!!
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐