在HarmonyOS NEXT中,OAID是专为广告场景设计的设备级标识符,但获取和使用它有严格的隐私合规要求——核心是必须获得用户授权,且用户随时可以重置或关闭。以下针对OAID的定位、获取方式及合规问题做详细拆解。


一、OAID是什么?它的核心特性与定位

OAID(Open Anonymous Device Identifier,开放匿名设备标识符)是HarmonyOS为保护用户隐私而设计的设备级广告标识符。理解它的定位,是正确使用它的前提:

  1. 设备级唯一性:在同一台鸿蒙设备上,不同的应用获取到的OAID值是完全一样的。这使得它适合用于跨应用的广告归因和用户画像分析。

  2. 用户可控的可重置性:OAID不是永久不变的。在两种情况下它会被重置:用户将设备恢复出厂设置;用户在系统设置中手动重置OAID。

  3. 严格的隐私授权:获取有效OAID的前提是用户明确授权。它受系统级的“跨应用关联访问权限”开关控制(在HarmonyOS NEXT上,旧版本曾叫“应用跟踪访问权限”)。

二、核心机制:跨应用关联权限与OAID的关系

这是开发者最容易踩坑的地方。应用能拿到什么样的OAID值,完全取决于用户是否授予了“跨应用关联访问权限”。

场景 跨应用关联权限状态 获取到的OAID值 说明
场景一 用户允许 有效的32位UUID(如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 可用于正常的广告业务。
场景二 用户禁止 全零值 00000000-0000-0000-0000-000000000000 应用无法获取真实OAID,业务需对此做兼容处理。
场景三 应用未申请APP_TRACKING_CONSENT权限 全零值 00000000-0000-0000-0000-000000000000 即使代码调用了getOAID接口,也返回全零。

关键点:用户可以通过“设置 > 隐私和安全 > 跨应用关联”路径,对单个应用或所有应用进行授权管理。这里还隐藏着一个重置OAID的技巧:将所有应用的关联权限关闭,再重新开启任意一个应用的权限,即可触发系统生成一个新的OAID。

三、开发实战:三步获取OAID

以下是基于官方文档整理的标准化集成步骤。

第一步:在 module.json5 中声明权限

这是静态配置,应用安装时系统会读取。注意ohos.permission.APP_TRACKING_CONSENT属于user_grant权限,必须在配置中填写reason(向用户说明申请原因)和usedScene

json

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.APP_TRACKING_CONSENT",
        "reason": "$string:reason", // 引用资源文件中的隐私说明
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "inuse" // 仅在前台使用时授权
        }
      }
    ]
  }
}

第二步:运行时动态请求授权

由于是user_grant权限,需要在代码中主动弹窗请求用户授权。务必先弹出应用的隐私协议说明,获得用户同意后再调用此接口,否则存在隐私合规风险。

typescript

import { abilityAccessCtrl, common, PermissionRequestResult } from '@kit.AbilityKit';
import { identifier } from '@kit.AdsKit';

async function requestOAID(context: common.Context) {
  const atManager = abilityAccessCtrl.createAtManager();
  try {
    // 请求权限,系统会弹出授权对话框
    const result: PermissionRequestResult = await atManager.requestPermissionsFromUser(
      context, 
      ['ohos.permission.APP_TRACKING_CONSENT']
    );
    
    if (result.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
      // 用户同意,去获取OAID
      getOAID();
    } else {
      // 用户拒绝,后续业务需处理全零OAID的情况
      console.info('用户拒绝了广告跟踪权限');
    }
  } catch (err) {
    console.error(`请求权限失败: ${err.code}, ${err.message}`);
  }
}

第三步:获取OAID信息

在权限被授予后,调用identifier.getOAID()获取标识符。

typescript

import { identifier } from '@kit.AdsKit';
import { BusinessError } from '@kit.BasicServicesKit';

async function getOAID() {
  try {
    const oaid: string = await identifier.getOAID();
    // 注意:这里拿到的是全零还是有效值,取决于用户在上一步是否真正在系统设置里允许了
    console.info(`获取到的OAID: ${oaid}`);
    // 业务逻辑...
  } catch (err) {
    const error = err as BusinessError;
    console.error(`获取OAID失败: ${error.code}, ${error.message}`);
  }
}

四、合规提醒

  1. 必须弹窗告知:在调用requestPermissionsFromUser之前,必须先在应用内以清晰的方式(如隐私弹窗)告知用户你将使用OAID进行个性化广告推荐等用途,并获得用户“同意”的点击操作。

  2. 处理全零值:当用户拒绝授权或关闭开关时,你的应用将只能拿到全零的OAID。请确保你的广告或归因SDK能正确处理这种情况,不要因为拿到无效值而崩溃或上报错误数据。

  3. 不要缓存:官方文档明确提示,开发者不可以缓存使用OAID信息,每次需要时都应重新获取,以保护用户隐私。

五、特殊情况:如需“卸载后不变”的设备ID怎么办?

OAID在用户重置或关闭跟踪时会变化,如果你需要的是一个即使应用被卸载重装也不会改变的ID(例如用于设备指纹),官方推荐的做法是:

利用 @ohos.security.asset (关键资产存储服务) 的 IS_PERSISTENT 属性。应用在首次启动时随机生成一个UUID,并存入关键资产中,并标记为持久化。即使应用被卸载,该数据依然保留在系统中,下次安装后可再次读取,从而实现“卸载不变”。但注意此方式生成的ID不能用于广告跟踪场景(不符合OAID的隐私规范),仅适用于业务内部数据统计。

Logo

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

更多推荐