鴻蒙HarmonyOS NEXT如何生成設備唯一碼

做過移動端開發的人應該都了解,需要給用戶設備生成一個唯一標識即dvid,做個性化推薦,用戶拉新,推送等用途。那么如何在鴻蒙HarmonyOS NEXT獲取設備的唯一標識符?

鴻蒙上標識符簡介

首先我們需要知道在鴻蒙上標識符的分類,主要為UDID、OAID、AAID、ODID。

UDID

UDID是什么

設備Udid,僅限系統應用使用。說明:數據長度為65字節。可作為設備唯一識別碼。需要權限:ohos.permission.sec.ACCESS_UDID。 這是設備唯一標識不錯的選擇,但是僅供系統使用,目前只能hdc命令可以獲取,至少填加證書添加設備使用。

示例:9D6AABD147XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXE5536412

如何獲取UDID

   hdc shell bm get --udid

OAID

OAID是什么

OAID(Open Anonymous Device Identifier )即開放匿名設備標識符,同一臺設備上不同的App獲取到的OAID值一樣。OAID的獲取受應用的跟蹤開關影響:當應用的跟蹤開關開啟時,該應用可獲取到非全0的有效OAID;當應用的跟蹤開關關閉時,該應用僅能獲取到全0的OAID。同一臺設備上首個應用開啟應用跟蹤開關時,會首次生成OAID。 OAID會在下述場景中發生變化,用戶恢復手機出廠設置。用戶操作重置OAID。

如何獲取OAID

    let odid: string = deviceInfo.ODID;

需要注意的是,需要在設置頁面搜索跨應用關聯,打開開關按鈕,首次啟動app的時候彈出OAID的權限彈框。

OAID

OAID是什么

OAID(Open Anonymous Device Identifier )即開放匿名設備標識符,同一臺設備上不同的App獲取到的OAID值一樣。OAID的獲取受應用的跟蹤開關影響:當應用的跟蹤開關開啟時,該應用可獲取到非全0的有效OAID;當應用的跟蹤開關關閉時,該應用僅能獲取到全0的OAID。同一臺設備上首個應用開啟應用跟蹤開關時,會首次生成OAID。 OAID會在下述場景中發生變化,用戶恢復手機出廠設置。用戶操作重置OAID。

如何獲取OAID

    let odid: string = deviceInfo.ODID;

需要注意的是,需要在設置頁面搜索跨應用關聯,打開開關按鈕,首次啟動app的時候彈出OAID的權限彈框。

AAID

AAID是什么

AAID(Anonymous Application Identifier)即應用匿名標識符,標識運行在移動智能終端設備上的應用實例,只有該應用實例才能訪問該標識符,它只存在于應用的安裝期,總長度36位。與無法重置的設備級硬件ID相比,AAID具有更好的隱私權屬性。 AAID會在包括但不限于下述場景中發生變化:應用卸載重裝,應用調用刪除AAID接口,用戶恢復出廠設置,用戶清除應用數據。

如何獲取AAID

export default class EntryAbility extends UIAbility {
  // 入參want與launchParam并未使用,為初始化項目時自帶參數
  async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
    // 獲取AAID
    try {
      const aaid: string = await AAID.getAAID();
      hilog.info(0x0000, 'testTag', 'Succeeded in getting AAID.');
    } catch (err) {
      let e: BusinessError = err as BusinessError;
      hilog.error(0x0000, 'testTag', 'Failed to get AAID: %{public}d %{public}s', e.code, e.message);
    }
  }
}

ODID

ODID是什么

ODID:開發者匿名設備標識符,它主要用于開放給開發者的設備標識,同一設備上運行的同一個開發者的應用,ODID相同。幫助開發者更好地理解用戶在不同應用間的行為,從而提供更個性化的服務和推薦。ODID具有以下特性: 同一設備上運行的同一個開發者的應用,ODID相同。 同一個設備上不同開發者的應用,ODID不同。 不同設備上同一個開發者的應用,ODID不同。 不同設備上不同開發者的應用,ODID不同。

如何獲取ODID

export function requestOAIDTrackingConsentPermissions(context: common.Context): void {
  const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  try {
    atManager.requestPermissionsFromUser(context, ["ohos.permission.APP_TRACKING_CONSENT"]).then((data) => {
      if (data.authResults[0] == 0) {
        hilog.info(0x0000, 'testTag', '%{public}s', 'succeeded in requesting permission');
        identifier.getOAID((err: BusinessError, data: string) => {
          if (err.code) {
            hilog.error(0x0000, 'testTag', '%{public}s', `get oaid failed, error: ${err.code} ${err.message}`);
          } else {
            const oaid: string = data;
            hilog.info(0x0000, 'testTag', '%{public}s', `succeeded in getting oaid by callback , oaid: ${oaid}`);
          }
        });
      } else {
        hilog.error(0x0000, 'testTag', '%{public}s', 'user rejected');
      }
    }).catch((err: BusinessError) => {
      hilog.error(0x0000, 'testTag', '%{public}s', `request permission failed, error: ${err.code} ${err.message}`);
    })
  } catch (err) {
    hilog.error(0x0000, 'testTag', '%{public}s', `catch err->${err.code}, ${err.message}`);
  }
}

