【HarmonyOS NEXT】鸿蒙应用OAID广告标识ID设置设备唯一标识
在HarmonyOS NEXT中,OAID是专为广告场景设计的设备级标识符,但获取和使用它有严格的隐私合规要求——核心是必须获得用户授权,且用户随时可以重置或关闭。以下针对OAID的定位、获取方式及合规问题做详细拆解。
一、OAID是什么?它的核心特性与定位
OAID(Open Anonymous Device Identifier,开放匿名设备标识符)是HarmonyOS为保护用户隐私而设计的设备级广告标识符。理解它的定位,是正确使用它的前提:
-
设备级唯一性:在同一台鸿蒙设备上,不同的应用获取到的OAID值是完全一样的。这使得它适合用于跨应用的广告归因和用户画像分析。
-
用户可控的可重置性:OAID不是永久不变的。在两种情况下它会被重置:用户将设备恢复出厂设置;用户在系统设置中手动重置OAID。
-
严格的隐私授权:获取有效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}`);
}
}
四、合规提醒
-
必须弹窗告知:在调用
requestPermissionsFromUser之前,必须先在应用内以清晰的方式(如隐私弹窗)告知用户你将使用OAID进行个性化广告推荐等用途,并获得用户“同意”的点击操作。 -
处理全零值:当用户拒绝授权或关闭开关时,你的应用将只能拿到全零的OAID。请确保你的广告或归因SDK能正确处理这种情况,不要因为拿到无效值而崩溃或上报错误数据。
-
不要缓存:官方文档明确提示,开发者不可以缓存使用OAID信息,每次需要时都应重新获取,以保护用户隐私。
五、特殊情况:如需“卸载后不变”的设备ID怎么办?
OAID在用户重置或关闭跟踪时会变化,如果你需要的是一个即使应用被卸载重装也不会改变的ID(例如用于设备指纹),官方推荐的做法是:
利用 @ohos.security.asset (关键资产存储服务) 的 IS_PERSISTENT 属性。应用在首次启动时随机生成一个UUID,并存入关键资产中,并标记为持久化。即使应用被卸载,该数据依然保留在系统中,下次安装后可再次读取,从而实现“卸载不变”。但注意此方式生成的ID不能用于广告跟踪场景(不符合OAID的隐私规范),仅适用于业务内部数据统计。
更多推荐

所有评论(0)