• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 开放匿名设备标识服务
2
3<!--Kit: Ads Kit-->
4<!--Subsystem: Advertising-->
5<!--Owner: @SukiEvas-->
6<!--Designer: @zhansf1988-->
7<!--Tester: @hongmei_may-->
8<!--Adviser: @RayShih-->
9
10## 获取OAID信息
11
12
13### 场景介绍
14
15开放匿名设备标识符(Open Anonymous Device Identifier, 以下简称OAID)是一种非永久性设备标识符。基于OAID,可以在保护用户个人数据隐私安全的前提下,向用户提供个性化广告,同时第三方监测平台也可以向广告主提供转化归因分析。
16
17媒体应用、广告平台、第三方监测平台等开发者可以获取设备上的OAID,基于OAID进行个性化广告推荐或广告转化归因分析。
18
19OAID是基于华为自有算法生成的32位类UUID(Universally Unique Identifier)标识符,格式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。
20
21OAID的特性:
22- OAID是设备级标识符,同一台设备上不同的App获取到的OAID值一样。
23- OAID的获取受应用的跨应用关联访问权限开关影响:当应用的跨应用关联访问权限开关开启时,该应用可获取到非全0的有效OAID;当应用的跨应用关联访问权限开关关闭时,该应用仅能获取到全0的OAID。
24- 同一台设备上首个应用开启应用跨应用关联访问权限开关时,会首次生成OAID。
25
26OAID会在下述场景中发生变化:
27- 用户将设备恢复出厂设置。
28- 用户操作重置OAID。
29
30### 接口说明
31
32| 接口名 | 描述 |
33| -------- | -------- |
34| <!--Del-->[<!--DelEnd-->getOAID<!--Del-->](../../reference/apis-ads-kit/js-apis-oaid.md#identifiergetoaid)<!--DelEnd-->(): Promise&lt;string&gt; | 获取OAID,通过Promise异步返回结果。 |
35| <!--Del-->[<!--DelEnd-->getOAID<!--Del-->](../../reference/apis-ads-kit/js-apis-oaid.md#identifiergetoaid-1)<!--DelEnd-->(callback:&nbsp;AsyncCallback&lt;string&gt;):&nbsp; void | 获取OAID,通过Callback回调返回值。 |
36
37> **说明:**
38> 调用getOAID接口需要申请ohos.permission.APP_TRACKING_CONSENT权限并获取用户授权,存在以下三种情况:<br/>
39> 1.如果应用已配置ohos.permission.APP_TRACKING_CONSENT权限,且跨应用关联访问权限为“允许”,则返回OAID。<br/>
40> 2.如果应用已配置ohos.permission.APP_TRACKING_CONSENT权限,且跨应用关联访问权限为“禁止”,则返回00000000-0000-0000-0000-000000000000。<br/>
41> 3.如果应用未配置ohos.permission.APP_TRACKING_CONSENT权限,则返回00000000-0000-0000-0000-000000000000。
42
43
44### 开发步骤
451. 在模块的module.json5文件中,申请跨应用关联权限[ohos.permission.APP_TRACKING_CONSENT](../../security/AccessToken/permissions-for-all-user.md#ohospermissionapp_tracking_consent),该权限为user_grant权限,当申请的权限为user_grant权限时,reason,abilities标签必填,配置方式参见[requestPermissions标签说明](../../security/AccessToken/declare-permissions.md#在配置文件中声明权限),示例代码如下所示:
46    ```ts
47    {
48      "module": {
49        "requestPermissions": [
50          {
51            "name": "ohos.permission.APP_TRACKING_CONSENT",
52            "reason": "$string:reason",
53            "usedScene": {
54              "abilities": [
55                "EntryFormAbility"
56              ],
57              "when": "inuse"
58            }
59          }
60        ]
61      }
62    }
63    ```
64
652. 应用在需要获取OAID信息时,应通过调用requestPermissionFromUser接口获取对应权限。其中context的获取方式参见[各类Context的获取方式](../../application-models/application-context-stage.md#context的获取方式)。示例代码如下所示:
66    ```ts
67    import { abilityAccessCtrl, PermissionRequestResult } from '@kit.AbilityKit';
68    import { identifier } from '@kit.AdsKit';
69    import { hilog } from '@kit.PerformanceAnalysisKit';
70
71    async function requestOAID(context: Context): Promise<string | undefined> {
72      let isPermissionGranted: boolean = false;
73      try {
74        const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
75        const result: PermissionRequestResult =
76          await atManager.requestPermissionsFromUser(context, ['ohos.permission.APP_TRACKING_CONSENT']);
77        isPermissionGranted = result.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;
78      } catch (err) {
79        hilog.error(0x0000, 'testTag', `Failed to request permission. Code is ${err.code}, message is ${err.message}`);
80      }
81      if (isPermissionGranted) {
82        hilog.info(0x0000, 'testTag', 'Succeeded in requesting permission');
83        try {
84          const oaid = await identifier.getOAID();
85          hilog.info(0x0000, 'testTag', 'Succeeded in getting OAID');
86          return oaid;
87        } catch (err) {
88          hilog.error(0x0000, 'testTag', `Failed to get OAID. Code is ${err.code}, message is ${err.message}`);
89        }
90      } else {
91        hilog.error(0x0000, 'testTag', 'Failed to request permission. User rejected');
92      }
93      return undefined;
94    }
95    ```