鴻蒙上Asset Store Kit簡介

Asset Store Kit(關鍵資產存儲開發套件)包含了關鍵資產存儲服務(ASSET)開放的接口能力集合,提供了用戶短敏感數據的安全存儲及管理能力。其中,短敏感數據可以是密碼類(賬號/密碼)、Token類(應用憑據)、其他關鍵明文(如銀行卡號)等長度較短的用戶敏感數據。

為什么要說到資產?因為資產數據可以存到設備后,不會隨著APP的卸載而消失,只要沒有刪除該資產或者恢復出廠設置,資產數據就不會消失。因此可以結合資產,去生成設備的唯一標識符,類似iOS中KeyChain功能。

資產的增刪改查相關代碼


function AssetAdd(alias: string, secret: string, isForever: boolean) {
  if (isEmpty(alias) && isEmpty(secret)) {
    return
  }
  let attr: asset.AssetMap = new Map();
  attr.set(asset.Tag.SECRET, stringToArray(secret));
  attr.set(asset.Tag.ALIAS, stringToArray(alias));
  attr.set(asset.Tag.IS_PERSISTENT, isForever);
  attr.set(asset.Tag.ACCESSIBILITY, asset.Accessibility.DEVICE_FIRST_UNLOCKED);
  try {
    asset.add(attr).then(() => {
      console.info(`Asset added successfully.`);
    }).catch((error: BusinessError) => {
      console.error("AssetAdd error:" + JSON.stringify(error));
    })
  } catch (error) {
    console.error("AssetAdd error2:" + JSON.stringify(error));
  }
}

function AssetQuery(alias: string, callBack: AssetResCallBack) {
  if (isEmpty(alias)) {
    return
  }
  let query: asset.AssetMap = new Map();
  query.set(asset.Tag.ALIAS, stringToArray(alias)); // 指定了關鍵資產別名,最多查詢到一條滿足條件的關鍵資產
  query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL); // 此處表示需要返回關鍵資產的所有信息,即屬性+明文
  try {
    asset.query(query).then((res: Array<asset.AssetMap>) => {
      if (res && res.length > 0) {
        for (let i = 0; i < res.length; i++) {
          let secret: Uint8Array = res[i].get(asset.Tag.SECRET) as Uint8Array;
          let secretStr: string = arrayToString(secret);
          callBack.onSuccess(secretStr)
        }
      }
    }).catch(() => {
      console.error(`Failed to query Asset.`);
      callBack.onFail('')
    });
  } catch (error) {
    console.error(`Failed to query Asset.`);
    callBack.onFail(JSON.stringify(error))
  }

}

export interface AssetResCallBack {
  onSuccess: (content: string) => string
  onFail: (content: string) => string
}

function AssetDeleted(alias: string) {
  if (isEmpty(alias)) {
    return
  }
  let query: asset.AssetMap = new Map();
  query.set(asset.Tag.ALIAS, stringToArray(alias)); // 此處指定別名刪除單條數據,也可不指定別名刪除多條數據
  try {
    asset.remove(query).then(() => {
      console.info(`Asset removed successfully.`);
    }).catch(() => {
      console.error(`Failed to remove Asset.`);
    });
  } catch (error) {
    console.error(`Failed to remove Asset.`);
  }

}

function AssetUpdate(alias: string, secret: string) {
  if (isEmpty(alias) && isEmpty(secret)) {
    return
  }
  let query: asset.AssetMap = new Map();
  query.set(asset.Tag.ALIAS, stringToArray(alias));
  let attrsToUpdate: asset.AssetMap = new Map();
  attrsToUpdate.set(asset.Tag.SECRET, stringToArray(secret));
  try {
    asset.update(query, attrsToUpdate).then(() => {
      console.info(`Asset updated successfully.`);
    }).catch(() => {
      console.error(`Failed to update Asset.`);
    });
  } catch (error) {
    console.error(`Failed to update Asset.`);
  }
}

關鍵資產存儲服務(ASSET)錯誤碼

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/errorcode-asset-V5

設備的唯一標識符

方式一:根據自己的業務需求,結合鴻蒙上標識符作為設備的唯一標識符,存到資產中。

方式二:根據自己的規則可以將字符串加密之后,存到資產中,生成設備的唯一標識符。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容