HarmonyOS NEXT 获取AAID并保存到Asset中,避免卸载重装后改变
在鸿蒙原生开发中,需要import { AAID } from **********'才能正常使用AAID对应的接口let aaid: string = await AAID.getAAID();获取广告标识aaid,但这里获取到的aaid在下面集中场景下是会改变的
1、 应用卸载重装。
2、应用调用AAID.deleteAAID()接口删除AAID。
3、用户恢复出厂设置。
4、用户清除应用数据。
为了避免以上几种场景导致我们获取的aaid改变,影响业务需求,可以使用Asset对应的功能来持久化保存,这里只介绍asset保存的几种方式,想了解更多可以查看https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-asset-V13
调用asset相应接口需要先import { asset } from "@kit.AssetStoreKit",然后将我们需要保存的值放在asset.AssetMap对象中,在调用asset.addSync(attr)进行存储;查询时,需要我们传入保存值时的key,在asset中叫别名alias,然后调用asset.querySync(query);
具体代码示例如下
import { AAID } from **********'; let aaid = assetQuerySync('gr_harmony_aaid'); if (aaid === undefined || aaid.length === 0) { aaid = await AAID.getAAID(); assetAddSync('gr_harmony_aaid', aaid); } import { asset } from "@kit.AssetStoreKit"; import { BusinessError } from "@kit.BasicServicesKit"; import { util } from "@kit.ArkTS"; const TAG: string = 'DDDataSave'; function stringToArray(str: string): Uint8Array { let textEncoder = new util.TextEncoder(); return textEncoder.encodeInto(str); } function arrayToString(arr: Uint8Array): string { let textDecoder = util.TextDecoder.create("utf-8", { ignoreBOM: true }); let str = textDecoder.decodeToString(arr, { stream: false }); return str; } export function assetQuerySync(alias: string): string | undefined { let deviceTypeStr: string | undefined = undefined; let query: asset.AssetMap = new Map(); // 指定了关键资产别名,最多查询到一条满足条件的关键资产 query.set(asset.Tag.ALIAS, stringToArray(alias)); // 返回关键资产属性,不含关键资产明文。 query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ATTRIBUTES); try { let res = asset.querySync(query); for (let i = 0; i < res.length; i++) { //如果查询的结果与之匹配,说明已经登陆过了 let alias = res[i].get(asset.Tag.ALIAS) as Uint8Array; //查询出存储的别名alias console.info(TAG, `asset query alias:${arrayToString(alias)}`); let idStr = res[i].get(asset.Tag.SECRET) as Uint8Array; console.info(TAG, `asset query alias:${arrayToString(idStr)}`); let deviceType = res[i].get(asset.Tag.DATA_LABEL_NORMAL_1) as Uint8Array; deviceTypeStr = arrayToString(deviceType); console.info(TAG, `asset query alias:${arrayToString(deviceType)}`); } } catch (err) { console.info(TAG, `asset query fail err:${JSON.stringify(err)}`); } return deviceTypeStr; } export function assetAddSync(alias: string, value: string) { console.info(TAG, `asset add begin alias:${alias}, value:${value}`); let attr: asset.AssetMap = new Map(); // SECRET: 关键资产别名,每条关键资产的唯一索引 attr.set(asset.Tag.ALIAS, stringToArray(alias)); attr.set(asset.Tag.SECRET, stringToArray(value)); // DATA_LABEL_NORMAL_1: 关键资产附属信息,内容由业务自定义且无完整性保护。 attr.set(asset.Tag.DATA_LABEL_NORMAL_1, stringToArray(value)); // IS_PERSISTENT: 在应用卸载时是否需要保留关键资产。 attr.set(asset.Tag.IS_PERSISTENT, true); try { // 新增一条关键资产 asset.addSync(attr); console.info(TAG, 'asset add success') } catch (error) { let err = error as BusinessError; console.info(TAG, `try Failed to remove Asset. Code is ${err.code}, message is ${err.message}`); } }
----------------- end ---------------
后面会继续补充不足之处。
#商务##Ark-TS语言#