HarmonyOS 6.0 OAID 服务正式支持 TV 设备
HarmonyOS 6.0 正式在 TV 设备上支持开放匿名设备标识符(OAID)服务。该更新填补了大屏广告归因的空白,使智慧屏与移动端共享同一套 API 和权限模型。文章详细解析了 OAID 的生成机制、隐私保护设计(如跨应用关联访问权限)、以及集成实践指南。通过系统级能力,开发者无需引入第三方 SDK 即可实现跨屏归因,同时用户可在设置中管理授权状态,平衡了精准投放与隐私安全。

HarmonyOS 6.0 正式在 TV 设备上支持开放匿名设备标识符(OAID)服务。该更新填补了大屏广告归因的空白,使智慧屏与移动端共享同一套 API 和权限模型。文章详细解析了 OAID 的生成机制、隐私保护设计(如跨应用关联访问权限)、以及集成实践指南。通过系统级能力,开发者无需引入第三方 SDK 即可实现跨屏归因,同时用户可在设置中管理授权状态,平衡了精准投放与隐私安全。

在移动互联网时代,开放匿名设备标识符早已不是新鲜词。它作为 IMEI 等永久性设备标识的替代者,既支撑着广告主关心的精准投放与归因分析,又兼顾了用户对隐私保护的诉求。对于搭载 HarmonyOS 的手机、平板和 PC,OAID 服务已经稳定运行了多个版本。然而,大屏设备(智慧屏、TV 盒子)一直是这块拼图中缺失的一块——直到 HarmonyOS 6.0.0(20)版本出现。
根据华为开发者联盟官方文档的最新更新,开放匿名设备标识服务从该版本开始,正式新增支持 TV 设备。这意味着,无论是运行在手机上的短视频 App,还是运行在智慧屏上的视频应用,都可以用同一套 API、同一套权限模型来获取设备的匿名标识。本文将从技术背景、隐私设计、集成实践三个维度,深入拆解这次更新的细节,并探讨它对开发者、广告生态以及用户隐私的深远影响。
在广告技术领域,识别一个'设备'是投放与归因的基础。早期开发者习惯使用 IMEI、MAC 地址等硬件标识,但这些标识一旦泄露,用户将永久失去匿名性。随着各国隐私法规(如 GDPR、CCPA)的出台,以及操作系统对权限的收紧,永久性设备标识的获取路径基本被堵死。
OAID(Open Anonymous Device Identifier)正是在这种背景下诞生的。它是由华为定义的设备级标识符,具备以下核心特征:
官方文档指出,OAID 是基于华为自有算法生成的 32 位 UUID,格式形如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。这种格式既保证了全球唯一性,又避免了通过简单自增序列猜测设备数量的风险。
值得注意的是,OAID 的生成时机:并非设备出厂时预置,而是在同一台设备上第一个应用开启'跨应用关联访问权限'时动态生成。这种'按需生成'机制进一步减少了不必要的标识暴露。
在过去,TV 端(特别是传统电视)的广告效果衡量几乎是一片盲区。广告主只能依赖抽样收视率,无法知道某个用户是否看到广告后通过手机购买了商品。随着智慧屏的普及,TV 设备具备了应用安装、内容点播、电商下单等能力,但缺乏统一的匿名标识导致跨屏追踪(手机 → TV → 手机)无法落地。
HarmonyOS 的设计理念是'一次开发,多端部署'。此前,手机、平板、PC 已经可以通过 OAID 实现广告标识的统一,但 TV 作为家庭场景的核心入口,长期游离于这套体系之外。此次更新意味着:
@ohos.identifier.oaid 模块即可。新增 TV 支持并非简单地将接口复制过去,而是将手机端的权限管控模型完整平移到了大屏。用户在 TV 上同样可以:
这种一致性保障了用户在家庭场景下的隐私控制权,避免了'大屏无隐私'的尴尬。
理解 OAID 的正确使用,必须深入它的权限模型。很多开发者容易混淆'权限配置'与'用户授权'的关系,下面结合文档详细拆解。
在 HarmonyOS NEXT Developer Beta5 及更早版本中,该权限名为 ohos.permission.APP_TRACKING,对应设置项'应用跟踪访问权限'。从某个版本开始,它更名为 ohos.permission.APP_TRACKING_CONSENT,设置项也变为'跨应用关联访问权限'。名称变化反映了系统对权限用途的重新定位——强调的是'跨应用关联'这一具体行为,而非宽泛的'跟踪',这有助于用户更准确地理解授权含义。
开发者在 module.json5 中配置权限只是第一步,真正决定 OAID 返回值的是用户最终的授权状态。文档给出了三种情况的返回值规则:
| 情况 | 权限配置 | 用户授权状态 | OAID 返回值 |
|---|---|---|---|
| 1 | 已配置 | 允许 | 有效的 32 位 UUID |
| 2 | 已配置 | 禁止 | 全 0 UUID (00000000-0000-0000-0000-000000000000) |
| 3 | 未配置 | (无授权弹窗) | 全 0 UUID |
关键理解点:
官方推荐在需要用到 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 线程的合适位置,例如按钮的点击回调中,避免在页面启动时无交互弹窗(可能被系统拦截或用户反感)。
compileSdkVersion 和 targetSdkVersion 不低于 6.0.0(对应 API version 12+?需要查证,但文档未明确,一般建议使用最新版本)。import { identifier } from '@kit.AdsKit';,TV、手机、平板代码完全一致。下面给出一个更贴近实际场景的代码片段,它包含了权限请求、结果处理、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,应至少记录日志,方便排查。getOAID() 是轻量级调用,但权限请求涉及跨进程通信,应避免在 UI 渲染关键路径上同步等待。过去,TV 应用若要实现广告归因,往往需要:
现在,系统级 OAID 提供了官方背书的能力:
对于广告平台和监测公司,TV 端 OAID 的加入补齐了最后一块拼图。一个典型的跨屏路径可能是:
虽然这需要额外的技术方案(如 Device Mapping),但 OAID 提供了最基础的稳定锚点,让跨屏归因从'玄学'变成'可工程化实现'。
大屏通常摆放在家庭公共区域,隐私问题容易被忽视。OAID 的权限机制将控制权交还给用户:家庭成员可以清楚知道哪些应用在申请跟踪权限,并随时在设置中关闭。这种设计不仅符合 GDPR 等法规精神,也有助于培养用户对大屏应用的信任感。
开放匿名设备标识服务新增支持 TV 设备,是 HarmonyOS 6.0 广告服务的一次低调但重要的升级。它没有炫酷的 UI 变化,却为整个鸿蒙生态的广告技术基础设施补齐了关键一环。
随着越来越多的 TV 应用适配 OAID,我们有望看到更精准的大屏广告投放、更科学的跨屏归因报告,以及一个更健康、更可持续的大屏应用生态。而这一切,都始于开发者的一次 identifier.getOAID() 调用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online